为CSV文件

时间:2016-03-24 08:51:54

标签: java regex csv split

我正在阅读csv文件,其中包含逗号(,)作为字段分隔符和双引号(")作为文本限定符。以下是获取行的列的代码:

row.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)")

工作正常。 但我想动态指定我的字段分隔符和文本限定符,即它们将作为输入与csv文件一起传递。并且将根据输入字段分隔符和文件解析文件。文本限定符。如何修改上面的正则表达式以获取字段分隔符&文本限定符即时。

编辑: 我正在使用Apache Commons CSV来解析csv文件。但在我的情况下,标题行可以是文件中的任何行。并且无法将标题行索引传递给Commons CSV解析器。所以我将手动读取文件并获取标题行。将其列拆分为String数组并将其传递给解析器。加上现场分离器&文本限定符是用户定义的,因此需要在此基础上进行拆分。

2 个答案:

答案 0 :(得分:2)

uniVocity-parsers可以自动检测输入格式以发现要使用的分隔符/引号字符:

    CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial.

    // turns on automatic detection of line separators, 
    // column separators, quotes & quote escapes
    settings.detectFormatAutomatically();

    // configures to skip a number of rows from the input and start parsing from there
    settings.setNumberOfRowsToSkip(3);

    // configures the parser to extract headers from the first parsed row
    settings.setHeaderExtractionEnabled(true);

    CsvParser parser = new CsvParser(settings);
    List<String[]> rows = parser.parseAll(new File("/path/to/your/file.csv"));

免责声明:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)

答案 1 :(得分:0)

TL; DR:使用CSV解析器

这是唯一正确的答案。解析文件只有一种方法,那就是使用解析器。

使用示例OpenCSV(没有联盟,只是我的首选):

try(final  CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '"', '\'')) {
//                                                ^ your file                ^ delimiter
//                                                                                 ^ quote
//                                                                                       ^ escape char

}

这是完全可配置的,并且支持转义序列,与正则表达式解决方案不同。