Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将数据从CSV解析为数组_Java_Csv_Stringtokenizer - Fatal编程技术网

在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.*

我正在尝试将CSV文件导入到一个数组中,以便在Java程序中使用。CSV文件已成功导入自身,输出显示在终端上,但会抛出错误:

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解析器。