Groovy OpenCSV读取带有反斜杠的值(例如“ domain \ user”)

时间:2019-01-15 20:56:28

标签: java groovy opencsv

在Groovy中,我正在使用opencsv解析CSV文件。我的代码没有使用反斜杠处理值。

我的输入文件具有此值

value1,domain\user,value2

这是我的常规代码。

   def filename = 'C:\\Temp\\list.txt'
    CSVReader csvReader = new CSVReader(new FileReader(filename))
    String[] nextRecord       
    while ((nextRecord = csvReader.readNext()) != null) {
        println nextRecord
    }
    csvReader.close()

它将在第二次归档时打印不带反斜杠的值。

[value1, domainuser, value2]

如何在OpenCSV中处理反斜杠值?

谢谢 SR

============== Apache Common解析器有效。

Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(new FileReader(filename));
for (CSVRecord record : records) {
    String f1 = record.get(0);
    String f2 = record.get(1);
    String f3 = record.get(2);
    println f1
    println f2
    println f3
}

1 个答案:

答案 0 :(得分:1)

在3.9版中,opencsv除了CSVParser之外还引入了一个解析器。解析器是CSVReader的基础。该新解析器称为RFC4180Parser。如official documentation所述

  

RFC4180定义了所有精确问题的标准,这些问题恰恰是CSV文件如何格式化...

     

CSVParser与RFC4180Parser之间的主要区别在于CSVParser使用转义字符表示“不可打印的”字符,而RFC4180规范则将首尾两引号之间的所有字符都视为福音(双引号除外)用双引号将其转义)。

因此,请尝试使用opencsv 3.9+和RFC4180Parser。它对我有用

def parser = new RFC4180ParserBuilder().build()
def reader = new CSVReaderBuilder(new FileReader(filename)).withCSVParser(parser).build();
println reader.readNext()

输出:

[value1, domain\user, value2]

如果由于某种原因您不能使用3.9及更高版本,则可以设置旧的解析器,以便转义字符是其他字符而不是反斜杠。但是在这种情况下,如果原始文件的创建者根据official documentation

使用反斜杠作为转义字符,则有可能破坏文件中的其他行。
  

...有时字段的数据中包含分隔符,因此必须使用引号。这些引号字符也可以包含在数据中,因此必须使用转义字符...

所以我的建议是使用3.9+和RFC4180Parser版本