CSV阅读器的危险-Java
我试图读取一个CSV文件,并通过java中的二维数组将每行分割成4个不同的整数值 我使用的是OpenCSV3.8 为了简单起见,假设这是CSV文件的内容(完整文件包含306行,如下所示): 我可以很好地读取文件,并且可以使用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
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));
}
}