Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Regex 在Perl中处理csv文件所需的正则表达式帮助,该文件的值本身带有逗号_Regex_Perl_Csv - Fatal编程技术网

Regex 在Perl中处理csv文件所需的正则表达式帮助,该文件的值本身带有逗号

Regex 在Perl中处理csv文件所需的正则表达式帮助,该文件的值本身带有逗号,regex,perl,csv,Regex,Perl,Csv,当值本身包含逗号时,我需要csv解析方面的帮助。 我已经从中了解到,这是不可能处理的 然而,我认为,如果提供一点帮助来构建正则表达式,我有一个想法可以实现。假设我的csv文件具有以下模式作为其每个值: "109", "[53G]", "/a/unix/path/", "", "hi 'sir', good morning", "error -msg "wrong input" -line_num "3rd line" ", "" 当遇到上述行(或类似行)时,我希望“hi'sir',goodmo

当值本身包含逗号时,我需要csv解析方面的帮助。 我已经从中了解到,这是不可能处理的

然而,我认为,如果提供一点帮助来构建正则表达式,我有一个想法可以实现。假设我的csv文件具有以下模式作为其每个值:

"109", "[53G]", "/a/unix/path/", "", "hi 'sir', good morning", "error -msg "wrong input" -line_num "3rd line" ", ""
当遇到上述行(或类似行)时,我希望“hi'sir',goodmorning”被收集到一个变量中。但正如您所知,短语/值相对于逗号(,)在“sir”和“good”之间被分割

我已经编写了一个代码,该代码正在使用下面给出的简化版本:

"a", "b", "c, cd", "d"
可与上述行匹配的代码如下所示:

if($line =~ /[a-zA-Z0-9],[\sa-zA-Z0-9]/) {
    print "It matched \n";
}
要进一步解释该想法和伪代码,请执行以下操作:

1) 匹配逗号前面或后面没有双引号的/all模式
2) 然后用一些短语替换逗号,并在“
3) 在收集变量中的单元格值后,再次用逗号替换故意替换的短语并进行处理。

如果有人能帮我使用我上面提到的真实模式的正则表达式,它将检查逗号周围的所有值,除了双引号,并按照上面的方法执行替换步骤,这将是一个很大的帮助


谢谢。

不要浪费时间用正则表达式来解决这个问题。只需使用(或者,如果您想要Perl发行版的标准部分,)


更新:我刚刚发现这不是有效的CSV。问题不在于嵌入的逗号,而是像
“error-msg“error input”-line_num“3rd line”
这样的字段中嵌入的双引号。您应该回到向您提供此数据的人那里,并要求他们生成有效的CSV数据。

如果您无法获得正确的有效CSV数据,那么这可能在大多数情况下对您有效。但是您需要非常小心,如果出现奇怪的错误,请怀疑解析

使用utf8;
严格使用;
使用“全部”警告;
使用开放式qw/:std:encoding(UTF-8)/;
我的$s=q{“109”、“[53G]”、“/a/unix/path/”、“,”您好,先生,早上好“,”错误-msg“输入错误”-第三行“,”;
我的@fields=$s=~/“(.*?”(?:,\s*(?=”)/gx;
为@字段打印“«$\»\n”;
输出
为什么不使用
Text::CSV
模块而不是regexp?@DovGrobgeld我需要检查它是否符合我的要求,因为我的主要目的是将CSV转换为JSON。我会就此与您联系。我看到一个负字符类[^”]在所有情况下,围绕逗号可能都可以完成我的工作。这里的主要问题不是嵌入的逗号,而是嵌入的双引号,如字段
“error-msg”error input“-line_num”3rd line”“
,我建议使用现有的解析器,如Text::CSV_XS,但您没有有效的CSV!逗号后面有空格,但可以使用
allow\u whitespace=>1
处理。另一方面,无法处理未替换的引号(
“error-msg”error input“…”
)。因此,您要求我们编写CSV ish解析器,但代码编写服务并非如此。投票关闭的范围太广。是的,问题在于我声称为csv的给定文件。我从一个我无法控制的人那里得到这个文件。不过,谢谢你的建议。我需要找到其他方法,或者要求正确更改文件的格式,或者解决我这边的问题。这不是有效的CSV文件。
«109»
«[53G]»
«/a/unix/path/»
«»
«hi 'sir', good morning»
«error -msg "wrong input" -line_num "3rd line" »
«»