我的 CSV 数据如下:
1,mm/dd/yy,"abc,def,"pqr",xyz"
我想将其解析为 3 个字符串。
1
月/日/年
所有剩余数据,在本例中为 "abc,def,"pqr",xyz"
我已经尝试了几个库,openCSV、javacsv 等。所有这些似乎都解析和标记最后一列。我想要的是第二列之后的剩余数据作为单个标记。
有任何想法吗 ?
我的 CSV 数据如下:
1,mm/dd/yy,"abc,def,"pqr",xyz"
我想将其解析为 3 个字符串。
1
月/日/年
所有剩余数据,在本例中为 "abc,def,"pqr",xyz"
我已经尝试了几个库,openCSV、javacsv 等。所有这些似乎都解析和标记最后一列。我想要的是第二列之后的剩余数据作为单个标记。
有任何想法吗 ?
您应该更新输入数据以用单引号括住第 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 毫米/日/年 abc,def,"pqr",xyz
试试SuperCSV。它有quoteChar配置选项,似乎表达了对引用文本的处理。
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);
您可以在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");