Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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_Parsing_Csv_Dto_Jcsv - Fatal编程技术网

Java 解析CSV时如何获得正确的字符串数组?

Java 解析CSV时如何获得正确的字符串数组?,java,parsing,csv,dto,jcsv,Java,Parsing,Csv,Dto,Jcsv,我正在尝试将CSV解析为指定类型。当我解析它时,它说数据参数的长度是1。这是不正确的。我试着删除换行符,但它仍然显示1。我只是错过了一些显而易见的东西吗 这是我的输入字符串csvString变量 "Symbol","Last","Chg(%)","Vol", INTC,23.90,1.06,28419200, GE,26.83,0.19,22707700, PFE,31.88,-0.03,17036200, MRK,49.83,0.50,11565500, T,35.41,0.37,114713

我正在尝试将CSV解析为指定类型。当我解析它时,它说数据参数的长度是1。这是不正确的。我试着删除换行符,但它仍然显示1。我只是错过了一些显而易见的东西吗

这是我的输入字符串csvString变量

"Symbol","Last","Chg(%)","Vol",
INTC,23.90,1.06,28419200,
GE,26.83,0.19,22707700,
PFE,31.88,-0.03,17036200,
MRK,49.83,0.50,11565500,
T,35.41,0.37,11471300,
这是解析器

  public class BuySignalParser implements CSVEntryParser<BuySignal> {
  @Override
  public BuySignal parseEntry(String... data) {

    // console says "Length 1"
    System.out.println("Length " + data.length);

    if (data.length != 4) {
      throw new IllegalArgumentException("data is not a valid BuySignal record");
    }

    String symbol = data[0];
    double last = Double.parseDouble(data[1]);
    double change = Double.parseDouble(data[2]);
    double volume = Double.parseDouble(data[3]);

    return new BuySignal(symbol, last, change, volume);
  }
}
公共类BuySignalParser实现CSVEntryParser{
@凌驾
公共购买信号解析条目(字符串…数据){
//控制台显示“长度1”
System.out.println(“长度”+数据长度);
如果(data.length!=4){
抛出新的IllegalArgumentException(“数据不是有效的BuySignal记录”);
}
字符串符号=数据[0];
double last=double.parseDouble(数据[1]);
double change=double.parseDouble(数据[2]);
double volume=double.parseDouble(数据[3]);
返回新的购买信号(符号、最后一次、更改、音量);
}
}
这就是我使用解析器的地方(就在示例中)

CSVReader cReader=new-CSVReaderBuilder(new-StringReader(csvString)).entryParser(new-BuySignalParser()).build();
List signals=cReader.readAll();

行尾不应该有逗号。通常有单元格分隔符(逗号)和行分隔符(换行符)。将逗号放在行尾,看起来整个文件就是一条长线。

jcsv允许使用不同的分隔符。默认值为分号。使用
CSVStrategy.UK\u DEFAULT
可以使用逗号

此外,还有四个逗号,通常表示五个值。您可能需要删除结尾处的分隔符

我不知道如何让jcsv忽略第一行

我通常使用解析CSV文件,虽然jcsv看起来不错,但以下是使用CVSHelper的方法:

Reader reader = new InputStreamReader(new FileInputStream("persons.csv"), "UTF-8");

//bring in the first line with the headers if you want them
List<String> firstRow = CSVHelper.parseLine(reader);

List<String> dataRow = CSVHelper.parseLine(reader);
while (dataRow!=null) {

    ...put your code here to construct your objects from the strings

    dataRow = CSVHelper.parseLine(reader);
}
Reader Reader=新的InputStreamReader(新文件InputStream(“persons.csv”),“UTF-8”);
//如果需要的话,请在第一行输入标题
List firstRow=CSVHelper.parseLine(读卡器);
List dataRow=CSVHelper.parseLine(读卡器);
while(dataRow!=null){
…将代码放在此处,以从字符串构造对象
dataRow=CSVHelper.parseLine(读卡器);
}

是不是说长度是5?在异常中包括实际长度值。每行有4个逗号,这可能意味着5个值……jcsv允许您更改分隔符。文档中的示例是分号。你确定它设置为使用逗号吗?啊,CSVStrategy.UK_默认值太有趣了,我在其他语言中使用CSV已经有一段时间了,从来没有遇到过分号作为分隔符。下面是我使用的CSV解析:似乎问题有两个:分隔符不正确,后面的逗号不符合规范(由外部源提供)?因此,在我的初始stringbuilder中,我必须消除尾部。一旦我改为使用逗号,表示长度为5=),所以我做了两个修复。。。现在我看到它试图包含列定义。有没有办法在解析时忽略这一点,或者在读取数据时只需手动执行?我将更新问题。猜.NET真的把我宠坏了=)好吧,就像我说的,我用它来解析CSV,因为你自己写循环,在这种情况下,你只需跳过第一个条目。jcsv没有任何明显的跳过第一行的方法,但是,似乎它一定要处理这个问题。
Reader reader = new InputStreamReader(new FileInputStream("persons.csv"), "UTF-8");

//bring in the first line with the headers if you want them
List<String> firstRow = CSVHelper.parseLine(reader);

List<String> dataRow = CSVHelper.parseLine(reader);
while (dataRow!=null) {

    ...put your code here to construct your objects from the strings

    dataRow = CSVHelper.parseLine(reader);
}