Acabo de empezar a codificar en Perl y solo estoy buscando si el código siguiente puede ser más eficiente o se puede hacer en menos líneas.Perl - Mejora del código
He investigado un poco sobre el módulo Win32::OLE
y el módulo Text::CSV
, pero este parecía ser el camino a seguir desde lo que he leído hasta ahora.
Esta pregunta es básicamente un novato que pregunta a un anciano: "Oye, ¿cómo me convierto en un mejor programador de Perl?"
El objetivo del código es obtener datos de rangos especificados en hojas especificadas de un libro de Excel y escribir el contenido de esos rangos en archivos CSV.
Además, sé que necesito implementar comprobaciones generales, como asegurarse de que mi $cellValue
esté definido antes de agregarlo a la matriz y tal, pero estoy buscando más estructura general. ¿Hay alguna manera de aplanar el bucle colocando toda la fila en una matriz a la vez, o todo el rango en una matriz o referencia, o algo de esa naturaleza?
Gracias
use strict;
use warnings;
use Spreadsheet::XLSX;
my $excel = Spreadsheet::XLSX -> new ('C:\scott.xlsm',);
my @sheets = qw(Fund_Data GL_Data);
foreach my $sheet (@sheets) {
my $worksheet = $excel->Worksheet($sheet);
my $cell = $worksheet->get_cell(25,0);
if ($cell) { # make sure cell value isn't blank
my $myFile = "C:/$sheet.csv";
open NEWFILE, ">$myFile" or die $!;
# write all cells from Range("A25:[MaxColumn][MaxRow]") to a csv file
my $maxCol = $worksheet->{MaxCol};
my $maxRow = $worksheet->{MaxRow};
my @arrRows;
my $rowString;
# loop through each row and column in defined range and string together each row and write to file
foreach my $row (24 .. $maxRow) {
foreach my $col (0 .. $maxCol) {
my $cellValue = $worksheet->{Cells} [$row] [$col]->Value();
if ($rowString) {
$rowString = $rowString . "," . $cellValue;
} else {
$rowString = $cellValue;
}
}
print NEWFILE "$rowString\n";
undef $rowString;
}
}
}
Por cierto, ¡su código ya es muy bueno para un no experto! Hay cosas que puede hacer para hacerlo más idiomático (vea las respuestas), ¡pero es un excelente comienzo! – DVK
@DVK +1 para el estímulo. Gracias. Es bueno saber que tengo un buen comienzo. –
Dado que esto no es una pregunta real, en mi humilde opinión, se habría adaptado mejor en http://codereview.stackexchange.com/ – dgw