Java 从特定格式的CSV文件中提取数据
给定CSV文件中一行的数据格式:Java 从特定格式的CSV文件中提取数据,java,regex,csv,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),,,'.... 但也有这样尴尬的情况:一行可能会遗漏一些组,而对于一个组来说,它可能遗漏一些字段。但对于所有缺少的部分,它仍然使用逗号来分隔它们。因此,每行将
'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(',');
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
它们的长度为6。
那么剩下的部分就很容易了。您的文件格式是否足够可靠,可以只作为数据组的开始和开始?然后,您可以删除行的开头和结尾处的“,”,然后用“,”三个符号代替逗号。Hm。像这样的正则表达式呢
('.*')?,('.*')?,('.*')?,('.*')?,('.*')?,('.*')?
它很难看,但可能会正常工作
佩尔,你应该这样做:
String row = <the above data row>;
String[] dataGroups = row.split(',');
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'、'
这里有一个实时版本:我认为这更像是一个消毒问题。所有行是否都以单引号开头 如果是,您可以执行以下操作: 通过正则表达式获取引号内的所有内容。 然后,对于每一行,使用逗号拆分为列。 然后将拆分的组记录到列表>中,其中外部列表是行,嵌套列表是列。 如果嵌套列表的大小不是6,则可以在末尾使用逗号进行调整。
在我看来,阅读和消费这本书更干净。根据您的一条评论,您需要分析以下内容:
....,'data(gn),data(gn),subdata='datavalue',data(gn),,',.....
只有中的CSV解析器可以解析该内容。您的输入在一个带引号的值中有未加引号的引号。这将破坏任何其他用于Java的CSV解析库,请随意尝试
您所拥有的与此类似:
something,"text with "unescaped quotes" here",something else
您希望将其作为输出:
something
text with "escaped quotes" here
something else
您只需要将您的输入放入uniVocity解析器的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"));
有关此功能的更多详细信息
披露:我是这个图书馆的作者。它是开源的、免费的Apache V2.0许可证。问题是,这是不可配置的,它不能配置为,,,我想的是“datag1,datag1”,“datag2,datag2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,datag1 datag1,'在这两个组之间,您可以具体说明如何使用它吗?最好显示一些代码这有助于解释吗?好吧,这只是将这些字段分组,但它没有捕获空字段;在OP中的示例上运行-你到底观察到了什么?只是好奇,为什么缺少的字段被表示为“null”,而不是?我可以通过正则表达式获得带引号的所有现有内容,但这意味着我可能会失去一个没有内容的组。我需要捕获它,即使它是一个“空”组,因为每个组的位置对我来说都很重要。如果第4组的内容缺失,我将获得5组内容,但我如何知道缺失了哪一组?组的顺序是至关重要的。空组甚至可以表示为。否则,您如何知道缺少了什么?您为什么不使用Csv库或???。这些库可能可以处理格式。我认为这没有帮助。这些库将把引号中的数据视为一个字段,因此您不必担心字段中嵌入的逗号。考虑一下这种情况:…..,'datagn,datagn,subdata='datavalue',datagn,,',。。。。。在要访问的一对引号中有一对引号@BruceMartinuniVocity解析器的CSV解析器可以处理未替换的引号。