读取分号分隔的csv

Posted

技术标签:

【中文标题】读取分号分隔的csv【英文标题】:Reading semicolon delimited csv 【发布时间】:2018-04-01 10:18:11 【问题描述】:

我有下面的代码块,它使用 OpenCSV 读取 CSV 文件并存储第 7 列。我面临的问题是我在 CSV 文件中使用 ; 作为分隔符,但它也使用 , 作为分隔符。我怎样才能避免这种情况?

无法将 "" 放入 CSV,因为我们从客户端获取了不可编辑的文件。

        CSVReader reader = null;
    String[] nextCsvLine = new String[50];
    String splitBy = ";";

    int count = 0;

    try 
        StringReader sr = new StringReader(new String(in, offset, len));
        reader = new CSVReader(sr);

        while ((nextCsvLine = reader.readNext()) != null) 
            for (String linewithsemicolon : nextCsvLine) 
                log.debug("Line read : "+linewithsemicolon);
                String[] b = linewithsemicolon.split(splitBy);
                if (count==0)
                    count++;
                    continue;
                
                else          
                    detailItems.add(b[7]);
                    log.debug("7th position: "+b[7]);
                    count++;
                                   
            

【问题讨论】:

这是什么语言?它看起来像 Java。您需要使用编程语言标记您的问题 - 请参阅问题下方的“编辑”链接。 是的,它的 JAVA 很抱歉忘记链接。 您发布的代码对逗号根本没有反应。请提供minimal reproducible example。 为了简化我的问题,我是否有可能只阅读到第 8 列然后跳到下一行?行可能有 30 列甚至更多,但我只想阅读第 8 列并移至下一行。 请注意,for (String linewithsemicolon : nextCsvLine) 已经表明您的问题:nextCsvLine 表示表示为元素集合或数组的行,而 linewithsemicolon 表示您正在处理 one 元素作为一条线。这不太合适,应该已经暗示了读者的问题。正如已经回答的那样,您可以为 CSVReader 提供分隔符,但如果这不可能,那么使用 CSVReader 将是一个值得商榷的决定。 【参考方案1】:

使用带有OpenCSV分隔符的重载版本

CSVReader(reader, ';')

更新(感谢@Matt)- 更好地使用:

CSVReaderBuilder(reader)
    .withCSVParser(CSVParserBuilder()
    .withSeparator(';')
    .build())

我认为counting 做的有点不对:

try (CSVReader reader = new CSVReader(sr, ';')) 
    String[] nextCsvLine;
    while ((nextCsvLine = reader.readNext()) != null) 
        int count = 0;
        for (String field: nextCsvLine) 
            log.debug("Line read : "+linewithsemicolon);
            if (count == 6)  // 7th column
                detailItems.add(field);
                log.debug("7th position: " + field);
                               
            count++;
        
    

而不是你可以做的 for 循环:

         if (nextCsvLine.length > 6) 
             detailItems.add(nextCsvLine[6]);
         

第七个字段的索引应该是 6。

【讨论】:

你的意思是不是像 reader = new CSVReader(sr,';');这在分号的第一个实例之后中断,之后不再读取。 请参阅 zetcode.com 的 ReadNumbers2.java。我会在答案中添加一些代码。 仅供参考:从最新版本开始,OpenCSV 使用构建器模式,该模式将带有分隔符的构造函数呈现为不推荐使用的第二个参数。现在是CSVReaderBuilder(reader).withCSVParser(CSVParserBuilder().withSeparator(';').build()) 见opencsv.sourceforge.net/apidocs/com/opencsv/CSVReader.html @Matt 我冒昧地将代码移动到答案中以防止被弃用的代码副本。

以上是关于读取分号分隔的csv的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中读取带有分号分隔符的文件

用Python读取分号(';')分隔的原始文本

如何使用包含引号并使用多个分隔符的 pandas 读取 CSV 文件

读取 CSV 文件并将值存储到数组中

iOS-解析读取CSV文件,解析excel文件

使用 C# 在 XML 文件中转换 CSV