我正在尝试在csv文件中添加更改数据:
以下是示例数据:
DATE status code value value2
"2016-01-26","Subscription All","119432660","1315529431362550","0.0080099833517888"
"2016-01-26","Subscription All","119432664","5836995058433524","0.033825584764444"
"2016-01-26","Subscription All","119432664","8287300074499777","0.076913377834744"
"2016-01-26","Subscription All","119432664","14870697739968326","0.0074188355187426"
我用于格式化数据的代码:
CSVReader reader = new CSVReader(new FileReader(new File(fileToChange)), CSVParser.DEFAULT_SEPARATOR, CSVParser.NULL_CHARACTER, CSVParser.NULL_CHARACTER, 1)
info "Read all rows at once"
List<String[]> allRows = reader.readAll();
CSVWriter writer = new CSVWriter(new FileWriter(fileToChange), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER)
writer.writeAll(allRows)
writer.close()
我得到的输出是这样的,添加了额外的引号而不是删除它。
""2016-01-26"",""Subscription All"",""119432660"",""1315529431362550"",""0.0080099833517888""
""2016-01-26"",""Subscription All"",""119432664"",""5836995058433524"",""0.033825584764444""
""2016-01-26"",""Subscription All"",""119432664"",""8287300074499777"",""0.076913377834744""
""2016-01-26"",""Subscription All"",""119432664"",""14870697739968326"",""0.0074188355187426""
我想删除引号。请有人帮忙。
另外,是否可以将日期格式更改为 yyyymmdd 而不是 yyyy-mm-dd?
allRows.each { String[] theLine ->
String newDate = theLine[0].replaceAll('-', '')
String newline = theLine.eachWithIndex { String s, int i -> return i > 0 ? s : newDate}
writer.writeLine(newline)
}
谢谢
当你实例化你的CSVReader时,你告诉它不要将任何字符视为引号,因此它将现有的引号读取为数据,并没有删除它们。
当您告诉CSVWriter
不要添加任何引号时,它尊重了您的请求。但是,输入数据包含引号字符,在 CSV 中的字符串中包含引号的约定是将引号加倍。因此,字符串值
ABC"DEF
在 CSV 中编码为
"ABC""DEF"
因此,您看到的结果是不删除输入上的引号(您告诉它不要删除(,然后将输出上的引号加倍的组合。
要解决此问题,请将输入选项从 NULL_CHARACTER
更改为 DEFAULT_QUOTE_CHARACTER
。 但请注意,如果任何数据实际上包含嵌入的引号或逗号,则生成的输出将不是有效的 CSV。
另外,我认为这可能是针对OpenCSV的有效错误报告。 我相信 OpenCSV 需要通知您,当您告诉它省略引号时,它是否即将生成无效的 CSV,可能是通过运行时异常。 虽然我想他们可能会争辩说,你选择在没有网的情况下工作,应该接受你得到的一切。 就个人而言,我选择"最小意外原则",恕我直言,当输出未引用时,不会双引号。
因为CSVReader中的引号设置为CSVParser.NULL_CHARACTER
"
被视为普通字符,这是读取令牌的一部分。这会导致数组包含以下形式的数据:
["2016-01-26", "Subscription All", "119432660", "1315529431362550", "0.0080099833517888"]
而不是:
[2016-01-26, Subscription All, 119432660, 1315529431362550, 0.0080099833517888]
因此,请尝试将选项从CSVParser.NULL_CHARACTER
更改为任一
-
'"'
-
CSVParser.DEFAULT_QUOTE_CHARACTER
(它也存储'"'
(。
CsvToBean csvToBean = new CsvToBeanBuilder(new StringReader(csv))
.withMappingStrategy(strategy)
.withIgnoreLeadingWhiteSpace(true)
.withSeparator(',')
.withIgnoreEmptyLine(true)
.withQuoteChar(''')
.withQuoteChar('"')
.build();