在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
}
答案 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版本