perl csv transpose

Transposición de datos CSV en Perl



transpose (1)

Soy un principiante de Perl y actualmente estoy trabajando en un script de Perl para automatizar algunas de nuestras tareas. Una secuencia de comandos en la que estoy trabajando implica extraer datos de rendimiento de nuestro sistema, almacenarlos en archivos CSV y generar gráficos de Excel. Después de unos días de trabajar en este script, he logrado obtener los datos extraídos en CSV, pero ahora, ¡estoy teniendo dificultades para tratar de transponer los datos! He visto este hilo (gracias a Dalton por el guión): hilo stackoverflow , pero no puedo aplicarlo en mi caso.

Básicamente, mi archivo CSV contiene datos diarios por fila, con las columnas como las horas del día (24 horas):

29-Aug-2013,3.68,3.63,3.75,3.65,3.65,3.11,3.34,2.74,2.83,2.52,3.19,4.24,3.84,3.61,3.69,2.96,2.76,2.91,3.70,3.82,3.70,3.54,2.54,3.90 30-Aug-2013,3.46,2.97,3.83,3.55,3.41,3.47,3.32,2.81,2.80,2.32,3.17,3.60,3.63,3.83,3.67,2.92,2.34,3.21,3.45,3.51,3.57,3.46,3.52,4.19 31-Aug-2013,3.19,3.50,4.01,3.91,3.71,3.33,3.20,2.95,2.90,2.37,3.07,3.48,2.86,3.29,3.22,2.52,1.83,2.83,3.54,3.49,3.62,3.59,3.54,3.31 01-Sep-2013,2.88,3.16,2.79,2.90,3.78,3.18,3.26,2.84,3.21,2.50,3.35,3.78,3.30,4.04,3.80,3.07,3.23,3.54,3.30,3.43,3.56,3.48,3.60,3.78 02-Sep-2013,3.28,2.92,3.89,3.78,3.54,3.09,3.08,2.79,2.87,2.43,2.70,3.64,3.79,3.88,3.88,3.28,2.90,3.37,3.25,3.60,3.45,3.39,2.84,4.07 03-Sep-2013,3.31,2.54,3.59,3.59,3.50,3.10,2.98,2.63,3.20,2.53,2.92,3.42,3.76,3.07,3.41,2.42,2.12,3.19,3.32,3.08,3.63,3.50,3.71,3.75 04-Sep-2013,3.64,3.48,2.86,3.57,3.68,3.53,3.34,2.89,2.79,2.64,3.30,4.04,4.17,3.70,3.81,2.96,3.41,3.48,3.66,3.05,3.23,3.41,3.15,4.31

Ahora, quiero transponerlo para que los datos resultantes que voy a escribir en un nuevo archivo CSV se verán así:

Time,29-Aug-2013,30-Aug-2013,1-Sep-2013,2-Sep-2013,3-Sep-2013,4-Sep-2013 01:00,3.68,3.46,3.19,2.88,3.28,3.31,3.64 02:00,3.63,2.97,3.50,3.16,2.92,2.54,3.48 03:00,3.75,3.83,4.01,2.79,3.89,3.59,2.86 ...

Ahora, mi script se ve así:

my @rows = (); my @transposed = (); open F1,"D://Temp//perf_data.csv"; while(<F1>) { chomp; push @rows, split [ /,/ ]; } #print @rows; for my $row (@rows) { for my $column (0 .. $#{$row}) { push(@{$transposed[$column]}, $row->[$column]); } } for my $new_row (@transposed) { for my $new_col (@{$new_row}) { print $new_col, ","; } print "/n"; }

¡Ni siquiera puedo obtener un resultado de esto ya! ¿Alguien puede ayudarme a dar algunos consejos sobre cómo puedo hacer esto? ¡Gracias por adelantado!


Hiciste un error simple, pero crítico.

split [ /,/ ]

debiera ser

[ split /,/ ]

La sintaxis para split es

split /PATTERN/, EXPR, LIMIT

Donde los dos últimos son opcionales. Lo que está haciendo es pasar una referencia de matriz anónima como PATTERN , que muy probablemente se codifica en algo como ARRAY(0x54d658) . El resultado es que la línea no está dividida, y toda la línea se inserta en la matriz. Más adelante, eso hará que la desreferencia de $row falle con el error

Can''t use string ("29-Aug-2013,3.68,3.63,3.75,3.65,"...) as an ARRAY ref while " strict refs" in use at foo.pl line 18, <F1> line 7.