从特定格式的CSV文件中提取数据

时间:2014-11-07 18:52:02

标签: java regex csv

在CSV文件中给出一行的这种数据格式:

'data(g1),data(g1)','data(g2),data(g2),data(g2),,,',,,'data(g5),,,data(g5)',

这是CSV格式,但对于单独的数据组,则使用

''

将它们分组,例如:

.....'data(g2),data(g2),data(g2),,,'....

但是有一些尴尬的情况:一排可能会错过一些小组,对于一个小组,它可能会错过一些领域。但对于所有缺失的部分,它仍然使用逗号分隔它们。因此每行总是有6组数据。那我怎样才能正确地得到所有6组数据(即使它什么都没有)?

我尝试使用这样的正则表达式:

String row = <the above data row>;
String[] dataGroups = row.split(',');

但是这个肯定不会起作用,因为在每组数据中,它也使用逗号来分隔数据。 Java中有什么有效的方法可以做到这一点?如果我可以将所有6组数据存储在

中,那将是非常棒的
String[] dataGroups

长度为6。 然后其余部分将很容易。

4 个答案:

答案 0 :(得分:1)

嗯。这样的正则表达式怎么样?

('.*')?,('.*')?,('.*')?,('.*')?,('.*')?,('.*')?

它很难看,但它可能正常工作......

根据http://www.regular-expressions.info/java.html,您可以执行以下操作:

Matcher m = Pattern.compile("('.*')?,('.*')?,('.*')?,('.*')?,('.*')?,('.*')?").matcher(row);
m.find();
m.group(1); //gives you the first group on the line; 
//change the index to get the other groups

然后,您可以使用.split(',')

拆分每个组

这是一个实时版本:http://regex101.com/r/jR0iM4/1

答案 1 :(得分:0)

您的文件格式是否足够可靠,只能作为数据组的开始和开始?然后你可以删除'在行的开头和结尾,然后通过','(三个符号)而不是逗号来删除行。

答案 2 :(得分:0)

我认为这更像是一个消毒问题。是否所有行都以单引号(')开头。

如果是这样,您可以执行以下操作:

  1. 通过正则表达式获取引号内的所有内容。
  2. 然后,对于每一行,通过分割逗号分割成列。
  3. 然后将拆分组记录到List&gt;其中外部列表​​是行,嵌套列表是列。
  4. 如果嵌套列表的大小不是6,则可以使用逗号调整此项。
  5. 在我看来,阅读和消费更加清晰。

答案 3 :(得分:-1)

根据您的一条评论,您需要解析此问题:

....,'data(gn),data(gn),subdata='datavalue',data(gn),,',.....

只有uniVocity-parsers中的CSV解析器才能解析它。您的输入在引用值中包含未转义的引号。这将破坏Java的任何其他CSV解析库(随意尝试)。

你所拥有的与此类似:

something,"text with "unescaped quotes" here",something else

您希望将此作为输出:

something
text with "escaped quotes" here
something else

你只需要将你的输入投入到uniVocity-parsers&#39; CSV解析器

CsvParserSettings parserSettings =  new CsvParserSettings();
parserSettings.setParseUnescapedQuotes(true); //this is enabled by default

CsvParser parser = new CsvParser(parserSettings);
List<String[]> allRows = parser.parseAll(getReader("/examples/bean_test.csv"));

有关此功能的更多详细信息here

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。