ArrayOfArrays to csv-file: первый внутренний массив пуст? - PullRequest
0 голосов
/ 15 марта 2019

следующий код берет загруженный csv-файл, сохраняет его в массиве массивов, а затем я пытаюсь создать новый csv-файл из этого массива массивов с помощью Text :: CSV_XS. Я знаю, что могу просто взять загруженный файл и сохранить его с помощью «move_to», но я не хочу этого делать.

Моя проблема здесь: Когда я сохраняю CSV-файл, первая и последняя строки этого CSV-файла пустые, и я не понимаю, почему. Может ли кто-нибудь объяснить, пожалуйста, мне?

package MyApp::Controller::Main;
use Mojo::Base 'Mojolicious::Controller';
use Text::CSV_XS qw( csv );
use Encode;
use Cwd;

sub upload {
    my $self = shift;
    return $self->render(text => 'File is too big.', status => 200) if $self->req->is_limit_exceeded;
    return $self->redirect_to('/') unless my $newCsv = $self->req->upload('fileToUpload')->slurp;

    open(my $myFH, '<',\$newCsv) or die $!;
    my @lines = readline($myFH);
    close($myFH);
    my $checkCsv = Text::CSV_XS->new({sep_char => ';', quote_char => '"'});
    my @csvArray = [];
    # my $arrayIndex = 0; #temp
    foreach my $line (@lines){
        $line = decode('UTF-8', $line);
        $line =~ s/\N{U+FEFF}//; # remove the BOM
        $line =~ s/\s+$//g; # remove \n
        if ($checkCsv->parse($line) and $checkCsv->fields()){
            my @fields = $checkCsv->fields();
            push(@csvArray, \@fields);
        }
    }

    $self->app->log->debug($self->dumper(@csvArray));

    my $size = $self->param('fileToUpload')->size;
    my $name = $self->param('fileToUpload')->filename;
    csv (in => \@csvArray, sep_char=> ";", out => getcwd.'/lib/MyApp/files/'.$name);
    # $self->app->log->debug(getcwd);
    my $delay = 3;
    $self->stash(delay => $delay, message => "Thanks for uploading $size byte file $name.<br>
        You will be redirected in $delay seconds");
    $self->render('main/upload');
}

Заранее спасибо.

1 Ответ

2 голосов
/ 15 марта 2019

Заменить

my @csvArray = [];   # Create empty array @cvsArray, then add a ref to an empty array to it.

с

my @csvArray = ();   # Create empty array @cvsArray, then empty it.

Еще лучше, просто используйте следующее:

my @csvArray;        # Create empty array @cvsArray.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...