Java Univocity CSV解析器将以引号开头的整行粘贴在一起;

Java Univocity CSV解析器将以引号开头的整行粘贴在一起;,java,csv,parsing,univocity,Java,Csv,Parsing,Univocity,我正在使用univocity 2.7.5解析csv文件。到目前为止,它工作得很好,将csv文件中的一行解析为带有n元素的字符串数组,其中n=一行中的列数。但现在我有一个文件,其中行以引号“开头,解析器无法处理它。它返回一行作为字符串数组,其中只有一个元素包含整行数据。我尝试从csv文件中删除该引号,它工作正常,但有大约500000行。我应该如何使它工作 这是我的文件中的示例行(源文件中也有引号): "100926653937,Kasym Amina,620414400630,Marzhan E

我正在使用
univocity 2.7.5
解析
csv
文件。到目前为止,它工作得很好,将
csv
文件中的一行解析为带有
n
元素的字符串数组,其中n=一行中的列数。但现在我有一个文件,其中行以引号
开头,解析器无法处理它。它返回一行作为字符串数组,其中只有一个元素包含整行数据。我尝试从
csv
文件中删除该引号,它工作正常,但有大约500000行。我应该如何使它工作

这是我的文件中的示例行(源文件中也有引号)

 "100926653937,Kasym Amina,620414400630,Marzhan Erbolova,""Kazakhstan, Almaty, 66, 3"",87029845662"
这是我的代码:

    CsvParserSettings settings = new CsvParserSettings();
    settings.setDelimiterDetectionEnabled(true);
    CsvParser parser = new CsvParser(settings);
    List<String[]> rows = parser.parseAll(csvFile);
CsvParserSettings设置=新的CsvParserSettings();
settings.setDelimiterDetectionEnabled(true);
CsvParser parser=新的CsvParser(设置);
列表行=parser.parseAll(csvFile);

此处是库的作者。您在库中的输入是一个格式良好的CSV,具有单个值,包括:

100926653937,卡西姆·阿米纳,62041440630,马尔詹·埃尔博洛娃,“哈萨克斯坦,阿拉木图,66,3”,87029845662

如果你输入的中间出现了这行,我想你的输入有无漏掉的引号(在你到达那行之前的某个地方)。试着用非逃逸的报价处理设置:

例如,这可能会起作用:

settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_'u CLOSING_QUOTE);

如果什么都不起作用,并且您的所有行看起来都像您发布的行,那么您可以对输入进行两次解析(这很糟糕,速度很慢,但会起作用):

CsvParser解析器=新的CsvParser(设置);
parser.beginParsing(csvFile);
List out=new ArrayList();
字符串[]行;
而((row=parser.parseNext())!=null){
//是否有长度意外的行?
if(row.length==1){
//再把它拆开。
行=parser.parseLine(行[0]);
}
out.add(行);
}

希望这能有所帮助。

这里是库的作者。您在那里的输入是一个格式良好的CSV,具有一个由以下内容组成的值:

100926653937,卡西姆·阿米纳,62041440630,马尔詹·埃尔博洛娃,“哈萨克斯坦,阿拉木图,66,3”,87029845662

如果你输入的中间出现了这行,我想你的输入有无漏掉的引号(在你到达那行之前的某个地方)。试着用非逃逸的报价处理设置:

例如,这可能会起作用:

settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_'u CLOSING_QUOTE);

如果什么都不起作用,并且您的所有行看起来都像您发布的行,那么您可以对输入进行两次解析(这很糟糕,速度很慢,但会起作用):

CsvParser解析器=新的CsvParser(设置);
parser.beginParsing(csvFile);
List out=new ArrayList();
字符串[]行;
而((row=parser.parseNext())!=null){
//是否有长度意外的行?
if(row.length==1){
//再把它拆开。
行=parser.parseLine(行[0]);
}
out.add(行);
}

希望这能有所帮助。

你能从你的文件中添加一行示例吗?@Arnaud是的,当然。检查编辑。你有没有办法更改csv文件的生成方式?双引号通常用于转义csv中带有分隔符的文本,因此如果你的行看起来像一个包含分隔符的条目。我假设
“哈萨克斯坦,阿拉木图,66,3“
将是一个实际的转义条目,无论是谁编写了该行,都将再次转义,因此您将获得转义转义字符(即双引号,
)。删除行首和行尾的双引号时出现的问题无法处理行本身中错误转义的双引号。csv解析器正在正确解析该行;解决方案
修复创建文件的程序
,或编写程序修复文件。您可以从文件中添加一行样本吗?@Arnaud是的,当然可以。检查编辑。是否有任何方法更改csv文件的生成方式?双引号通常用于转义csv中带有分隔符的文本,因此如果您的行看起来像一个包含分隔符的条目。我假设
“哈萨克斯坦,阿拉木图,66,3”
将是一个实际的转义条目,无论是谁写的行都将再次转义,因此您将获得转义转义字符(即双引号,
)。删除行首和行尾的双引号时出现的问题无法处理行本身中错误转义的双引号。csv解析器正在正确解析该行;解决方案
修复创建文件的程序
,或编写程序修复文件
CsvParser parser = new CsvParser(settings);
parser.beginParsing(csvFile);

List<String[]> out = new ArrayList<>();
String[] row;
while ((row = parser.parseNext()) != null) {
    //got a row with unexpected length?
    if(row.length == 1){
        //break it down again.
        row = parser.parseLine(row[0]);
    }
    out.add(row);
}