Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 标记化CSV行转义双引号_Java_Regex_Csv - Fatal编程技术网

Java 标记化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

我有一个逗号分隔的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 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的库:

嗯,前两个是最受欢迎的

以下是Apache Commons 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
(".*"|[^,"]+|(?<=,)(?=,))|^(?=,)|(?<=,)$