当前位置: 首页 > 知识库问答 >
问题:

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

高山
2023-03-14

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

    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个答案

杨乐意
2023-03-14

我想我们在这里看到的是两种类型的逃跑。

1)转义CSV中的双引号:

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

由于我们在第二个字段中有一个逗号,所以该字段必须用双引号包围。然后必须用“”\“转义该字段中的任何双引号。

2)\也是一般的转义字符,例如\t(制表符)或\n(换行符)。

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

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

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

 类似资料:
  • 我想使用opencsv中的CSVReader来读取一串逗号分隔的值。在过去,我已经将该读取器用于多部分文件,其中将完成以下操作:CSV reader reader = new CSV reader(new InputStreamReader(filename . getinputstream()); 这对于一个多部分文件来说很好,但是如果我只是想传递一个字符串,例如一行CSV,我就找不到解决方案。

  • 大家好,Netbeans(像大多数IDE一样)使用点(.)组织小数点,对吗?我不知道为什么,但我的IDE开始使用逗号(,)来组织小数点。。。甚至控制台中显示的输出也使用逗号。如何将其更改回默认设置并再次开始使用小数点? PS:当我尝试使用点和小数位数(例如4.5)输入数字时,我会收到以下错误消息:

  • Windows中使用的默认unicode字符编码是什么?特别是在Windows编程中(Win32和WinRT)。当我在WinAPI中编程时,“char”映射到1字节字符存储,“wchar_t”映射到2字节字符存储。如果UTF-16用4个字节编码所有超过65536的字符,那么Windows如何将这些字符映射为“wchar_t”数据类型?我知道我的问题不够清楚,但我希望你能理解我的一些担忧。非常感谢!

  • 问题内容: 为什么这段代码会引发SyntaxError? 尽管以下代码段运行时没有可见错误: 问题答案: 必须将所有必需的参数放在任何默认参数之前。仅仅是因为它们是强制性的,而默认参数不是必需的。从语法上讲,如果允许使用混合模式,解释器将 无法 决定哪些值与哪些参数匹配。如果参数的输入顺序不正确,则会引发A : 让我们使用您的函数来查看关键字参数。 假设其允许声明函数如上,然后使用上述声明,我们可

  • 问题内容: 在python2中: 在python3中: 为什么这里有字节? 编辑 : 我认为当字符串具有非ascii字符时,python3会将字节附加到字符串中。(如@Ashraful伊斯兰教所说) 那么如何在python3中避免这种情况呢? 问题答案: 考虑以下代码片段: 使用Python 2运行此命令,然后使用以下命令查看结果: 等等。不出意外;从到128个字节。 对Python 3做同样的事