为什么Scanner会读取CSV文件的其他所有行? Java的

时间:2016-04-12 05:37:52

标签: java csv

我正在读取CSV文件并将每个分隔元素放入二维数组中。代码如下所示:

public DataProcess(String filename, String[][] contents, int n) {//n is 6 for contents, 5 for fiveMinContents
        Scanner fileReader = null;
        try {
            fileReader = new Scanner(new File(filename));
        } catch (FileNotFoundException ex) {
            System.out.println(ex + " FILE NOT FOUND ");
        }
        fileReader.useDelimiter(",");
        int rowIndex = 0;
        while (fileReader.hasNext()) { 
            for (int j = 0; j < n; j++) {
                contents[rowIndex][j] = fileReader.next();
                 System.out.println("At (" + rowIndex +", "+j+"): " +
                 contents[rowIndex][j]);
            }
            rowIndex++;
            fileReader.nextLine();
        }
    }

我不确定为什么它会读取此特定CSV文件的所有其他行,因为这是以这种方式读取的文件2/2。第一个读得很好,但现在这个跳过其他每一行。为什么它适用于一个而不是另一个?我在Eclipse的最新更新上运行它。

我也检查了this回答,但没有帮助。

3 个答案:

答案 0 :(得分:2)

因为循环的最后一行读取一行并丢弃它。你需要像

这样的东西
while (fileReader.hasNextLine()) { 
    String line = fileReader.nextLine();
    contents[rowIndex] = fileReader.split(",\\s*");
    System.out.println("At (" + rowIndex + "): "
            + Arrays.toString(contents[rowIndex]));
    rowIndex++;
}

您也可以通过一次调用打印多维数组,如

System.out.println(Arrays.deepToString(contents));

答案 1 :(得分:2)

虽然这种方法可能适用于您,但它并不是最佳选择。 Java有预制的CSV阅读器。一个例子是commons-csv

Reader in = new FileReader("path/to/file.csv");
Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(in);
for (CSVRecord record : records) {
    String date = record.get(1);
    String time = record.get(2);
    // and so on, so forth
}

您的类路径中必须有small number of dependencies。希望有所帮助。

答案 2 :(得分:-1)

我发现了这个问题。

首先,我建议使用建议的外部库。

问题在于,由于第二个文件正在读取整行,而第一个CSV文件正在读取我想要的内容,但是文件末尾有一列我忽略了。必须有一种方法,CSV文件的结构,行的末尾有不同的分隔符或沿着这些行的东西 - 不确定。为了解决这个问题,我刚刚在第二个文件中添加了一个额外的列,我没有读到它;就在那里。

简而言之,请使用外部CSV阅读器库。如果您不想这样做,那么只需在文件的最后一列之后直接添加一列,不要读它。