Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从特定格式的CSV文件中提取数据_Java_Regex_Csv - Fatal编程技术网

Java 从特定格式的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),,,'.... 但也有这样尴尬的情况:一行可能会遗漏一些组,而对于一个组来说,它可能遗漏一些字段。但对于所有缺少的部分,它仍然使用逗号来分隔它们。因此,每行将

给定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(',');
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解析器可以处理未替换的引号。