读取分号分隔的csv
Posted
技术标签:
【中文标题】读取分号分隔的csv【英文标题】:Reading semicolon delimited csv 【发布时间】:2018-04-01 10:18:11 【问题描述】:我有下面的代码块,它使用 OpenCSV 读取 CSV 文件并存储第 7 列。我面临的问题是我在 CSV 文件中使用 ;
作为分隔符,但它也使用 ,
作为分隔符。我怎样才能避免这种情况?
无法将 "" 放入 CSV,因为我们从客户端获取了不可编辑的文件。
CSVReader reader = null;
String[] nextCsvLine = new String[50];
String splitBy = ";";
int count = 0;
try
StringReader sr = new StringReader(new String(in, offset, len));
reader = new CSVReader(sr);
while ((nextCsvLine = reader.readNext()) != null)
for (String linewithsemicolon : nextCsvLine)
log.debug("Line read : "+linewithsemicolon);
String[] b = linewithsemicolon.split(splitBy);
if (count==0)
count++;
continue;
else
detailItems.add(b[7]);
log.debug("7th position: "+b[7]);
count++;
【问题讨论】:
这是什么语言?它看起来像 Java。您需要使用编程语言标记您的问题 - 请参阅问题下方的“编辑”链接。 是的,它的 JAVA 很抱歉忘记链接。 您发布的代码对逗号根本没有反应。请提供minimal reproducible example。 为了简化我的问题,我是否有可能只阅读到第 8 列然后跳到下一行?行可能有 30 列甚至更多,但我只想阅读第 8 列并移至下一行。 请注意,for (String linewithsemicolon : nextCsvLine)
已经表明您的问题:nextCsvLine
表示表示为元素集合或数组的行,而 linewithsemicolon
表示您正在处理 one 元素作为一条线。这不太合适,应该已经暗示了读者的问题。正如已经回答的那样,您可以为 CSVReader 提供分隔符,但如果这不可能,那么使用 CSVReader 将是一个值得商榷的决定。
【参考方案1】:
使用带有OpenCSV分隔符的重载版本
CSVReader(reader, ';')
更新(感谢@Matt)- 更好地使用:
CSVReaderBuilder(reader)
.withCSVParser(CSVParserBuilder()
.withSeparator(';')
.build())
我认为count
ing 做的有点不对:
try (CSVReader reader = new CSVReader(sr, ';'))
String[] nextCsvLine;
while ((nextCsvLine = reader.readNext()) != null)
int count = 0;
for (String field: nextCsvLine)
log.debug("Line read : "+linewithsemicolon);
if (count == 6) // 7th column
detailItems.add(field);
log.debug("7th position: " + field);
count++;
而不是你可以做的 for 循环:
if (nextCsvLine.length > 6)
detailItems.add(nextCsvLine[6]);
第七个字段的索引应该是 6。
【讨论】:
你的意思是不是像 reader = new CSVReader(sr,';');这在分号的第一个实例之后中断,之后不再读取。 请参阅 zetcode.com 的 ReadNumbers2.java。我会在答案中添加一些代码。 仅供参考:从最新版本开始,OpenCSV 使用构建器模式,该模式将带有分隔符的构造函数呈现为不推荐使用的第二个参数。现在是CSVReaderBuilder(reader).withCSVParser(CSVParserBuilder().withSeparator(';').build())
见opencsv.sourceforge.net/apidocs/com/opencsv/CSVReader.html
@Matt 我冒昧地将代码移动到答案中以防止被弃用的代码副本。以上是关于读取分号分隔的csv的主要内容,如果未能解决你的问题,请参考以下文章