Perl 删除符合条件的行,并创建已删除内容的报告
我是perl新手,边学习边学习。我得到一个以管道分隔的csv文件,其中每一行都有一个状态字段。我需要perl删除任何状态代码为MA的行,并创建一个报告,显示它删除的整行 下面是文件中具有状态MA的示例行。州代码是第9个字段。这些文件包含200到90000条记录,因此每个报告都应该包含包含MA的行的完整列表 多谢各位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
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作业中使用一行程序。我想你还有一些学习要做。您的目标并不难,但只有您知道确切的环境和规格。当你有我们可以帮助解决的具体问题时,请回来,目前这个问题太广泛了。