Parsing 当标题不在第一行时,Univocity解析器如何读取.csv文件?

Parsing 当标题不在第一行时,Univocity解析器如何读取.csv文件?,parsing,csv,Parsing,Csv,当标题不在第一行时,Univocity解析器如何读取.csv文件 如果.csv文件中的第一行不是标题,则会出现错误 下面是代码和堆栈跟踪 任何帮助都将不胜感激 import com.univocity.parsers.csv.CsvParserSettings; import com.univocity.parsers.common.processor.*; import com.univocity.parsers.csv.*; import java.io.InputStreamReader;

当标题不在第一行时,Univocity解析器如何读取.csv文件

如果.csv文件中的第一行不是标题,则会出现错误

下面是代码和堆栈跟踪

任何帮助都将不胜感激

import com.univocity.parsers.csv.CsvParserSettings;
import com.univocity.parsers.common.processor.*;
import com.univocity.parsers.csv.*;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.lang.IllegalStateException;
import java.lang.String;
import java.util.List;


public class UnivocityParsers {

public Reader getReader(String relativePath) {
    try {
        return new InputStreamReader(this.getClass().getResourceAsStream(relativePath), "Windows-1252");
    } catch (UnsupportedEncodingException e) {
        throw new IllegalStateException("Unable to read input", e);
    }
}


public void columnSelection() {
    RowListProcessor rowProcessor = new RowListProcessor();
    CsvParserSettings parserSettings = new CsvParserSettings();

    parserSettings.setRowProcessor(rowProcessor);
    parserSettings.setHeaderExtractionEnabled(true);
    parserSettings.setLineSeparatorDetectionEnabled(true);
    parserSettings.setSkipEmptyLines(true);

    // Here we select only the columns "Price", "Year" and "Make".
    // The parser just skips the other fields
    parserSettings.selectFields("AUTHOR", "ISBN");

    CsvParser parser = new CsvParser(parserSettings);
    parser.parse(getReader("list2.csv"));

    List<String[]> rows = rowProcessor.getRows();

    String[] strings = rows.get(0);

    System.out.print(strings[0]);

}


public static void main(String arg[]) {

    UnivocityParsers univocityParsers = new UnivocityParsers();

    univocityParsers.columnSelection();


}


}
以下是正在分析的文件:

List of books by Author - Created today
"REVIEW_DATE","AUTHOR","ISBN","DISCOUNTED_PRICE"
"1985/01/21","Douglas Adams",0345391802,5.95
"1990/01/12","Douglas Hofstadter",0465026567,9.95
"1998/07/15","Timothy ""The Parser"" Campbell",0968411304,18.99
"1999/12/03","Richard Friedman",0060630353,5.95
"2001/09/19","Karen Armstrong",0345384563,9.95
"2002/06/23","David Jones",0198504691,9.95
"2002/06/23","Julian Jaynes",0618057072,12.50
"2003/09/30","Scott Adams",0740721909,4.95
"2004/10/04","Benjamin Radcliff",0804818088,4.95
"2004/10/04","Randel Helms",0879755725,4.50

从今天起,在2.0.0-SNAPSHOT上,您可以执行以下操作:

settings.setNumberOfRowsToSkip(1);
在1.5.6版上,您可以跳过第一行并正确获取标题:

RowListProcessor rowProcessor = new RowListProcessor(){
        @Override
        public void processStarted(ParsingContext context) {
            super.processStarted(context);
            context.skipLines(1);
        }
    };
另一种方法是在输入文件(如果您可以控制文件的生成方式)的第一行添加注释,方法是在要放弃的行的开头添加一个
#

#List of books by Author - Created today

使用univocity-parsers-1.5.6.jar尝试上面的解决方案代码时,出现错误:
java.lang.IllegalStateException:未知字段名:[作者,isbn,审阅日期]。可用字段为:[1985/01/21,道格拉斯·亚当斯,0345391802,5.95]
。通过将该快照中的pom.xml添加到IntelliJ项目来尝试2.0.0-SNAPSHOT解决方案时:
错误:(53,23)java:找不到符号:方法setNumberOfRowsToSkip(int)位置:com.univocity.parsers.csv.CsvParserSettings类型的变量parserSettings
。此外,IntelliJ没有找到pom.xml插件:
maven gpg插件
。1.5.6解决方案有效(即覆盖
processStartedMethod
),我用您发布的代码亲自测试了它。显然,您还应用了其他更改,它抓取了第三行作为标题,而不是第二行。在2.0.0-SNAPSHOT版本上,您不需要复制pom文件,这将永远不会起作用。您可以更新自己的pom.xml,也可以从[)中获取jar,我将
univocity-parsers-2.0.0-20151111.095007-18.jar
放入项目库,但是,当我调用新方法时:
parserSettings.setNumberOfRowsToSkip(1);
出现错误:
无法解析方法setNumberOfRowsToSkip(int)“
。抱歉,我发送了一个错误的链接。这是您需要的:您好,此链接:实际上指向404。是否有可用的工作链接?
#List of books by Author - Created today