java - opencsv,不能将值与“

标签 java csv opencsv

我使用 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/

相关文章:

java - Netty 简单 channel 处理程序断开连接被阻止

java - 从格式 A 的 XML 转换为格式 B 的 XML

java - 如何使用 opencsv 构建(工作)自定义转换器

java - 如何使用 CsvReader 中的 getHeaders() 方法读取 csv 文件的 header 值

java - 为什么 println 不显示 - Java

java - 如何编写回退机制来保存第一次未成功保存的实体

javascript - 使用 Node 将大数组写入文件

python - 在 python 3 中,如何将数据从二维数组传输到 csv 文本文件

php - 如何以最快的方式导入数据进行分析

java - 使用 OpenCSV 从 CSV 中提取特定数字