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
答案 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')