gpt4 book ai didi

java - 为什么 CSVWriter 和 CSVReader 使用不同的默认转义字符?

转载 作者:太空宇宙 更新时间:2023-11-04 11:09:51 25 4
gpt4 key购买 nike

这是我正在使用的代码片段:

    StringWriter writer = new StringWriter();
CSVWriter csvwriter = new CSVWriter(writer);
String[] originalValues = new String[2];
originalValues[0] = "t\\est";
originalValues[1] = "t\\est";
System.out.println("Original values: " + originalValues[0] +"," + originalValues[1]);
csvwriter.writeNext(originalValues);

csvwriter.close();
CSVReader csvReader = new CSVReader(new StringReader(writer.toString()));
String[] resultingValues = csvReader.readNext();
System.out.println("Resulting values: " + resultingValues[0] +"," + resultingValues[1]);

上述代码片段的输出是:

Original values: t\est,t\est
Resulting values: test,test

转换后反斜杠('\')字符消失!!!

通过一些基本分析,我认为发生这种情况是因为 CSVReader 使用反斜杠 ('\') 作为默认转义字符,而 CSVWriter 使用双引号 ('"') 作为默认转义字符。

默认行为不一致的原因是什么?

为了解决上述问题,我设法找到以下两个解决方案:

1) 用空字符覆盖 CSVReader 的默认转义字符:

 CSVParser csvParser = new CSVParserBuilder().withEscapeChar('\0').build();
CSVReader csvReader = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(csvParser).build();

2) 使用严格遵循 RFC4180 的 RFC4180Parser标准:

RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build();
CSVReader csvReader = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(rfc4180Parser).build();

使用上述任何方法会对其他角色产生副作用吗?

另外为什么 RFC4180Parser 不是默认解析器?难道只是为了保持向后兼容性,因为 RFC4180Parser 在以后的版本中引入了?

最佳答案

我认为我们正在考虑两种类型的转义。

1) 在 csv 中转义双引号:

test,"Monitor 24"", Samsung"
test,"Monitor 24\", Samsung" // Linux style

由于我们在第二个字段中有一个逗号,因此该字段必须用双引号引起来。该字段内的任何双引号都必须使用 ""\" 进行转义。

2) \ 也是 general escape character ,例如 \t (制表符)或 \n (换行符)。

由于 'e' 不在要转义的字符列表中,因此 \ 会被忽略并删除。

因此,如果您编写 "t\\\\est",该文件将包含 "t\\est" (转义反斜杠)并在读取后显示 "t\est"。或者编写 "\\test" 可能会在读取后显示 tab"est"

要在读取后保留 \,您确实必须以某种方式告诉解析器忽略这些序列,但当前的行为对我来说并不不一致 - 实际上它们都将 \ 视为转义字符。

关于java - 为什么 CSVWriter 和 CSVReader 使用不同的默认转义字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46139735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com