在Java中将数据从CSV解析为数组
我正在尝试将CSV文件导入到一个数组中,以便在Java程序中使用。CSV文件已成功导入自身,输出显示在终端上,但会抛出错误:在Java中将数据从CSV解析为数组,java,csv,stringtokenizer,Java,Csv,Stringtokenizer,我正在尝试将CSV文件导入到一个数组中,以便在Java程序中使用。CSV文件已成功导入自身,输出显示在终端上,但会抛出错误: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at CompareCSV.main(CompareCSV.java:19) 最后。此外,当我尝试调用数组中的元素时,它也显示了相同的错误。我的代码如下: import java.io.*; import java.util.*
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at CompareCSV.main(CompareCSV.java:19)
最后。此外,当我尝试调用数组中的元素时,它也显示了相同的错误。我的代码如下:
import java.io.*;
import java.util.*;
public class CompareCSV {
public static void main(String[] args) {
String fileName = "sampledata1.csv";
try {
BufferedReader br = new BufferedReader( new FileReader(fileName));
String strLine = null;
StringTokenizer st = null;
int lineNumber = 0, tokenNumber = 0;
while((fileName = br.readLine()) != null) {
lineNumber++;
String[] result = fileName.split(",");
for (int x=0; x<result.length; x++) {
System.out.println(result[x]);
}
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.*;
导入java.util.*;
公共类比较{
公共静态void main(字符串[]args){
字符串fileName=“sampledata1.csv”;
试一试{
BufferedReader br=新的BufferedReader(新文件读取器(文件名));
字符串strLine=null;
StringTokenizer st=null;
int lineNumber=0,tokenNumber=0;
而((fileName=br.readLine())!=null){
lineNumber++;
String[]result=fileName.split(“,”);
对于(int x=0;x您最好使用正确的CSV解析器,而不是自己破解错误的解析器:
CSV不是一种简单的格式(是的,一行可以包含一个不分隔两段数据的,
).看起来像是您的假设,文件中的一行始终有三列并非对所有行都适用。请用以下行替换for循环语句以消除异常,并查看发生的原因:
for (int x=0; x<result.length; x++)
for(intx=0;x这是上述问题的答案
public class Readline {
/**
* @param args
*/
public static void main(String[] args) {
String fileName = "C:/Users/karthikrao/Desktop/cvsFile.csv";
ArrayList<Integer> margins = new ArrayList<Integer>();
BufferedReader br;
String line, token;
int i;
try {
br = new BufferedReader(new FileReader(fileName));
try {
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ",\"");
i = 0;
while (st.hasMoreTokens()) {
token = st.nextToken();
if (margins.size() <= i) {
margins.add((Integer) token.length());
} else {
margins.set(
i,
Math.max(margins.get(i),
(Integer) token.length()));
}
i++;
}
}
br = new BufferedReader(new FileReader(fileName));
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ",\"");
i = 0;
while (st.hasMoreTokens()) {
token = st.nextToken();
System.out.print(token);
for (int j = 0; j < margins.get(i) - token.length(); j++) {
System.out.print(" ");
}
System.out.print("|");
i++;
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
公共类读线{
/**
*@param args
*/
公共静态void main(字符串[]args){
String fileName=“C:/Users/karthikrao/Desktop/cvsFile.csv”;
ArrayList页边距=新的ArrayList();
缓冲剂;
字符串行、令牌;
int i;
试一试{
br=新的BufferedReader(新的文件读取器(文件名));
试一试{
而((line=br.readLine())!=null){
StringTokenizer st=新的StringTokenizer(行“,\”);
i=0;
而(st.hasMoreTokens()){
token=st.nextToken();
如果(margins.size()我建议您不要在有这么多优秀库的情况下重新发明轮子。请尝试使用以下代码snippt作为参考:
public static void main(String[] args) throws FileNotFoundException {
/**
* ---------------------------------------
* Read CSV rows into 2-dimensional array
* ---------------------------------------
*/
// 1st, creates a CSV parser with the configs
CsvParser parser = new CsvParser(new CsvParserSettings());
// 2nd, parses all rows from the CSV file into a 2-dimensional array
List<String[]> resolvedData = parser.parseAll(new FileReader("/examples/example.csv"));
// 3rd, process the 2-dimensional array with business logic
// ......
}
publicstaticvoidmain(字符串[]args)抛出FileNotFoundException{
/**
* ---------------------------------------
*将CSV行读入二维数组
* ---------------------------------------
*/
//首先,使用configs创建一个CSV解析器
CsvParser parser=new-CsvParser(new-CsvParserSettings());
//第二,将CSV文件中的所有行解析为二维数组
List resolvedData=parser.parseAll(新文件读取器(“/examples/example.csv”);
//第三,用业务逻辑处理二维数组
// ......
}
如您所见,完成将csv数据解析为数组的任务只需要两行代码。此外,该库提供了解析csv数据的完整功能列表,性能优异。为什么在for循环中使用硬编码常量而不是结果大小?您可以根据需要使用现有的Java csv API:或例如。@Perception是对的,你确定你在读了一行之后有3个值吗?@Perception:我这样做是为了暂时测试我是否会继续命中异常,实际上应该有什么结果。length@Benoit:谢谢,我会查出来的!您如何将opencsv包调用到Java程序中?我以前尝试过实现它,现在已经实现了编辑:刚刚找到/examples目录。应该能够解析一个简单的csv文件,而不用使用一些“csv4j”"库…互联网上的其他阅读资料表明,提取CSV库可能更容易。但是,是的,如果您知道如何轻松地将一个简单的CSV文件解析为一个可以被Java程序的其余部分访问的数组,我将非常感激!@Andreas_D:但是为什么要在上面浪费时间呢?CSV解析不能通过String.split完成,因为分隔符,如果不是用“'s@Roger:没有什么比下载库并让它完成工作更容易的了。代码中的具体问题是,尽管长度比这短,但迭代次数最多为3次,但还远远没有CSV解析器。