#!/usr/bin/perl use strict; use warnings; use File::Find::Rule; use File::Basename qw(basename); use Data::Dump qw(dump); use Spreadsheet::Write; my @rinf = ('GCA_D', 'GCA_I', 'Koedam_D', 'Koedam_I', 'Kipps_F_D', 'Kipps_F_I', 'Kipps_A_D', 'Kipps_A_I', 'Kipps_P_D', 'Kipps_P_I', 'Scheltens_D', 'Scheltens_I', 'Fazekas' ); my $project = 'unidad'; my $ofile = 'reports_data.xls'; my $parse_dir = shift; my @txts = find(file => 'name' => "*.txt", in => $parse_dir); my %info; #dump @txts; foreach my $report (sort @txts){ my $name = basename $report; $name =~ s/\.txt$//; foreach my $iinf (@rinf){ if($iinf eq 'Fazekas'){ $info{$name}{$iinf} = 0; }else{ $info{$name}{$iinf} = "NA"; } } open IDF, "<$report"; my $this_line; while() { if (/Fazekas/i){ my ($fv) = /Fazekas\s*\d*-*(\d)/i; $info{$name}{'Fazekas'} = $fv if defined $fv; } if (/.*GCA.*/ and not /^Temporal/i){ my ($ad, $ai) = /.*\d*-*(\d)\s*\/*.*\d*-*(\d).*GCA.*/; $info{$name}{'GCA_D'} = $ad if defined $ad; $info{$name}{'GCA_I'} = $ai if defined $ai; }elsif(/Kipps/){ if(/frontal/i and /anterior/i and /posterior/i){ my ($af, $aa, $ap) = /.*\d*-*(\d)\/*\d*-*(\d)\/\d*-*(\d).*/; $info{$name}{'Kipps_F_D'} = $af if defined $af; $info{$name}{'Kipps_F_I'} = $af if defined $af; $info{$name}{'Kipps_A_D'} = $aa if defined $aa; $info{$name}{'Kipps_A_I'} = $aa if defined $aa; $info{$name}{'Kipps_P_D'} = $ap if defined $ap; $info{$name}{'Kipps_P_I'} = $ap if defined $ap; }else{ my ($ad, $ai) = /.*\d*-*(\d)\s*\/*.*\d*-*(\d).*Kipps.*/i; if(/Frontal/i){ $info{$name}{'Kipps_F_D'} = $ad if defined $ad; $info{$name}{'Kipps_F_I'} = $ai if defined $ai; }elsif(/anterior/i){ $info{$name}{'Kipps_A_D'} = $ad if defined $ad; $info{$name}{'Kipps_A_I'} = $ai if defined $ai; }elsif(/posterior/i){ $info{$name}{'Kipps_P_D'} = $ad if defined $ad; $info{$name}{'Kipps_P_I'} = $ai if defined $ai; } } }elsif(/Koedam/i){ if(/.*\d\s*\/*.*\d*-*\d.*/){ my ($ad, $ai) = /.*\d*-*(\d)\s*\/*.*\d*-*(\d).*Koedam.*/i; $info{$name}{'Koedam_D'} = $ad if defined $ad; $info{$name}{'Koedam_I'} = $ai if defined $ai; }else{ my ($ag) = /.*\d*-*(\d).*/; $info{$name}{'Koedam_D'} = $ag if defined $ag; $info{$name}{'Koedam_I'} = $ag if defined $ag; } }elsif(/Scheltens/i){ if(/bilateral/i){ my ($ag) = /.*\d*-*(\d).*/; $info{$name}{'Scheltens_D'} = $ag if defined $ag; $info{$name}{'Scheltens_I'} = $ag if defined $ag; }else{ if(/.*\d.*Scheltens.*/i){ my ($ad, $ai) = /.*\d*-*(\d)\s*\/*.*\d*-*(\d).*Scheltens.*/i; $info{$name}{'Scheltens_D'} = $ad if defined $ad; $info{$name}{'Scheltens_I'} = $ai if defined $ai; }else{ if(/.*\d*-*\d.*\d*-*\d.*/){ my ($ad, $ai) = /.*Scheltens.*\d*-*(\d).*\d*-*(\d).*/i; $info{$name}{'Scheltens_D'} = $ad if defined $ad; $info{$name}{'Scheltens_I'} = $ai if defined $ai; }else{ my ($ag) = /.*Scheltens.*\d*-*(\d)/i; $info{$name}{'Scheltens_D'} = $ag if defined $ag; $info{$name}{'Scheltens_I'} = $ag if defined $ag; } } } }elsif(/global/i and /cortical/i){ my ($ab) = /.*\d*-*(\d).*/; $info{$name}{'GCA_D'} = $ab if defined $ab; $info{$name}{'GCA_I'} = $ab if defined $ab; }elsif(/tempor/i and /mesial/i){ if(/bilateral/i){ my ($ag) = /.*\d*-*(\d).*/; $info{$name}{'Scheltens_D'} = $ag if defined $ag; $info{$name}{'Scheltens_I'} = $ag if defined $ag; }else{ my ($ad, $ai) = /.*\d*-*(\d).*\d*-*(\d).*/; $info{$name}{'Scheltens_D'} = $ad if defined $ad; $info{$name}{'Scheltens_I'} = $ai if defined $ai; } } } close IDF; } ############################################### # Este trozo de aqui es para sacar las fechas # ############################################### foreach my $subject (sort keys %info){ my $xorder = 'xnatapic list_experiments --project_id '.$project.' --subject_id '.$subject.' --label --date'; my ($xdata) = qx/$xorder/; $xdata =~ s/.*,(.*),.*/$1/; chomp $xdata; $info{$subject}{'date'} = $xdata; } ############################################## ############################################## ############################################## # Ahora, en lugar de ir imprimiendo # voy a armar las filas del output my @rows; $rows[0] = "Subject,Date"; foreach my $iinf (sort @rinf){ $rows[0] .= ",$iinf"; } my $count = 1; foreach my $subject (sort keys %info){ $rows[$count] = "$subject,$info{$subject}{'date'}"; foreach my $iinf (sort @rinf){ $rows[$count] .= ",$info{$subject}{$iinf}"; } $count++; } # y ahora intento escribir la filas en un xls my $workbook = Spreadsheet::Write->new(file => $ofile, sheet => 'DATA'); foreach my $row (@rows){ # Fabrico un array temporal porque es lo que entiende el modulo my @arow = split /,/,$row; $workbook->addrow(@arow); # y tambien saco la fila por STDOUT por si quiero generar un CSV # hacer un grep o cualquier otro tipo de postproc print "$row\n"; } $workbook -> close();