Newsgroup: it.comp.lang.perl
Titolo: Un piccolo aiuto per la lettura di un file ascii.

Salve.
Potete aiutarmi?
Dovrei leggere i vari record di un file di testo suddividere i dati e
scaricarli in una tabella di MySQL.
Le righe del file sono di questo tipo: F9960101   Mauro Sanna 02 NN.
Dovrei poter suddividere questa linea in modo da avere "F9", "96", "01",
"01", "Mauro", Sanna", "NN" e portare questi singoli dati nella tabella.
Come potrei fare?
Grazie.
 _  _  __
|  \/  |(_/ _     _  _  _
|      |/_)(_)_|  )|  )(_)_
     Mauro Sanna
(
mrs...@tin.it
)
--
Automatic posted from 
mail.tin.it
 [194.243.154.49]
via Mailgate Server - 
http://www.mailgate.org

 "01", "Mauro", Sanna", "NN" e portare questi singoli dati nella tabella.
 ($junk, $name, $surname, $O2, $nn)  = split(/\s+/, $string);
 $f1=substr($junk,0,2);
 $f2=substr($junk,2,4);
 [..]
Ci dev' essere un modo piu' elegante (specie per la substring) che
usi unpack, ma ora non lo trovo...
Cheers,
	Alessandro

  $f2=substr($junk,2,4);
a me le substr non sono mai piaciute ...
direi che si possa tentare con una cosa tipo
$junk =~ /(\w\w)(\w\w)(\w\w)(\w\w)/;
e avrai i vari pezzi in $1, $2 ... almeno spero (non ho procvato).
pietro
--
                     Rapresentante degli studenti
             in consiglio di laurea di Informatica e Scienze
                        dell'informazione,
             in consiglio di facolta di Scienze MM.FF.NN.
---
Undergraduate student of Computer Science - ALMA MATER STUDIORUM Bologna -
Alias:  
coc...@iperbole.bologna.it

 wrote:
:>  ($junk, $name, $surname, $O2, $nn)  = split(/\s+/, $string);
:>  $f1=substr($junk,0,2);
:>  $f2=substr($junk,2,4);
: a me le substr non sono mai piaciute ...
: direi che si possa tentare con una cosa tipo
: $junk =~ /(\w\w)(\w\w)(\w\w)(\w\w)/;
: e avrai i vari pezzi in $1, $2 ... almeno spero (non ho procvato).
Dovrebbe essere piu` veloce usare unpack.
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E

 Dovrebbe essere piu` veloce usare unpack.
Infatti.
@fields=unpack('A2A2A2A2',$junk)
Cheers,
	Alessandro


Ok. Perfetto.A quanto pare la split(/\s+/) mi suddividde la stringa in diversi campi tenendo conto
delllo spazio come carattere separatore. Il problema e' che il campo relativo al nome ed al cognome
sono lunghi 20 caratteri ciascuno e non hanno caratteri separatori, inoltre mi si presentano spesso
situazioni relative al nome del tipo "Angelo Carlo Maria".
Come si puo' risolvere?
Grazie.
--


 Grazie.
In generale:
i) Hai record a formato variabile, con separatore.
Allora si usa split, giocando sulla regexp per individuare il separatore
(ma puo' non essere sufficiente se il separatore puo'
essere parte dei campi, opportunamente protetto - caso dei CSV.
In questo caso puoi vedere come e' fatto CSV.pm su CPAN)
ii) Hai un record con campi a formato fisso, senza separatore.
Allora puoi usare unpack:
@fields=unpack('A20A20A4A2A2A2', $record);
mette in fields due stringhe da 20 caratteri,una da 4 etc...
==> perldoc perlfunc - cerca pack e unpack
iii) Hai un caso ibrido - la strategia sara' ibrida ;)
Cheers,
	Alessandro


Scusa l'ignoranza ma cosa vuol dire CSV?


 
Comma Separated Values. E' il formato di export di Excel, Lotus etc.
(Dove il separatore puo' essere la virgole, il Tab).
Es.:
"Alessandro Forghieri, Difensore della fede",Via Dai
Piedi,41100,Modena,ITALY
Le virgole separano i campi, tranne quando sono racchiuse tra
virgolette. Poi ci sono regole
per l'escape delle virgolette, etc.
Cheers,
	Alessandro

>
Un modo c'è tuttavia è un po' lungo:
1 usare come già scritto ($dato1,$dato2,$dato3)=split(/ /,$dati);
2 dividere carattere per carattere e inserirlo su un array e poi confrontare
cioe:
  @caratteri=split(/ */,$parte)
Saluti Diego

tabella.
Suggerisco:
se $riga è una delle tue righe
$riga =~ /^(\w\d)(\d\d)(\d\d)(\d\d)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)/;
in $1 ... $8 avrai i campi che ti interessano
$1 = "F9"
$2 = "96"
ecc
ciao
Stefano Pisani