我正在使用au.com.bytecode.opencsv.CSVReader读取一个csv文件并逐个打印所有记录。代码表现得很奇怪。它将一组线条打印在一起作为一条线。然后它再次正确打印下一组线。
请从上面的链接下载CSV文件。我的代码正在考虑第一行 - 从第一个非标题行到位于内容以下的行上方的行:
12/4/13:将AO更改为首席财务官。“,”2016年7月18日“,
另外,我的第一个数据行包含\“在其中一个字段中。你可以用Cntrl + F和\来找到它。如果我从字段中删除\,它工作正常。现在我的问题是CSVReader用于结束上面指定的第一行的逻辑是什么?为什么它在低于内容的行之前采用行尾:
12/4/13:将AO更改为首席财务官。“,”2016年7月18日“,
从'12 / 4/13 .........'开始新的一行。此外,下面的各行完全被视为单独的行。
代码供您参考:
csvReader reader = new CSVReader(new FileReader(fileNameWithLocation), ',', '"', 1);
ColumnPositionMappingStrategy<DomainObj> mappingStrategy =
new ColumnPositionMappingStrategy<DomainObj>();
mappingStrategy.setType(DomainObj.class);
String[] nextLine;
while ((nextLine = reader.readNext()) != null)
{
if (nextLine != null)
log.debug("Next line : " + Arrays.toString(nextLine));
}
答案 0 :(得分:0)
同样发布在opencsv support request。
原因是它读取多行是我们需要允许在字段中有新行的数据。因此,当您到达行尾并且未关闭字段(没有关闭引号)时,引用数据中的opencsv将读取下一行并继续填充该行数据。您可以通过查看列出的行上方的行来查看文件中的情况 - 放在一起您将看到它确实会生成一行数据。
,,&#34; 440063&#34;&#34; DSH440063B&#34;&#34; 39066&#34;&#34; DSH&#34;&#34;真&#34 ;, &#34; 01/01 / 2014&#34;,&#34; 10/01/2016&#34;,&#34; 12&#34; ,,,&#34; JOHNSON CITY MEDICAL CENTER&#34;,& #34;区域癌症中心@约翰逊城医疗中心&#34;,#34; 2205 Pavilion Drive&#34;,&#34; Suite 101&#34;,&#34; Kingsport&#34;,&#34; TN& #34;,&#34; 37660&#34;,&#34; 4641&#34; ,,,,,,,,,,,,,,,,,,#34; Shane E. Hilton&#34; ,&#34;首席财务官&#34;,&#34; 4234311038&#34; ,,&#34; Trish Tanner&#34;,&#34; Corp。消费者健康Svcs&#34;,#34; 4233023532&#34; ,,&#34; TRISH TANNER&#34;,&#34; SYSTEM SERVICES DIRECTOR,PHARMACY SERVICES&#34;,&#34; 10/10 / 2013&#34;&#34; 4233023532&#34; ,,,,,,,,,,,,,,&#34; 08/07/2015&#34;&#34;假&#34 ;, ,&#34; 12/3/13我不确定AO / SBO是否处于足够高的水平,请参考 12/4/13:将AO更改为首席财务官。&#34;,&#34; 07/18/2016&#34;,
请注意,上面的行以pls chk但没有closequote结束,因此opencsv将读取下一行并将数据的第一部分附加到下一行。
作为数据一部分的引号必须转义 - 因此\&#34;。
希望有所帮助。
斯科特康威:)
答案 1 :(得分:-1)
反斜杠会转义引号,因此引号字符被视为内容而不是分隔符。读者将"
放入其缓冲区并继续阅读,直至达到下一个引号。