Java 如何解决这个错误,使用ApacheCommons使用双引号的CSVFormat?

Java 如何解决这个错误,使用ApacheCommons使用双引号的CSVFormat?,java,runtime-error,java-11,apache-commons,Java,Runtime Error,Java 11,Apache Commons,我有一个我无法解决的错误,我使用Apache Commons读取我的CSV文件,但有一行包含一个带双引号的字符串,它不是分隔符,它是字符串的一部分,我想要一个替代方法来摆脱应用程序给出的错误。下面是代码和错误 Reader in = Files.newBufferedReader(Paths.get(nomeArquivoCorretores), Charset.forName("ISO-8859-1")); Iterable<CSVRecord>

我有一个我无法解决的错误,我使用Apache Commons读取我的CSV文件,但有一行包含一个带双引号的字符串,它不是分隔符,它是字符串的一部分,我想要一个替代方法来摆脱应用程序给出的错误。下面是代码和错误

Reader in = Files.newBufferedReader(Paths.get(nomeArquivoCorretores),  Charset.forName("ISO-8859-1"));      
Iterable<CSVRecord> records = CSVFormat
                    .newFormat(',')
                    .withQuote('"')
                    .withEscape('\\')
                    .withHeader(cabecalhoCorretores)
                    .withTrailingDelimiter()
                    .withQuoteMode(QuoteMode.ALL)
                    .parse(in);
for (CSVRecord record : records) {
                try { ... }
Reader in=Files.newbuffereder(path.get(nomearquivocorrestores),Charset.forName(“ISO-8859-1”);
Iterable记录=CSVFormat
.newFormat(“,”)
.withQuote(“”)
.withEscape(“\\”)
.带标题(CabecalHoCorrestores)
.withTrailingDelimiter()
.withQuoteMode(QuoteMode.ALL)
.parse(in);
用于(CSVRecord记录:记录){
试试{…}
我在尝试浏览csv可编辑列表时遇到这种类型的错误

java.lang.IllegalStateException:IOException读取下一条记录:java.io.IOException:(第1行)封装的令牌和分隔符之间的字符无效


它理解为双引号是分隔符,但它是字符串的一部分,正在破坏算法过程。您的输入CSV无效。在第2节第7项中,说明:

如果使用双引号括起字段,则必须通过在字段前面加上另一个双引号来转义字段中出现的双引号

这里的情况并非如此:

86954708000105,“LOPES”G“ADMC.CORRETORA DE SEGUROS LTDA”,PJ,0,悬念

应该是哪一个

86954708000105,“LOPES”“G”“ADMC.CORRETORA DE SEGUROS LTDA”,PJ,0,暂记

修复此问题的最佳方法可能是修复生成此无效CSV的程序

如果这是不可能的,你可以尝试解决它,但这将是一个脆弱的黑客。假设有缺陷的CSV生成器至少在缺陷的方式上是一致的,并且从不在字段中重复引号,你可以首先将文件读为纯文本,黑客般地尝试修复引号,然后将结果提供给实际的CSV阅读器

import java.io.*;
import org.apache.commons.csv.*;

public class CsvHack {
    public static void main(String[] args) throws Exception {
        String csvdata = "86954708000105,\"LOPES \"G\" ADMC.CORRETORA DE SEGUROS LTDA\",PJ, ,0,Suspenso,,,,";
        BufferedReader reader = new BufferedReader(new StringReader(csvdata));

        StringBuilder buffer = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            line = line.replaceAll("([^,])\"", "$1\"\"");
            line = line.replaceAll("\",", "\"\",");
            buffer.append(line);
            buffer.append("\r\n");
        }
        Reader hack = new StringReader(buffer.toString());

        Iterable<CSVRecord> records = CSVFormat
            .newFormat(',')
            .withQuote('"')
            .withEscape('\\')
            .withTrailingDelimiter()
            .withQuoteMode(QuoteMode.ALL)
            .parse(hack);
        for (CSVRecord record : records) {
            System.out.println(record.get(1));
        }
    }
}
import java.io.*;
导入org.apache.commons.csv.*;
公共类CsvHack{
公共静态void main(字符串[]args)引发异常{
字符串csvdata=“86954708000105,\“LOPES\”G\“ADMC.CORRETORA DE SEGUROS LTDA\”,PJ,0,suspendo,,,,,”;
BufferedReader reader=新BufferedReader(新StringReader(csvdata));
StringBuilder缓冲区=新的StringBuilder();
弦线;
而((line=reader.readLine())!=null){
line=line.replaceAll(“([^,])\”,“$1\”);
line=line.replaceAll(“\”,“\”,“\”,”);
buffer.append(行);
buffer.append(“\r\n”);
}
Reader hack=newstringreader(buffer.toString());
Iterable记录=CSVFormat
.newFormat(“,”)
.withQuote(“”)
.withEscape(“\\”)
.withTrailingDelimiter()
.withQuoteMode(QuoteMode.ALL)
.parse(hack);
用于(CSVRecord记录:记录){
System.out.println(record.get(1));
}
}
}
这会将整个文件读入内存中的
StringBuilder
(如果处理大文件,这可能已经是不可能的了),然后使用正则表达式将逗号后面或前面不正确的引号替换为两个引号。如果引号中的文本中有逗号,则会断开引号;正则表达式是错误的工具

另一种方法是实现自己的
java.io.Reader
并将其放在文件和CSV解析器之间,然后在该阅读器的
read
方法中修复引号

如果你得到过有效的CSV报价,这些方法会通过添加额外的报价来搞乱它


同样,我强烈建议修复输出有缺陷的CSV的程序。

您能回答您的问题并添加示例输入吗?准确的错误消息?(A大大增加了您获得答案的机会。)猜猜看:听起来你有一个破碎的CSV文件,其中的字段没有转义引号。如果是这样,请与生成该文件的人联系。Robert我编辑了这个问题,但在执行代码时仍然会出现错误。导致错误的输入行是什么?86954708000105,“LOPES”G“ADMC.CORRETORA DE SEGUROS LTDA”,PJ,0,暂记,,,,