Java opencsv,can';t使用带“的值”;

Java opencsv,can';t使用带“的值”;,java,csv,opencsv,Java,Csv,Opencsv,我使用open csv读取只有两列的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列上的某些值带有某些字符时,我遇到了问题 例如: 当我的B列有类似于a“的内容时,甚至在某些情况下a:我的打开的cs

我使用open csv读取只有两列的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列上的某些值带有某些字符时,我遇到了问题 例如:

当我的B列有类似于a的内容时,甚至在某些情况下a我的打开的csv会丢失所有格式,而不是说我的下一行包含2个值,它会向我显示疯狂的东西,如36、48,并因此丢失大量内容

我怎样才能指定这些值在列B和h中,而不是假设他需要创建一个新列

我正在使用简单的构造函数

reader = new CSVReader(new FileReader(arquivo));
通过研究,我看到一些人说要使用不同的构造函数,我试着这样做

reader = new CSVReader(new FileReader(arquivo), ',','"');

但是结果是一样的,因为构造函数只接受char,我不能做,“

首先,我仍然会显式设置分隔符和引号。您说您在
方面有问题

CSVReader reader = new CSVReader(new FileReader(arquivo), ',', '\"');
然后是一个数据错误:A1的文本值
va“lueB”
,例如Excel会自动转义为:A1的
va“lueB”
。我不知道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)
而不是便携式软件。

CSV没有官方标准,但有一个非官方标准,并且您显示的示例不符合该标准。包含双引号字符的值应被引用,值中的双引号字符应被加倍

valueA1,"va""lueB"" of A1"
(在本例中,允许但不要求在“valueA1”周围加双引号。)因为您是自己从XLS文件创建CSV文件的,所以应该解决转换中的问题


如果将Excel 2007另存为“CSV(MS-DOS)(*.CSV)”,则Excel 2007可以正确执行此操作。我记得旧版本的Excel有一个CSV选项屏幕,您可能需要使用它。

在将其写入CSV之前,应先将字符串文本中的
转义。@bali182您的意思是输入文件并删除所有选项“在运行csv之前?但这也会删除定义csv字段的“”项。您的csv具有vrong格式。联系提供商,让他们修复它。@talex说了什么。这是CSV中的“语法”错误。如果您自己编写,则在将其写入文件之前将其转义,否则,请询问是谁创建了此csv来修复它。我的问题是,创建此csv的是另一家公司,他们是提供信息的唯一方式,没有web服务或类似服务。我需要读取此文件的内容并保存到我的数据库中,是否无法解决此问题?
valueA1,"va""lueB"" of A1"