从CSV文件初始化对象数组

时间:2012-09-27 04:10:06

标签: java arrays file-io

这个问题需要一些解释,我会尽量简洁:

我正在尝试初始化Can对象数组,这些对象只有2个字段(两个字符串):名称,制造商

我试图通过使用以下格式读取CSV文件来初始化字段:

西红柿,亨氏

Legumes,Jerry

(行之间没有空格,出于某种原因,它的格式与此网站上的格式相同)

每行中的第一个字符串是我想要成为名称的值,第二个是制造商。

所以我创建了一个方法来读取CSV的每一行,它将每一行传递给一个tokenizer方法来提取单个值:

private void readFile (String inFilename) {
    FileInputStream fileStrm = null;
    InputStreamReader rdr;
    BufferedReader bufRdr;
    int lineNum;
    String line;
        try {
            fileStrm = new FileInputStream(inFilename);
            rdr = new InputStreamReader(fileStrm);
            bufRdr = new BufferedReader(rdr);
            lineNum = 0;
            line = bufRdr.readLine();
            while {line != null) {
                lineNum++;
                processLine(line);  //passes line to tokenizer
                line = bufRdr.readLine();
                 }
            fileStrm.close();
        }
        catch (IOException e) {
            if (fileStrm != null) {
                try { fileStrm.close(); } catch (IOException ex2) { }
             }
             System.out.println("Error in file processing: " + e.getMessage());
        }   
    }

这些行被传递给这个tokenizer方法:

private String processLine(String csvRow) {
    String thisToken = null;
    StringTokenizer strTok;
    strTok = new StringTokenizer(csvRow, ",");
        while (strTok.hasMoreTokens()) {
            thisToken = strTok.nextToken();
        }
}

这就是我有点陷入困境的地方。要初始化我的数组,我想我需要一个for循环,比如

for (int i=0; i<=array.length;i++)
    {
    array[i].name = readFile("filename.csv");
    array[i].manufacturer = readFile("filename.csv");
    }

但显然这不起作用。谁能建议我怎么做呢?我宁愿保持代码大部分完整,并使用现有代码找出解决方案。

由于

1 个答案:

答案 0 :(得分:0)

第一件事: -

您正在调用processLine(line);,但没有返回此方法的token读取。所以,此方法在engulped中获得的令牌只有..所以,你应该从该方法中返回一些东西..

第二: -

array[i].name = readFile("filename.csv");
array[i].manufacturer = readFile("filename.csv");

在上面的代码中,你每次都为这两个属性调用readFile() ..所以,即使你返回了somthing,这两个属性也会被初始化为相同的值。因为每次你开始阅读从头开始文件..

第三件事: -

实际上你的上面的代码不会编译..因为你将readFile()的值(实际上没有返回任何东西)分配给数组..所以给这个方法一个返回类型..它会是String ..并返回令牌阅读..

编辑: - * 我建议您使用String类的split()方法。Tokenizer is not needed here, for just拆分around a single逗号(,)`

此外,您可以使用ArrayList而不是使用数组,您可以在其中动态添加新创建的object。这样,您就不必fix the size数组..(这就是你想要的,因为你不知道你的文件中有多少行?)

以下是您可以执行的操作:

  • 从某处调用方法readFile,可能是main()

    readFile("filename.csv")
    
  • readFile()方法中,您可以迭代文件以创建ArrayList,如下所示: -

    List<Can> yourList = new ArrayList<>();
    while ((line = reader.readLine()) != null) {
    
        String[] wordRead = line.split(',');
        yourList.add(new Can(wordRead[0], wordRead[1]));
    }
    

我认为,Can是您在课堂上所说的课程名称..