Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use warnings;
- my @lines = ('12,some text,34',
- '56,"some text, with a comma in",78',
- '99,"some text, with a ""quote"" or two in",100');
- for my $i (0..$#lines) {
- my @a = ParseCsv($lines[$i]);
- print "!!start of record\n";
- for my $j (0..$#a) {
- print "$a[$j]\n";
- }
- print "!!end of record\n\n";
- }
- my @CsvNew = ();
- my $CsvField = "";
- my $CsvCh = "";
- my $CsvState = "";
- sub ParseCsv {
- my $text = shift;
- @CsvNew = ();
- $CsvState = "stStart";
- sub endfield {
- push(@CsvNew, $CsvField);
- $CsvField = "";
- }
- sub addchar {
- $CsvField = $CsvField . $CsvCh;
- }
- sub error {
- die("Unexected char ('$CsvCh') in csvState $CsvState");
- }
- for my $i (0..length($text)-1) {
- $CsvCh = substr($text, $i, 1);
- #print "i=$i csvCh='$CsvCh' csvState=$CsvState\n";
- if ($CsvState eq "stStart") {
- if ($CsvCh eq ',') { endfield(); $CsvState="stStart" }
- elsif ($CsvCh eq '"') { $CsvState="stQuoted" }
- else { addchar($CsvCh); $CsvState="stUnQuoted" }
- }
- elsif ($CsvState eq "stUnQuoted") {
- if ($CsvCh eq ',') { endfield(); $CsvState="stStart" }
- elsif ($CsvCh eq '"') { error(); $CsvState="stQuoted" }
- else { addchar($CsvCh); $CsvState="stUnQuoted" }
- }
- elsif ($CsvState eq "stQuoted") {
- if ($CsvCh eq ',') { addchar($CsvCh); $CsvState="stQuoted" }
- elsif ($CsvCh eq '"') { $CsvState="stQuoteQuote" }
- else { addchar($CsvCh); $CsvState="stQuoted" }
- }
- elsif ($CsvState eq "stQuoteQuote") {
- if ($CsvCh eq ',') { endfield(); $CsvState="stStart" }
- elsif ($CsvCh eq '"') { addchar($CsvCh); $CsvState="stQuoted" }
- else { error(); $CsvState="stQuoted" }
- }
- }
- endfield();
- return @CsvNew;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement