Advertisement
pr4wn

Parsing a CSV file example

Feb 10th, 2012
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.06 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my @lines = ('12,some text,34',
  5.               '56,"some text, with a comma in",78',
  6.               '99,"some text, with a ""quote"" or two in",100');
  7. for my $i (0..$#lines) {
  8.    my @a = ParseCsv($lines[$i]);
  9.    print "!!start of record\n";
  10.    for my $j (0..$#a) {
  11.      print "$a[$j]\n";
  12.    }
  13.    print "!!end of record\n\n";
  14. }
  15.  
  16. my @CsvNew = ();
  17. my $CsvField = "";
  18. my $CsvCh = "";
  19. my $CsvState = "";
  20. sub ParseCsv {
  21.    my $text = shift;
  22.    @CsvNew = ();
  23.    $CsvState = "stStart";
  24.    sub endfield {
  25.      push(@CsvNew, $CsvField);
  26.      $CsvField = "";
  27.    }
  28.    sub addchar {
  29.      $CsvField = $CsvField . $CsvCh;
  30.    }
  31.    sub error {
  32.      die("Unexected char ('$CsvCh') in csvState $CsvState");
  33.    }
  34.    for my $i (0..length($text)-1) {
  35.      $CsvCh = substr($text, $i, 1);
  36.      #print "i=$i  csvCh='$CsvCh'  csvState=$CsvState\n";
  37.      if    ($CsvState eq "stStart") {
  38.        if    ($CsvCh eq ',') { endfield();      $CsvState="stStart"      }
  39.        elsif ($CsvCh eq '"') {                  $CsvState="stQuoted"     }
  40.        else                  { addchar($CsvCh); $CsvState="stUnQuoted"   }
  41.      }
  42.      elsif ($CsvState eq "stUnQuoted") {
  43.        if    ($CsvCh eq ',') { endfield();      $CsvState="stStart"      }
  44.        elsif ($CsvCh eq '"') { error();         $CsvState="stQuoted"     }
  45.        else                  { addchar($CsvCh); $CsvState="stUnQuoted"   }
  46.      }
  47.      elsif ($CsvState eq "stQuoted") {
  48.        if    ($CsvCh eq ',') { addchar($CsvCh); $CsvState="stQuoted"     }
  49.        elsif ($CsvCh eq '"') {                  $CsvState="stQuoteQuote" }
  50.        else                  { addchar($CsvCh); $CsvState="stQuoted"     }
  51.      }
  52.      elsif ($CsvState eq "stQuoteQuote") {
  53.        if    ($CsvCh eq ',') { endfield();      $CsvState="stStart"      }
  54.        elsif ($CsvCh eq '"') { addchar($CsvCh); $CsvState="stQuoted"     }
  55.        else                  { error();         $CsvState="stQuoted"     }
  56.      }
  57.    }
  58.    endfield();
  59.    return @CsvNew;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement