Я пытаюсь манипулировать csv в perl.
На входе csv есть несколько символов новой строки в данных столбца, что вызывает сбой другой внешней программы. Я написал ниже сценарий Perl для предварительной обработки csv для удаления этих символов.
use strict;
use warnings 'all';
# Using Text::CSV file to allow
# full CSV Reader and Writer
use Text::CSV;
use open ":std", ":encoding(UTF-8)";
my $file = $ARGV[0] or die;
my $csv = Text::CSV->new (
{
binary => 1,
auto_diag => 1,
sep_char => ', '
});
my $sum = 0;
# Reading the file
open(my $data, '<:encoding(utf8)', $file) or die;
while (my $words = $csv->getline($data))
{
tr/\r\n//d for @$words; #removing new lines
tr/,/;/ for @$words; #replacing comma with semicolon
$csv->combine(@$words);
print $csv->string, "\n";
}
# Checking for End-of-file
if (not $csv->eof)
{
$csv->error_diag();
}
close $data;
Я использую приведенный ниже сценарий оболочки в качестве оболочки для хранения измененного файла в другом файле csv. Оболочка оболочки ниже.
perl xyz.pl ${source_csv_file_name} > ${destination_processed_csv_file_name}
Я надеялся, что смогу использовать обработчик out csv в самом скрипте perl для записи вывода в другой файл. Я пробовал несколько способов, но продолжаю получать ту или иную ошибку. Ниже приведено кое-что, что я попробовал.
my $outcsv = Text::CSV->new ( { binary => 1, quote_char => "", escape_char => "\\" } );
open(my $data, '<:encoding(utf8)', $file) or die;
open(my $fh, ">:encoding(utf8)", "new.csv") or die " new.csv: $!";
while (my $words = $csv->getline($data))
{
tr/\r\n//d for @$words;
tr/,/;/ for @$words;
$csv->combine(@$words);
# Open a handle to the file "new.csv"
$outcsv->print ($fh, $_) for @words;
#print $csv->string, "\n";
}
# Checking for End-of-file
if (not $csv->eof)
{
$csv->error_diag();
}
close $data;
close $fh or die "new.csv: $!";
Проблема - первый код, который я разместил выше, работает, но для записи файла я использовал оболочку оболочки. Теперь второй perl скрипт (я только разместил код, который отличается от первого), когда я запускаю, он завершается с ошибкой. Я понимаю эту ошибку, но не уверен, как ее исправить "Глобальный символ @words требует явного имени пакета в строке xyz.pl 29. Выполнение xyz.pl прервано из-за ошибок компиляции. Буду очень признателен, если кто-то сможет помочь здесь.
Спасибо