在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。 然后其余部分将很容易。
答案 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)
我认为这更像是一个消毒问题。是否所有行都以单引号(')开头。
如果是这样,您可以执行以下操作:
在我看来,阅读和消费更加清晰。
答案 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许可证)。