Несколько файлов XLSX в несколько файлов CSV с использованием perl - PullRequest
1 голос
/ 18 июня 2020

У меня есть сценарий ниже, который преобразует xlsx в csv, но если значение ячейки имеет запятую (,) между ними, оно перемещается к следующему столбцу в csv, что неверно. Колуд поправьте пожалуйста? Кроме того, как преобразовать несколько файлов xlsx в несколько файлов csv в один go?

#!/usr/bin/perl

use strict;
use warnings;
use Spreadsheet::XLSX;
use Text::CSV qw(csv);

my $excel = Spreadsheet::XLSX -> new ('/path/file.xlsx');
my $csv = '/path/File.csv';
open(my $FH ,'>',"$csv") or die "failed to open";

my $line;
foreach my $sheet (@{$excel -> {Worksheet}}) {
    printf("Sheet: %s\n", $sheet->{Name});
    $sheet -> {MaxRow} ||= $sheet -> {MinRow};
    foreach my $row ($sheet -> {MinRow} .. $sheet -> {MaxRow}) {
        $sheet -> {MaxCol} ||= $sheet -> {MinCol};
        foreach my $col ($sheet -> {MinCol} ..  $sheet -> {MaxCol}) {
            my $cell = $sheet -> {Cells} [$row] [$col];
            #if ($cell) {
            #    $line .= "\"".$cell -> {Val}."\",";
                        #       $line .= $cell -> {Val};
                        #       if ($col != $sheet -> {MaxCol}) #appends the comma only if the column being processed is not the last
                        #       {
                        #               $line .= ",";
                        #       }
            #}
                        if (defined $cell && defined $cell->Value) {
               if ($col != $sheet -> {MaxCol})
               {
               print $FH $cell->Value.",";
              }
            else
             {
            print $FH $cell->Value ;
             }
          } else {
            if ($col != $sheet -> {MaxCol})
               { print $FH ",";
               }
             }

        }
$FH =~ s/,$//; # replace comma at the end of the string with empt
       print $FH "\n";
      }

Ответы [ 2 ]

3 голосов
/ 23 июня 2020

Убедитесь, что значение ячейки содержит символы ','. if ',' char, присутствующий в sting, добавляет к строке двойные кавычки. Напишите метод и передайте значение $ cell->, чтобы проверить, что строка содержит char ','.

, например

sub check_cell_string {     
    my ($string) = @_;     
    my $substr = ',';     
    if (index($string, $substr) != -1) { 
        $string = '"'.$string.'"';
    }     
    return $string; 
} 

, а затем вызовите оператор записи файла.

my $str = check_cell_string($cell->value);
print $FH $str;

например, в файле csv запись выглядит так:

1, 1928,44,Emil Jannings,"The Last Command, The Way of All Flesh"
1 голос
/ 23 июня 2020

Что касается вопроса о нескольких файлах, вы должны иметь возможность сделать что-то вроде этого:

my @csv = ('/path/File.csv', 'secondfile', 'thirdfile');

foreach (@csv)
{
    my $excel = Spreadsheet::XLSX -> new ($_.".xslx");
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...