我正在尝试使用Apache Commons CSV从CSV文件(我从EBay的MIP服务器下载)访问数据但是我遇到以下错误:
CSVParser csvParser = null;
String selectedCategoryIDFieldName = "Selected Category ID";
try {
Reader reader = Files.newBufferedReader(Paths.get(CSVFile));
csvParser = new CSVParser(reader, CSVFormat.DEFAULT
.withHeader("SKU", "Locale", "Title", "Channel", selectedCategoryIDFieldName)
.withIgnoreHeaderCase()
.withTrim()
.withSkipHeaderRecord(true));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (csvParser != null) {
List<CSVRecord> csvRecords = csvParser.getRecords();
for (CSVRecord csvRecord : csvRecords) {
// Accessing values by the names assigned to each column
try {
long currentRecordNumber = csvRecord.getRecordNumber();
String SKU = csvRecord.get("SKU");
String categoryID = csvRecord.get(selectedCategoryIDFieldName);
// ^^ this line throws `IllegalArgumentException`
System.out.println("Current record number: " + currentRecordNumber);
System.out.println("SKU - > " + SKU);
System.out.println("categoyrID -> " + categoryID);
} catch (Exception e) {
e.printStackTrace();
}
}
我不太确定原因,因为该文件明确包含此索引。我的CSV文件如下所示:
我正在使用以下代码访问文件:
for (CSVRecord csvRecord : csvRecords)
我在SO周围搜索,我找到的最接近的问题是here,但它与我的问题无关,因为格式在保存之前/之后完全相同(换句话说,我看不到格式有问题,就像其他用户提问一样。)
更新:我刚刚在/-/LabelName
循环的第二次迭代中意识到这个错误表面(该文件只包含一条记录)。但是,如果CSV文件中只有一条记录,我仍然不明白为什么它会迭代两次..为什么它只按类别ID而不是SKU列表示?
答案 0 :(得分:0)
记录中必须有一些空格.2。在记事本或记事本++中打开文件。
我不熟悉apache commons csv所以它可能不是最佳解决方案
for (CSVRecord csvRecord : csvRecords) {
if(csvRecord.size() >= csvParser.getHeaderMap.size()){ <--- add this if condition
答案 1 :(得分:0)
如果行的尾随值为空,则它们可能会与其分隔符一起被省略,从而导致标题的大小大于行值的大小。这是非常有效的(?)CSV 文件。要调整您的解析器,请使用 <html>
<head>
<title>footlocker.dk</title>
<style>
#cmsg{animation: A 1.5s;}@keyframes A{0%{opacity:0;}99%{opacity:0;}100%{opacity:1;}}
</style>
</head>
<body style="margin:0">
<p id="cmsg">Please enable JS and disable any ad blocker</p>
<script>
var dd={'cid':'AHrlqAAAAAMA2k9UvgFgVkIAk04eSQ==','hsh':'A55FBF4311ED6F1BF9911EB71931D5','t':'fe','r':'b','s':17434,'host':'geo.captcha-delivery.com'}</script><script src="https://ct.captcha-delivery.com/c.js">
</script>
</body>
</html>
方法:
isSet()
答案 2 :(得分:-1)
也许给univocity-parsers一个好处,因为它可以很好地处理损坏的CSV(包括在这里和那里处理意外的空格),它也比commons-csv 3 times faster。它还应该使您的代码更清晰,因为您不必在任何地方放置try / catch块。
CsvParserSettings settings = new CsvParserSettings();
settings.detectFormatAutomatically();
settings.setHeaders("SKU", "Locale", "Title", "Channel", selectedCategoryIDFieldName);
// settings.setHeaderExtractionEnabled(true); //use this if the headers are in the input
CsvParser parser = new CsvParser(settings);
List<Record> records = parser.parseAllRecords(new File("/path/to/your.csv"));
希望这有帮助。
免责声明:我是这个图书馆的作者。它是开源和免费的(Apache 2.0许可证)