Advertisement
Guest User

Untitled

a guest
Feb 7th, 2017
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.71 KB | None | 0 0
  1. #!/usr/bin/perl
  2. #
  3. # A quick script to fix non unique FITID ids in HSBC ofx downloads
  4. # makes a new unique id from the other details, so should match
  5. # a new overlapping download on a later date.
  6. #
  7. # usage:
  8. #  FixFitid.pl bad_file.ofx > new_file.ofx
  9. #
  10. # It writes to std out, do pipe the output somewhere.
  11. use strict;
  12. use warnings;
  13. use Data::Dumper;
  14. exit main(@ARGV);
  15.  
  16. our %seen_md5;
  17. BEGIN {$/="</STMTTRN>"}
  18.  
  19. sub main{
  20.     while (my $frag = <>)
  21.     {
  22.         my $href = parseDetails($frag);
  23.         my $md5 = genMD5($href);
  24.         $frag =  editFITID($frag,$md5);
  25.         print $frag;
  26.     }
  27. }
  28.  
  29.  
  30. sub parseDetails{
  31.     my $fragment = shift;
  32.     my %ret;
  33.     foreach my $part (qw(TRNTYPE DTPOSTED TRNAMT NAME MEMO FITID)){
  34.         if ($fragment =~ /<$part>(.*)<\/$part>/ )
  35.         {
  36.             $ret{$part} = $1;
  37.         }
  38.         else
  39.         {
  40.             $ret{$part} = "";
  41.             next if $part eq "MEMO";
  42.             print STDERR "Failed to find $part in '$fragment'";
  43.         }
  44.     }
  45.     $ret{DTPOSTED} =~ s/^(\d{8}).*/$1/;
  46.     return \%ret;
  47. }
  48.  
  49. sub genMD5{
  50.     my $href = shift;
  51.     my $string = join(" # ",@$href{qw(TRNTYPE DTPOSTED TRNAMT NAME MEMO)});
  52.     my $md5 = `echo '$string' | md5sum`;
  53.     $md5 =~ s/^(\S+).*/$1/s;
  54.     while ($seen_md5{$md5}){
  55.         $md5 = `echo '$md5' | md5sum`;
  56.         $md5 =~ s/^(\S+).*/$1/s;
  57.         #Handle multiple purchases with identical info.
  58.         print STDERR "Duplicate MD5. Same transaction on same day. Progressing MD5 to $md5";
  59.     }
  60.     $seen_md5{$md5}++;
  61.     return $md5;
  62. }
  63.  
  64. sub editFITID{
  65.     my $fragment = shift;
  66.     my $md5 = shift;
  67.     $fragment =~ s/<FITID>.*<\/FITID>/<FITID>$md5<\/FITID>/;
  68.     return $fragment
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement