【问题标题】:Reading semicolon delimited csv读取分号分隔的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 将是一个值得商榷的决定。

标签: java csv opencsv


【解决方案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 我冒昧地将代码移动到答案中以防止被弃用的代码副本。
猜你喜欢
  • 2018-05-04
  • 2015-03-19
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2016-12-09
相关资源
最近更新 更多