CSV阅读器的危险-Java

CSV阅读器的危险-Java,java,arrays,csv,Java,Arrays,Csv,我试图读取一个CSV文件,并通过java中的二维数组将每行分割成4个不同的整数值 我使用的是OpenCSV3.8 为了简单起见,假设这是CSV文件的内容(完整文件包含306行,如下所示): 我可以很好地读取文件,并且可以使用System.out.println将每个值输出到控制台,如下所示: 76 67 0 1 77 65 3 1 78 65 1 2 85 58 2 2 不幸的是,我下面的代码旨在将每个值输入到单独的数组元素中,只保存文件最后一行中的4个值 这是我的java代码(不介意iaDa

我试图读取一个CSV文件,并通过java中的二维数组将每行分割成4个不同的整数值

我使用的是OpenCSV3.8

为了简单起见,假设这是CSV文件的内容(完整文件包含306行,如下所示):

我可以很好地读取文件,并且可以使用
System.out.println
将每个值输出到控制台,如下所示:

76
67
0
1
77
65
3
1
78
65
1
2
85
58
2
2
不幸的是,我下面的代码旨在将每个值输入到单独的数组元素中,只保存文件最后一行中的4个值

这是我的java代码(不介意iaData数组的大小,它的大小是针对完整的CSV文件的):

不幸的是,情况并非如此,它实际上输出以下内容(文件最后一行中的4个值):


我的代码有什么问题,以至于
iaData[0][0/1/2/3]
实际上输出了我希望在
iaData[**3**][0/1/2/3]
中保存的内容?

对于每一行,您都开始使用第一个索引I=0编写代码。 因此,对于每一行,您都会覆盖前一行中的所有信息:

       while ((nextLine = reader.readNext()) != null)
        {           
            for (i = 0; i <= 305; i++)
            {
                for (x = 0; x <= 3; x++)
                {
                    iaData[i][x] = Integer.parseInt(nextLine[x]);
                }
            }
        }
while((nextLine=reader.readNext())!=null)
{           

对于(i=0;i您当前的问题是,对于每一行,您都在逐行和逐列迭代整个2D数组。这会导致只有最后一行将反映当前读取的行

相反,行计数器
i
只能在从CSV文件中读取另一行后递增。当前,您正在对同一行反复递增
i

// Read one line at a time
int i = 0;
while ((nextLine = reader.readNext()) != null) {
    for (x = 0; x <= 3; x++) {
        iaData[i][x] = Integer.parseInt(nextLine[x]);
    }
    // increment i once, after having processed a single line from the file
    ++i;
}
//一次读取一行
int i=0;
而((nextLine=reader.readNext())!=null){

对于(x=0;x,代码中有各种各样的东西根本没有意义

首先,您正在初始化nextLine以容纳1250行

String [] nextLine = new String[1250];
但是,您正在将一条单条线推入:

        while ((nextLine = reader.readNext()) != null)
要么你不需要第一个陈述,要么第二个陈述有问题

对于您正在观察的实际bug:同样的代码也要写395次,这对您没有帮助。这就是您的代码所做的;因为对于您阅读的每一行,您都要这样做

for (i = 0; i <= 305; i++)
{
   for (x = 0; x <= 3; x++)
   {
      hiaData[i][x] = Integer.parseInt(nextLine[x]);
你继续写

line i
line i...
因此,最后,你只得到了最后一行

我的建议是:不要自己做那些依赖于大小的手动迭代,只需使用

List<String[]> allLines = csvreader.readAll();
List allLines=csvreader.readAll();
4个值,395行…也就是说什么都没有。只需一次调用就可以将所有这些内容都放入内存

意思:库为您提供了一个很好的抽象,需要您一行代码来读取所有内容。您选择编写20、30行代码。这就是问题所在:您编写的代码越多,产生bug的机会就越高

最后一点:不要直接在源代码中使用305、4、1205等数字。如果有的话,请使用常量。但是在循环中硬编码这些值…非常糟糕的做法-当例如5列输入时,您必须更改处理输入的每个和任何位置,而不是4列。

问题:

一,

二,

另一个问题是,只迭代第一个元素的元素:

        for (int z = 0; z <= 3; z++)
        {
        System.out.println(iaData[0][z] + "\n");
        }

for(int z=0;z如果程序要将整个文件读入一个数组…是否只需将其读入内存,然后再进行处理

像这样:

import au.com.bytecode.opencsv.CSVReader;

import java.io.IOException;
import java.io.StringReader;
import java.util.List;

public class Csv {

    public static void main(String[] args) throws IOException {
        String string = "76,67,0,1\n" +
                "77,65,3,1\n" +
                "78,65,1,2\n" +
                "83,58,2,2";

        CSVReader reader = new CSVReader(new StringReader(string),',');
        List<String[]> lines = reader.readAll();

        for (String[] entries : lines) {
            for (String entry:  entries) {
                System.out.println(Integer.parseInt(entry));
            }
        }
    }

}

使用调试器来找到它谢谢,我很高兴它这么简单,因为我使用了太多的循环。谢谢你的建议:使用常量。我当时没有考虑过这一点;我主要是想让代码正常工作。这意味着我自己可能不会考虑它。
for (i = 0; i <= 305; i++)
{
   for (x = 0; x <= 3; x++)
   {
      hiaData[i][x] = Integer.parseInt(nextLine[x]);
line1
line2
...
line i
line i...
List<String[]> allLines = csvreader.readAll();
for (i = 0; i <= 305; i++)
        int i = 0;
        while ((nextLine = reader.readNext()) != null)
        {           
            //for (i = 0; i <= 305; i++)
            //{
                for (x = 0; x <= 3; x++)
                {
                    iaData[i++][x] = Integer.parseInt(nextLine[x]);
                }
            //}
        }
        for (int z = 0; z <= 3; z++)
        {
        System.out.println(iaData[0][z] + "\n");
        }
        for (i = 0; i < iaData.length; i++)
        {
            for (int z = 0; z <= 3; z++)
            {
            System.out.println(iaData[i][z] + "\n");
            }
            System.out.println("");
        }
import au.com.bytecode.opencsv.CSVReader;

import java.io.IOException;
import java.io.StringReader;
import java.util.List;

public class Csv {

    public static void main(String[] args) throws IOException {
        String string = "76,67,0,1\n" +
                "77,65,3,1\n" +
                "78,65,1,2\n" +
                "83,58,2,2";

        CSVReader reader = new CSVReader(new StringReader(string),',');
        List<String[]> lines = reader.readAll();

        for (String[] entries : lines) {
            for (String entry:  entries) {
                System.out.println(Integer.parseInt(entry));
            }
        }
    }

}
    String[] entries;
    while((entries = reader.readNext()) != null) {
        for (String entry : entries) {
            System.out.println(Integer.parseInt(entry));
        }
    }