Java 标记化CSV行转义双引号
我有一个逗号分隔的CSV行:Java 标记化CSV行转义双引号,java,regex,csv,Java,Regex,Csv,我有一个逗号分隔的CSV行: 1000102257,b,N,159999,3,4545656,4,,,,"6,125% NORDRHEIN-WESTF.LA.SCHA.R.239 21.12. "18" 将包含逗号分隔符(,)作为内容的标记用双引号转义 如您所见,最后一个标记在双引号之间被隔离,但另一个双引号出现(“18”),这破坏了标记化机制: "6,125% NORDRHEIN-WESTF.LA.SCHA.R.239 21.12. "18" 这是我在代码行中拆分令牌的代码: public
1000102257,b,N,159999,3,4545656,4,,,,"6,125% NORDRHEIN-WESTF.LA.SCHA.R.239 21.12. "18"
将包含逗号分隔符(,)作为内容的标记用双引号转义
如您所见,最后一个标记在双引号之间被隔离,但另一个双引号出现(“18”),这破坏了标记化机制:
"6,125% NORDRHEIN-WESTF.LA.SCHA.R.239 21.12. "18"
这是我在代码行中拆分令牌的代码:
public static void main(String[] args) {
final String cvsSplitterEscapingQuotes = ",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)";
String strLine = "1000102257,b,N,159999,3,4545656,4,,,,\"6,125% NORDRHEIN-WESTF.LA.SCHA.R.239 21.12. \"18\"";
String[] tokens = strLine.split(cvsSplitterEscapingQuotes, -1);
}
如何转义引号内的中间双引号?不要自己解析CSV,使用库。即使像CSV这样简单的格式也有细微差别:字段可以用引号转义,也可以不转义,文件可以有或没有头等等。此外,您还必须测试和维护您编写的代码。因此,编写ss代码和重用库是很好的 Java中有很多用于CSV的库:
final Reader in=new FileReader(“countries.csv”);
final Iterable records=CSVFormat.DEFAULT.parse(in);
对于(final CSVRecord record:records){//只需通过foreach循环对记录进行迭代即可。所有解析都由您自己处理
String populationString=record.get(7);//索引是基于零的
String populationString=record.get(“population”);//或者,如果文件有头,您可以直接使用它们
…//你想对人口做什么就做什么
}
看看它有多简单!它将与其他解析器类似。只需忽略不在逗号或换行符后面的双引号即可。此未替换的正则表达式已测试:
(“*”|[^,“]+|)(?谢谢。您的解决方案很有效,但正如@madhead建议的那样,我选择了一个库。
(".*"|[^,"]+|(?<=,)(?=,))
( // Start the match
".*" // Greedily match anything in quotes
|[^,"]+ // Or, greedily match anything that isn't a comma or quote
|(?<=,)(?=,) // Or, look behind for a comma and ahead for a comma
// (the empty match)
) // End match.
|^(?=,) // At the beginning, look forward for a comma
|(?<=,)$ // Look back for a comma, and at the end
(".*"|[^,"]+|(?<=,)(?=,))|^(?=,)|(?<=,)$