Java CSV Reader,读取剩余数据

时间:2012-12-15 14:06:42

标签: java csv import-from-csv

我有以下CSV数据:

1,mm/dd/yy,"abc,def,"pqr",xyz"

我想把它解析为3个字符串。

  1. 1

  2. MM / DD / YY

  3. 所有剩余数据,在本例中为“abc,def,”pqr“,xyz”

  4. 我尝试了几个库,openCSV,javacsv等。 所有这些似乎都解析并标记最后一列。 我想要的是将第二列之后的数据作为单个令牌保留。

    有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您应该更新输入数据以使用单引号括起第3列,如下所示: 1,MM / DD / YY, 'ABC,DEF, “PQR”,XYZ'

否则,您永远无法正确解析csv数据。

使用更新的数据,您可以调用功能强大的开源库uniVocity-parsers,只需几行即可正确读取数据:

public static void main(String[] args) throws FileNotFoundException {
    // 1st, config the CSV reader
    CsvParserSettings settings = new CsvParserSettings();
    settings.getFormat().setLineSeparator("\n");
    settings.getFormat().setQuote('\'');        // set the quote to single quote '
    settings.getFormat().setQuoteEscape('\\');  // escape the double quote "

    // 2nd, creates a CSV parser with the configs
    CsvParser parser = new CsvParser(settings);

    // 3rd, parses all rows from the CSV file into a 2-dimensional array
    List<String[]> resolvedData = parser.parseAll(new StringReader("1,mm/dd/yy,'abc,def,\"pqr\",xyz'"));
    for (String[] row : resolvedData) {
        StringBuilder strBuilder = new StringBuilder();
        for (String col : row) {
            strBuilder.append(col).append("\t");
        }
        System.out.println(strBuilder);
    }
}

你会得到这样的输出:

  

1 mm / dd / yy abc,def,“pqr”,xyz

答案 1 :(得分:0)

int firstCommaIndex = s.indexOf(',');
int secondCommaIndex = s.indexOf(',', firstCommaIndex + 1);
String firstPart = s.substring(0, firstCommaIndex);
String secondPart = s.substring(firstCommaIndex + 1, secondCommaIndex);
String lastPart = s.substring(secondCommaIndex + 1);

答案 2 :(得分:0)

试试SuperCSV。它有 quoteChar 配置选项,似乎表达了对引用文本的处理。

答案 3 :(得分:0)

您可以在https://github.com/CyborTronik/fluent-ssv

上使用自定义LineParser

它也会将您的CSV数据转换为bean,但是对于日期类型,您需要提供ValueConverter的自定义实现,否则您可以将其存储为字符串然后进行操作。

所以代码看起来像:

new SsvStreamBuilder<MyBean>()
  .forEntity(MyBean.class)
  .withLineParser(new MyLineParser())
  .withValueConverter(new MyDateConverter())
  .stream("~/some/csv/file");