我使用 open csv 来读取只有 2 列的 CSV,例如:
"valueA1","valueB of A1"
,"valueB of A1"
,"valueB of A1"
,"valueB of A1"
"valueA2","valueB of A2"
,"valueB of A2"
,"valueB of A2"
,"valueB of A2"
而且它一直在继续,到目前为止一切都很好。 当 B 列中的某些值带有某些字符时,我遇到了麻烦 示例:
"valueA1","va"lueB" of A1"
,"valueB of A1"
,"valueB of A1"
,"valueB of A1"
"valueA2","valueB of A2"
,"valueB of A2"
,"valueB of A2"
,"valueB of A2"
当我的 B 列有类似 " 的内容,甚至在某些情况下有 : 的内容时,我打开的 csv 会丢失所有格式,而不是说我的下一行包含 2 个值它向我展示了像 36、48 这样疯狂的东西,并且因此丢失了大量内容。
我如何指定这些值位于 B 列内,并且不应该假设他需要创建一个新列?
我正在使用简单的构造函数
reader = new CSVReader(new FileReader(arquivo));
通过研究,我看到一些人说使用不同的构造函数,我尝试这样做
reader = new CSVReader(new FileReader(arquivo), ',','"');
但结果是一样的,因为构造函数只接受 char 我不能这样做 ","
最佳答案
首先,我仍然会明确设置分隔符和引号。您说您遇到了 ;
问题。
CSVReader reader = new CSVReader(new FileReader(arquivo), ',', '\"');
然后出现数据错误:文本值 va"lueB"of A1
,例如 Excel 会自动转义为:va""lueB""of A1
。我不知道 CSVWriter 会如何处理双引号。
侵入性最小的方法是在读取时纠正数据:
CSVReader reader = new CSVReader(new RepairingReader(new FileReader(arquivo)),
',', '\"', '\\');
这里我还指定了分隔符和引号的转义字符。
CSVReader
使用传递的或自行添加的 BufferedReader
并调用 readLine
。
public class RepairingReader extends BufferedReader {
public RepairingReader(Reader reader, int capacity) {
super(reader, capacity);
}
public RepairingReader(Reader reader) {
super(reader);
}
@Override
public String readLine() throws IOException {
String line = super.readLine();
if (line != null) {
line = line.replaceAll("([^,\\\\])\"([^,])", "$1\\\\\"$2");
}
return line;
}
}
这只是覆盖readLine
。它会替换前面(不是反斜杠,不是逗号)和后面(不是逗号)有字符的任何引号。替换应该是反斜杠后跟引号。
这不是一个完整的解析器,因为这样就可以自己实现 CSV 阅读器。
顺便说一句:FileReader
没有选项来设置用于将文件转换为 Unicode 字符串的编码。使用默认平台编码。因此,代码不可移植,文件应该采用本地编码。对于可移植软件,请使用 new InputStreamReader(new FileInputStream(file), encoding)
来代替。
关于java - opencsv,不能将值与“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26384257/