Visualizzazione post con etichetta perl. Mostra tutti i post
Visualizzazione post con etichetta perl. Mostra tutti i post

giovedì 9 dicembre 2010

Problemi di encoding UTF-8 su script Perl

Ho uno script che legge un file CSV, fa alcune elaborazioni e poi genera un nuovo file CSV su standard output.

Problema: se il csv sorgente contiene dei caratteri estesi in encoding utf8 (ad esempio le lettere tedesche che l'umlaut) mi trovavo nell'output degli errori:
Cannot parse:__contenuto_della_riga_del_csv__
Soluzione: dire a Perl che quello che sta leggendo e' un file utf8, trasformando la riga:

 open (CSV, '<:', $file)
in:

 open (CSV, '<:utf8', $file)
Questo ha fatto sparire i warning relativi al parsing del file, pero' l'output risultava errato con i caratteri estesi sostituiti da orrende sequenze e codici.

Il nuovo problema era che l'output veniva encodato in ISO-8859
Per forzare le scritture su standard output in UTF8, bisogna inserire a inizio script la riga:
binmode STDOUT, ":utf8";




giovedì 26 novembre 2009

Trovare i file che contengono due parole.

Metodi scaturiti da un thread su Erlug.

BASH
grep -l stringa1 * | xargs grep -l stringa2

o meglio
grep -lZ stringa1 * | xargs -0 grep -l stringa2 )

oppure
comm -1 -2 <(grep -wl stringa1 * | sort) < (grep -wl stringa2 * | sort)

Note:
Il parametro -l del comando grep nasconde il normale output e visualizza solo il nome dei che contengono il pattern ricercato.

Il parametro -Z del comando grep inserisce un carattere NULL come carattere conclusivo di ogni nome file da visualizzare: viene usato in caso l'output di grep debba essere passato a qualche altro comando (nell'esempio xargs)

Il comando comm confronta due file ordinati linea per linea.

Il parametro -1 del comando comm esclude dall'output le linee uniche del primo file

Il parametro -2 del comando comm esclude dall'output le linee uniche del secondo file

PERL
perl -n0e 'if(/stringa1/&&/stringa2/){print "$ARGV\n"}' *

AWK

awk 'FNR==1{stringa1=0;stringa2=0}
/stringa1/{stringa1=1}
/stringa2/{stringa2=1}
stringa1 && stringa2 {print FILENAME; nextfile}' *

domenica 30 agosto 2009

Perl: Upload su rapidshare da linea di comando


Potete eseguire upload su rapidshare.com direttamente da linea di comando con lo script perl che trovate all'URL:
http://images.rapidshare.com/software/rsapi.pl

venerdì 12 giugno 2009

Perl: installare i moduli

Per installare un modulo perl lanciate il seguente comando da shell:
cpan -i [NOMEMODULO]

es:
cpan -i MIME::Lite

Perl: elencare i moduli installati

Per sapere quali moduli perl sono stati installati sul sistema potete lanciare il comando:
instmodsh

Vi appare un menu, e il prompt cmd.
Digitando la lettera L ottenete la lista dei moduli installati.
Digitando la lettera Q uscite dal programma tornando alla shell.

Convertire un file da xls a csv da linea di comando

Eseguire i comandi seguenti (sostituire [STRINGACASUALE] con quella che troverete nella vostra cartella build):

cpan -i Spreadsheet::ParseExcel
cpan -i Spreadsheet::Text::CSV_XS
cp ~/.cpan/build/Spreadsheet-ParseExcel-0.49-[STRINGACASUALE]/sample/xls2csv.pl /usr/local/bin/
chmod +x /usr/local/bin/xls2csv.pl


Lanciate la conversione con il comando:
xls2csv.pl nomefile.xls [COLONNA1][RIGA1]:[COLONNA2][RIGA2]

es:
xls2csv.pl test.xls A1:G2

Se volete indicare anche il foglio di lavoro da esportare dovete usare la sintassi seguente:

xls2csv.pl nomefile.xls [FOGLIO]-[COLONNA1][RIGA1]:[COLONNA2][RIGA2]


es:
xls2csv.pl test.xls 1-A1:G2


L'output viene visualizzato a video. Se il risultato vi soddisfa potete ovviamente salvarlo su file mediante redirezione dello standard output:

es:
xls2csv.pl test.xls A1:G2 > test.csv

Purtroppo la parte seguente non funziona correttamente....vedremo in seguito quale soluzione adottare:

Se il file xls contiene caratteri accentati o il simbolo dell'Euro, probabilmente riceverete la segnalazione seguente:
Wide character in print at ./xls2csv.pl line 44.

e i caratteri accentati / simboli saranno sostituiti da arcani simboli.

Potete risolvere la cosa aggiungendo la linea
use utf8;

nei pressi delle altre clausole "use" all'interno del file xls2csv.pl

martedì 22 aprile 2008

syslog: perl: warning: Setting locale failed.


Diversi log riportavano questa segnalazione:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:

LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_GB.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").



In effetti solo il locale it_IT.UTF-8 era installato sulla macchina.

Soluzione:

apt-get install locales (pacchetto comunque gia' installato)
dpkg-reconfigure locales (scegliendo it_IT.UTF-8, en_GB.UTF-8 e nessun locale di default)