"This is a column","Yes, I know",12323,23123.23,"This is a \"column\""
####
This is a column
Yes, I know
12323
23123.23
This is a "column"
####
#!/usr/bin/perl -w
use strict;
my $origin = '"This is a column","Yes, I know",123123,23123.23,"This is a \"column\""';
my @cols = parse_line($origin);
print join("\n", @cols)."\n";
sub parse_line {
my $line = shift;
my @contexts;
my $context = "";
my $column;
my @cols;
my $string_delim = '"';
my $escape_char = "\\";
my $field_delim = ',';
for (my $i = 0; $i < length $line; $i++) {
my $c = substr($line, $i, 1);
if ($c eq $string_delim) {
if ($context eq "string") {
$context = shift @contexts;
} elsif ($context eq "escape") {
$column .= $c;
$context = shift @contexts;
} else {
push @contexts, $context;
$context = "string";
}
} elsif ($c eq $escape_char) {
if ($context eq "escape") {
$column .= $c;
$context = shift @contexts;
} else {
push @contexts, $context;
$context = "escape";
}
} elsif ($c eq $field_delim) {
if ($context eq "string") {
$column .= $c;
} elsif ($context eq "escape") {
$column .= $c;
$context = shift @contexts;
} else {
push @cols, $column;
undef $column;
}
} else {
$column .= $c;
}
if ($i == length($line) - 1) {
push @cols, $column;
undef $column;
}
}
return @cols;
}