Regex Perl解析在线银行对账单wells fargo
我正在分析富国银行网上银行对账单。卡号被截断,以P或S开头的号码是唯一的交易标识符。我更改了唯一标识符和卡号的最后四位数字。我认为自己在任何隐私问题上都是安全的。我通过一个长而难看的正则表达式解析或过滤每一行——我不确定你应该这么做。也许有更好的办法,我不知道Regex Perl解析在线银行对账单wells fargo,regex,perl,Regex,Perl,我正在分析富国银行网上银行对账单。卡号被截断,以P或S开头的号码是唯一的交易标识符。我更改了唯一标识符和卡号的最后四位数字。我认为自己在任何隐私问题上都是安全的。我通过一个长而难看的正则表达式解析或过滤每一行——我不确定你应该这么做。也许有更好的办法,我不知道 #!/usr/bin/perl use strict; use warnings; #my $filename = 'wellsfargo_balanceStatement.txt'; #open(my $fh, '<:encod
#!/usr/bin/perl
use strict;
use warnings;
#my $filename = 'wellsfargo_balanceStatement.txt';
#open(my $fh, '<:encoding(UTF-8)', $filename)
# or die "Could not open file '$filename' $!";
#while (my $row = <$fh>) {
while (my $line = <DATA>) {
chomp $row;
if ($row =~ /(\d{2}\/\d{2}\/\d{2})\s(PURCHASE).*\d{2}\/\d{2}(.*)\w\d{10}\d+.*\$(\d+\.\d+)/) {
my $date=$1;
my $purchs=$2;
my $pur_plce=$3;
my $pur_amt=$4;
print "$date $purchs $pur_plce $pur_amt\n";
}
sleep .5 ;
}
__DATA__
09/18/17 PURCHASE AUTHORIZED ON 09/17 CVS/PHARM 06062--200 W Manhattan NY P00000000032583371 CARD 4184 $4.87
09/18/17 PURCHASE AUTHORIZED ON 09/16 JUBILEE MARKET NEW YORK NY S467259862756690 CARD 4184 $8.78
09/18/17 PURCHASE AUTHORIZED ON 09/16 LOWE'S #3292 NEW YORK NY P00307259724475616 CARD 6029 $23.39
09/18/17 PURCHASE AUTHORIZED ON 09/16 NYSC WEST END NEW YORK NY S587259513187673 CARD 4184 $39.00
09/18/17 PURCHASE AUTHORIZED ON 09/16 JUBILEE MARKET NEW YORK NY S587259468801533 CARD 4184 $21.73
09/18/17 PURCHASE AUTHORIZED ON 09/15 7-ELEVEN NEW YORK NY P00000000840668487 CARD 4184 $12.75
09/18/17 PURCHASE AUTHORIZED ON 09/15 DUNKIN #351200 NEW YORK NY S307258635156794 CARD 4184 $2.82
09/18/17 PURCHASE AUTHORIZED ON 09/15 DUNKIN #351200 NEW YORK NY S587258634843803 CARD 4184 $2.82
最后,我将添加逗号分隔文件并将其输入excel。
所以我可以创建条形图、圆图等等。这就是我想要的
09/18/17 PURCHASE CVS/PHARM 06062--200 W Manhattan NY 4.87
09/18/17 PURCHASE JUBILEE MARKET NEW YORK NY 8.78
09/18/17 PURCHASE LOWE'S #3292 NEW YORK NY 23.39
09/18/17 PURCHASE NYSC WEST END NEW YORK NY 39.00
09/18/17 PURCHASE JUBILEE MARKET NEW YORK NY 21.73
09/18/17 PURCHASE 7-ELEVEN NEW YORK NY 12.75
09/18/17 PURCHASE DUNKIN #351200 NEW YORK NY 2.82
09/18/17 PURCHASE DUNKIN #351200 NEW YORK NY 2.82
我非常喜欢在regexps中尽可能少地使用
*
,因为这使它更易于阅读和理解。此外,您还可以使用除/
之外的其他分隔符,这将允许您在regexp中使用/而无需转义它
我建议这样做:
if ($row =~ m!(\d\d/\d\d/\d\d) (PURCHASE) \w+ ON \d\d/\d\d (.*) \w+ CARD \d+\s+\$(\d+\.\d+)$!) {
我还自由地将\d{2}改为\d\d-我发现这更容易阅读,因为我的大脑不必进入“嘿,这里必须有一定数量的\d,{很重要”模式。您可能希望通过在前面加上\n来转义
/
,这是使用不同分隔符的好处。在这种情况下,您必须转义!但不能转义/,这使您在处理路径名、日期等时更具可读性pp.Ohh。我不知道。感谢您澄清为什么要在那里睡觉?@simbabque-我应该把它拿出来。有时我喜欢看着输出一行一行地打印。而不是让整个东西一个一个地打印出来。这就是其中的一次。
if ($row =~ m!(\d\d/\d\d/\d\d) (PURCHASE) \w+ ON \d\d/\d\d (.*) \w+ CARD \d+\s+\$(\d+\.\d+)$!) {