我正在阅读csv文件,其中包含逗号(,)作为字段分隔符和双引号(")作为文本限定符。以下是获取行的列的代码:
row.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)")
工作正常。 但我想动态指定我的字段分隔符和文本限定符,即它们将作为输入与csv文件一起传递。并且将根据输入字段分隔符和文件解析文件。文本限定符。如何修改上面的正则表达式以获取字段分隔符&文本限定符即时。
编辑: 我正在使用Apache Commons CSV来解析csv文件。但在我的情况下,标题行可以是文件中的任何行。并且无法将标题行索引传递给Commons CSV解析器。所以我将手动读取文件并获取标题行。将其列拆分为String数组并将其传递给解析器。加上现场分离器&文本限定符是用户定义的,因此需要在此基础上进行拆分。
答案 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)
这是唯一正确的答案。解析文件只有一种方法,那就是使用解析器。
使用示例OpenCSV(没有联盟,只是我的首选):
try(final CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '"', '\'')) {
// ^ your file ^ delimiter
// ^ quote
// ^ escape char
}
这是完全可配置的,并且支持转义序列,与正则表达式解决方案不同。