Perl читать CSV и манипулировать датами и числами - PullRequest
0 голосов
/ 29 марта 2020

Я столкнулся с проблемой и потратил немало часов на ее понимание ...

Я хочу прочитать файл .csv, используя perl, найти дату (и цифры), упорядочить дату в другом формате и добавить числа к существующему номеру.

Данные в .csv представляют собой простые поля с ";" delimeter.

Дата существует в формате 01.01.2000 в файле .csv, и я хотел бы отформатировать ist в 2000-01-01. Сумма существует в форме "-200".

Теперь чтение и помещение его в переменные работает нормально. Однако переменные не ведут себя так же, как другие, я не могу правильно использовать регулярные выражения для них, и если я пытаюсь добавить сумму в другую переменную, я получаю следующую ошибку: Аргумент "\ x {0} - \ x {0} 5 \ x { 0}, \ x {0} 6 \ x {0} 6 \ x {0} "кроме нумерации c (+)

Теперь мне кажется, что есть проблема с кодирование данных, которое я не обработал правильно, но после нескольких попыток «endode, decode, upgrade downgrade et c» я просто не могу заставить его работать. И если я сохраню эти переменные в текстовом файле и открою их вручную, это скажет мне, что файл закодирован в utf8 и предназначен только для чтения.

Что мне здесь не хватает и что мне нужно понять относительно кодировку, я много об этом читал, но до сих пор не понял в моем случае.

Редактировать: Извините за мой предыдущий недостаточный код. Следующий код должен работать сам по себе:

#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use Text::CSV;
use Data::Dumper qw(Dumper);

my $file = "test.csv";
my $s_delimiter = ";";

open(my $fh, '<', $file) or die("ERROR open $file ($!)\n");

my $csv = Text::CSV->new({binary => 1, sep_char => $s_delimiter});

# read File
while( my $row = $csv->getline( $fh ) )
{
    my @array = @{$row};
    my $arraylength = @array;

    my $date = $array[2];
    my $amount = $array[6];

    $amount += 200;

    print "$amount\n";
    $date =~ /(\d\d).(\d\d).(\d\d\d\d)/;

    print "$date\n";
    print "$3 $2 $1\n";
}

close $fh;

Спасибо за вашу помощь заранее!

1 Ответ

1 голос
/ 29 марта 2020

Благодаря комментариям я проверил кодировку в CSV-файле и сам выяснил, что строку

open(my $fh, '<', $file) or die("ERROR open $file ($!)\n");

пришлось изменить на

open(my $fh, '<:encoding(UTF-16LE)', $file) or die("ERROR open $file ($!)\n");

, поскольку кодировка UTF-16, который я сначала не осознавал.

Но все же спасибо вам за комментарии, они были причиной, по которой я нашел мою ошибку:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...