Regex Perl解析在线银行对账单wells fargo

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

我正在分析富国银行网上银行对账单。卡号被截断,以P或S开头的号码是唯一的交易标识符。我更改了唯一标识符和卡号的最后四位数字。我认为自己在任何隐私问题上都是安全的。我通过一个长而难看的正则表达式解析或过滤每一行——我不确定你应该这么做。也许有更好的办法,我不知道

#!/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+)$!) {