【问题标题】:How to create an array of objects that have strings from a CSV file of strings?如何从字符串的 CSV 文件创建具有字符串的对象数组?
【发布时间】:2014-02-15 23:46:25
【问题描述】:

我有一些从 csv 文件中读取的代码,该文件中包含很多人的姓氏、名字和出生年份。在 csv 文件中是这样的:

nameLast    nameFirst   birthYear
Santos      Valerio       1972
Tekulve      Kent         1947
Valentine    Fred         1935

我有一个类叫 Human,human 类也有这三个值。我想创建一个人类类的数组,并将 csv 文件中的所有数据传递给它。这样,如果 [0] 处的数组的第一个实例将在其中包含三个值,两个用于名称,一个用于年份。这是我到目前为止的代码:

package testing.csv.files;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Human {

    String lastName;
    String firstName;
    String birthYear;

    public static void main(String[] args) {
        //.csv comma separated values
        String fileName = "C:/Users/Owner/Desktop/Data.csv";
        File file = new File(fileName); // TODO: read about File Names
        try {
            Scanner inputStream = new Scanner(file);
            inputStream.next(); //Ignore first line of titles
            while (inputStream.hasNext()){
                String data = inputStream.next(); // gets a whole line
                String[] values = data.split(",");
                System.out.println(values[2]);
            }
            inputStream.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我这里的内容目前将打印出所有的出生年份,因为 values[2] 是出生年份。我以为我可以换行

   String[] values = data.split(",");

阅读

   Human[] values = data.split(",");

然后它会自动将值 lastName、firstName 和birthyear 分配到数组中每个对象的正确位置。但是,这样做只会产生错误消息

   incompatible types: String[] cannot be converted to Human[]

我也尝试将上面的行从

  String data = inputStream.next(); // gets a whole line

  Human data = inputStream.next(); // gets a whole line

但我收到相同的错误消息。

那我做错了什么?也许我没有像我想的那样正确定义类,或者我的方法有什么问题?请让我知道你的想法。

【问题讨论】:

    标签: java arrays class object csv


    【解决方案1】:

    首先,您的 Human 类需要一个构造函数。插入以下方法。

    public Human(String[] str) {
      lastName = str[0];
      firstName = str[1];
      birthYear = str[2];
    }
    

    现在,您可以使用 Human 对象来代替字符串数组

    Human someHuman = new Human(data.split(","));
    

    【讨论】:

    • 这是一个坏主意,因为它违反了一个非常基本的面向对象的原则,即关注点分离。出生年份也应该是一个整数。
    【解决方案2】:

    String 类中的方法split 返回一个字符串数组,而不是Human 数组。要创建Human 的数组,您需要将从split 返回的字符串数组解析为人类需要的值。

    class Human{
        String firstName;
        String lastName;
        int birthYear;
        public Human(String first, String last, int birthYear){
            this.firstName = first;
            this.lastName = last;
            this.birthYear = birthYear;
        }
    }
    int numHumansInCSV = //How many humans are in your file?
    Human[] humanArray = new Human[numHumansInCSV];
    int index = 0;
    while (inputStream.hasNext()){
        String data = inputStream.next(); // gets a whole line
        String[] values = data.split(",");
        String lastName = values[0];
        String firstName = values[1];
        int birthYear = Integer.parseInt(values[2]);
        Human human = new Human(firstName, lastName, birthYear);
        //put human in human array.
        humanArray[index] = human;
        index += 1;
    }
    

    如果您可以使用List 之类的数据结构,那将比数组更合适,因为您可能不知道您的 CSV 文件包含多少人。

    另外,这个解析代码应该在它自己的类中。如果我正在写这篇文章,我会这样做。

    public class HumanCSVReader{
    
        public List<Human> read(String csvFile, boolean expectHeader) throws IOException{
            File file = new File(csvFile);
            Scanner scanner = new Scanner(file);
            int lineNumber = 0;
            List<Human> humans = new List<Human>();
            while(scanner.hasNextLine()){
                if(expectHeader && lineNumber==0){
                    ++lineNumber;
                    continue;
                }
    
                String line = scanner.nextLine();
                String csv = line.split(",");
                if(csv.length!=3)
                    throw new IOException("Bad input in "+csvFile+", line "+lineNumber);
                String firstName = list[0];
                String lastName = list[1];
                try{
                    int birthYear = Integer.parseInt(list[2]);
                }catch(NumberFormatException e){
                    throw new IOException("Bad birth year in "+csvFile+", line "+lineNumber);
                }
                Human human = new Human(fistName, lastName, birthYear);
                humans.add(human);
                ++lineNumber;
            }
            return humans;
        }
    }
    

    只需使用它来加载您的人类数组。它甚至可以处理一些基本的验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多