Text::CSV can help in parsing the quoted fields with commas.
Quoting the fields containing commas in the original data stops those commas from being interpreted as separator characters. Changing the separator to a pipe character (|) removes that requirement. Consider whether |ccc, ddd| is sufficient for your needs or do you really want |"ccc, ddd"|.
If the former, this skeleton code shows the technique:
#!/usr/bin/env perl use strict; use warnings; use Text::CSV; my $csv = Text::CSV::->new() or die Text::CSV::->error_diag(); while (my $row = $csv->getline(\*DATA)) { print join('|' => @$row), "\n"; } __DATA__ aaa,bbb,"ccc, ddd",fff
Output:
$ pm_csv_to_psv.pl aaa|bbb|ccc, ddd|fff
If you want to retain the quotation marks, you can change the print line to:
print join('|' => map { /,/ ? '"'.$_.'"' : $_ } @$row), "\n";
(There may be a more elegant way to do that.)
Output:
$ pm_csv_to_psv.pl aaa|bbb|"ccc, ddd"|fff
-- Ken
In reply to Re: Converting File Delimiters
by kcott
in thread Converting File Delimiters
by mmueller44
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |