Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
Perl 删除符合条件的行,并创建已删除内容的报告_Perl_Delete Row - Fatal编程技术网

Perl 删除符合条件的行,并创建已删除内容的报告

Perl 删除符合条件的行,并创建已删除内容的报告,perl,delete-row,Perl,Delete Row,我是perl新手,边学习边学习。我得到一个以管道分隔的csv文件,其中每一行都有一个状态字段。我需要perl删除任何状态代码为MA的行,并创建一个报告,显示它删除的整行 下面是文件中具有状态MA的示例行。州代码是第9个字段。这些文件包含200到90000条记录,因此每个报告都应该包含包含MA的行的完整列表 多谢各位 48975564|37274022|64645215|49740554|New|6649|2790|20140812165625|MA|20140812195525|Y||18|20

我是perl新手,边学习边学习。我得到一个以管道分隔的csv文件,其中每一行都有一个状态字段。我需要perl删除任何状态代码为MA的行,并创建一个报告,显示它删除的整行

下面是文件中具有状态MA的示例行。州代码是第9个字段。这些文件包含200到90000条记录,因此每个报告都应该包含包含MA的行的完整列表

多谢各位

48975564|37274022|64645215|49740554|New|6649|2790|20140812165625|MA|20140812195525|Y||18|20140812201212|20140805153425|1|28|81602017|Default|DIALER-2|claglama|whyte|RMKT|Arts/Sciences|Associate of Arts|AAGS|ASSOCIATE OF ARTS IN GENERAL STUDIES|9049540951|20782|WEST HYATTSVILLE|||||3013648759|US|United States|UOP|N|N|N|N||Y

以下一行代码可能适合您:

perl -i -F'\|' -lane 'BEGIN {$bad = \*STDOUT} $F[8] eq "MA" ? $bad->print($_) : print' file.csv > bad.csv
说明: 开关

  • -i
    :就地编辑
    文件(如果提供扩展名,则进行备份)
  • -F
    split()
    模式用于
    -a
    开关(///是可选的)
  • -l
    :启用行结束处理,指定行结束符
  • -a
    :在空间上拆分行并将其加载到数组中
    @F
  • -n
    :为输入文件中的每一行创建
    while(){…}
    循环
  • -e
    :告诉
    perl
    在命令行上执行代码
您可以逐行读取文件,并将与特定正则表达式匹配的行打印到错误文件中:

use strict;
use warnings;
use autodie;

open my $in, '<', 'in.txt';
open my $errors, '>', 'error.txt';
open my $new, '>', 'new.txt';

while(<$in>){
    chomp;
    if (/\|MA\|/){
        print $errors "$_\n" ;
        next; # Skip any lines that contain |MA|
    }
    print $new "$_\n"; # Print all the remaining lines to a new file
}
使用严格;
使用警告;
使用自动模具;
在“,”error.txt“中打开我的$;
打开我的$new,'>','new.txt';
while(){
咀嚼;
如果(/\\\\\\\\\\\\/){
打印$errors“$\n”;
接下来;#跳过任何包含| MA的行|
}
打印$new“$\un”;#将所有剩余行打印到新文件中
}

您可以编写Perl代码,以便它希望输入文件的路径作为命令行上的一个参数,在这种情况下,Perl会为您打开
,您只需使用
即可从文件中读取

您需要使用
chomp
split
在管道字符
|
上删除每条记录末尾的换行符。第九个字段有索引8,您可以根据其值决定如何处理当前记录

听起来您想将第九列中包含
MA
的所有行打印到报告文件中,因此您必须先
打开该文件

将未打印到报告中的所有内容发送到STDOUT是有意义的,因此您可以这样编写

perl filter.pl myfile.txt > filtered.txt
所以你可以写这个

use strict;
use warnings;
use 5.010;
use autodie;

open my $rep_fh, '>', 'report.txt';

while (my $line = <>) {
  chomp $line;
  my $f9 = (split /\|/, $line)[8];
  if ($f9 eq 'MA') {
    print $rep_fh $line, "\n";
  }
  else {
    print $line, "\n";
  }
}

到目前为止你试过什么吗?这其中有什么特别的地方你有困难吗?不幸的是,我什么都没试过。我还没有学会如何从csv中删除并创建报告。我很绿。这适用于预测拨号应用程序。如果这超出了标准,我很抱歉。我希望将它放在cron上,并在新列表发布时自动运行。我不知道如何在文件上写一行。我尝试使用一行程序并包含实际目录。但是在F'之后得到了一个错误的坏名字/usr/bin/perl使用严格;使用警告;perl-i-F'\\'-lane'开始{$bad=\*STDOUT}$F[8]eq“MA”$错误->打印($):打印'/opt/avaya/pds/public/public/rcvfile1.raw>/opt/avaya/pds/reports/rcvfile1bad.csv答案是,我不会在cron作业中使用一行程序。我想你还有一些学习要做。您的目标并不难,但只有您知道确切的环境和规格。当你有我们可以帮助解决的具体问题时,请回来,目前这个问题太广泛了。