通常CSV文件使用制表符分隔符,如何配置Univocity Parsers .csv解析器以允许制表符分隔符?

时间:2015-11-13 14:57:10

标签: parsing csv

CSV文件通常使用制表符分隔符,如何配置Univocity分析器以便以下内容可以使用制表符分隔符?:

CsvParserSettings parserSettings = new CsvParserSettings();

当解析由制表符分隔的.csv文件时,虽然Univocity Parsers有一个TSVreader,但是有多个设置实例会产生编码障碍。

代码和堆栈跟踪如下。

非常感谢任何帮助。

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);
    parserSettings.getFormat().setDelimiter('\t');

    // 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("list4.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();


}


}

堆栈追踪:

    Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:78)
at java.io.InputStreamReader.<init>(InputStreamReader.java:97)
at parse.Controller.getReader(Controller.java:34)
at parse.Controller.columnSelection(Controller.java:107)
... 56 more

以下是要解析的文件:

"REVIEW_DATE"   "AUTHOR"    "ISBN"  "DISCOUNTED_PRICE"
"1985/01/21"    "Douglas Adams" 345391802   5.95
"1990/01/12"    "Douglas Hofstadter"    465026567   9.95
"1998/07/15"    "Timothy ""The Parser"" Campbell"   968411304   18.99
"1999/12/03"    "Richard Friedman"  60630353    5.95
"2001/09/19"    "Karen Armstrong"   345384563   9.95
"2002/06/23"    "David Jones"   198504691   9.95
"2002/06/23"    "Julian Jaynes" 618057072   12.5
"2003/09/30"    "Scott Adams"   740721909   4.95
"2004/10/04"    "Benjamin Radcliff" 804818088   4.95
"2004/10/04"    "Randel Helms"  879755725   4.5

1 个答案:

答案 0 :(得分:1)

问题来自getReader方法。它没有在类路径中找到该文件。

此行正在生成null

this.getClass().getResourceAsStream(relativePath)

也许你应该使用它(注意文件名的前导斜杠):

parser.parse(getReader("/list4.csv"));

另请注意,TSV解析器是一种不同的实现。 TSV不仅仅是带有制表符分隔符的CSV(如果在你的情况下它可以工作,这一切都很好)。请记住,尝试使用CSV解析器读取TSV是一个坏主意,因为'\ n'或'\ t'等字符可能会被转义为'\'和'n'的实际序列。当CSV解析器读取此字符时,您将获得2个字符('\'+'n')而不是新行字符('\ n')