Perl-输出中缺少逗号

Perl-输出中缺少逗号,perl,Perl,我的脚本中有一个更新,用于格式化一个文件,并从DOE J字段中删除一个额外的逗号,我的一些行有一个额外的逗号,而一些行没有。我让它工作,但我现在的问题是,我错过了我的一个逗号,我不知道为什么它会发生 while(<IN>) { my $line = $_; $line =~ s/^(([^,]+,){13})([^,]*),*([^,]*)(,[^,]+,.*)$/\1\3\4\5/; print OUT "$line"

我的脚本中有一个更新,用于格式化一个文件,并从DOE J字段中删除一个额外的逗号,我的一些行有一个额外的逗号,而一些行没有。我让它工作,但我现在的问题是,我错过了我的一个逗号,我不知道为什么它会发生

  while(<IN>) {
        my $line = $_;
    $line =~ s/^(([^,]+,){13})([^,]*),*([^,]*)(,[^,]+,.*)$/\1\3\4\5/;
        print OUT "$line";
  }
输出:

555555,Service Location,06/30,210,OD44000,07/01/2011,09/01/2000,09/04/2000,1,07/01/2000,04/18/2000,2000-06-23 00:00:00,2000-07-01 00:00:00,DOE J,11950000,349000,200000000A,07/13/2000,2000-07-27 00:00:00,20010002000600CAA,8,1, ,6,Yes,,No,,No,01001,2800038000,**SUM**,0,400,38648.44,0,,,,,,,,,,,,,,,,,6018.32,0,0,0,0,,,6018.32,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
555555,Service Location,06/30,210,OD44000,07/01/2011,09/01/2000,09/04/2000,1,07/01/2000,04/18/2000,2000-06-23 00:00:00,2000-07-01 00:00:00,DOE J11950000,349000,200000000A,07/13/2000,2000-07-27 00:00:00,20010002000600CAA,8,1, ,6,Yes,,No,,No,01001,2800038000,**SUM**,0,400,38648.44,0,,,,,,,,,,,,,,,,,6018.32,0,0,0,0,,,6018.32,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
预期产出:

555555,Service Location,06/30,210,OD44000,07/01/2011,09/01/2000,09/04/2000,1,07/01/2000,04/18/2000,2000-06-23 00:00:00,2000-07-01 00:00:00,DOE J,11950000,349000,200000000A,07/13/2000,2000-07-27 00:00:00,20010002000600CAA,8,1, ,6,Yes,,No,,No,01001,2800038000,**SUM**,0,400,38648.44,0,,,,,,,,,,,,,,,,,6018.32,0,0,0,0,,,6018.32,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
555555,Service Location,06/30,210,OD44000,07/01/2011,09/01/2000,09/04/2000,1,07/01/2000,04/18/2000,2000-06-23 00:00:00,2000-07-01 00:00:00,DOE J,11950000,349000,200000000A,07/13/2000,2000-07-27 00:00:00,20010002000600CAA,8,1, ,6,Yes,,No,,No,01001,2800038000,**SUM**,0,400,38648.44,0,,,,,,,,,,,,,,,,,6018.32,0,0,0,0,,,6018.32,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0

最后我找到了一位老同事,他就是这么建议的,结果奏效了。在我的文件中,我在名字后面有一个90的逗号计数,因此我声明,这个模式,是其后的90倍

  while(<IN>) {
        my $line = $_;
             $line =~ s/^(([^,]*,){13})([^,]*),*([^,]*)((,[^,]*){90})/\1\3\4\5/;
        print OUT "$line";
  }
while(){
我的$line=$\ux;
$line=~s/^(([^,]*,){13})([^,]*),*([^,]*)((,[^,]*){90})/\1\3\4\5/;
打印出“$line”;
}

我最终找到了一位老同事,这就是他提出的建议,而且奏效了。在我的文件中,我在名字后面有一个90的逗号计数,因此我声明,这个模式,是其后的90倍

  while(<IN>) {
        my $line = $_;
             $line =~ s/^(([^,]*,){13})([^,]*),*([^,]*)((,[^,]*){90})/\1\3\4\5/;
        print OUT "$line";
  }
while(){
我的$line=$\ux;
$line=~s/^(([^,]*,){13})([^,]*),*([^,]*)((,[^,]*){90})/\1\3\4\5/;
打印出“$line”;
}

所有这些
*
一个接一个,在精神上都很难追踪;它们允许匹配一些意想不到的模式。你能用语言解释一下人们应该如何区分
DOE,J,…
DOE J,…
?(它们都包含后跟逗号的字符串。)我无法从代码中看出应该如何区分它们。(需要更正
DOE,J
,对吗?)(它总是字符串
DOE
J
?我想可能会有其他的词。它总是关于字段13-和-14,作为字段前后带数字的文本吗?整行中的字段总数是固定的吗?等等。)这里的问题似乎是您的输入数据。它试图用逗号分隔,但随后在字段中放入一个随机逗号。你能修复这个问题吗,这样任何可能包含逗号的文本字段都会被引用?这样,您就可以使用Text::csvxs之类的东西来解析数据。括号中的每一部分都是正在进行的操作的占位符,因此,没有括号的部分就是我要查找并要消除的值,即名称中的额外逗号。之后,它将定位非逗号字段和逗号字段。我找到的解决方案是说明此后还有多少逗号,并复制非逗号字段和逗号字段;它们允许匹配一些意想不到的模式。你能用语言解释一下人们应该如何区分
DOE,J,…
DOE J,…
?(它们都包含后跟逗号的字符串。)我无法从代码中看出应该如何区分它们。(需要更正
DOE,J
,对吗?)(它总是字符串
DOE
J
?我想可能会有其他的词。它总是关于字段13-和-14,作为字段前后带数字的文本吗?整行中的字段总数是固定的吗?等等。)这里的问题似乎是您的输入数据。它试图用逗号分隔,但随后在字段中放入一个随机逗号。你能修复这个问题吗,这样任何可能包含逗号的文本字段都会被引用?这样,您就可以使用Text::csvxs之类的东西来解析数据。括号中的每一部分都是正在进行的操作的占位符,因此,没有括号的部分就是我要查找并要消除的值,即名称中的额外逗号。之后,它将定位非逗号字段和逗号字段。我找到的解决方案是说明此后还有多少逗号,并复制非逗号字段和逗号字段。