linux user group brescia

immagine del castello

Archivio della mailing list

Un problemino con Perl e Postgres

DisKre Panza demokrito a tin.it
Dom 15 Lug 2001 19:29:50 UTC
Ciao a tutti!

   Non sono morto,  semplicemente mi sono messo  a trafficare per
conto mio cercando di non fare piu` domande da 'RTFM'... :)

   ...e magari questa sara` cmq una di quelle...

   Ho iniziato  a studiare  il Perl, e  mi ci  trovo 'abbastanza'
bene. E`  cmq quel  che cercavo  per trattare  i testi.  Poi sono
passato  a Postgres,  e  anche  questo non  c'e`  male. Poi  sono
passato all'unione  dei due  (ovvio, no?). Ecco,  per ora  non mi
interessano  interazioni strane  con il  web, quelle  semmai piu`
tardi.

   Dunque:  leggo  un  file  composto  da  righe  che  contengono
ciascuna 3 campi separati dal  carattere '|' (pipe, o or). Questo
e`  il frammento  che inserisce  i  dati nel  database (che  lui,
poverino, funziona!):

-----------------------------------------------------------------
$conn = Pg::connectdb("dbname=prova user=demokrito");

while( $riga = <IN> ) {
    chop $riga;
    @testo = split( /\|/, $riga );
    $query = "INSERT INTO tabella (testo1, testo2, testo3)
              VALUES ('@testo[0]', '@testo[1]', '@testo[2]')";
    $result = $conn->exec( $query );
}
-----------------------------------------------------------------

   Dove sta il  problema? Semplicemente che in  qualcuno dei vari
campi di  testo - non importa  quale, puo` essere qualsiasi  - e`
presente il  carattere < ' >  (l'apostrofo), e cosi`,  essendo la
query  impostata  appunto  con  gli  apostrofi < ' @testo[0] ' >,
postgres se ne esce con un bel, ad esempio

> ERROR:  parser: parse error at or near "asse"

perche' c'era  una parola tipo  < l'asse >... e  ovviamente salta
l'inserimento dell'intero record.

   Prima che mi  si consigli di usare le  "" (virgolette), oppure
di  usare solo  le < , >  (virgole),  come  separazione, vi  dico
subito che nei vari campi  di testo possono esserci *anche* testo
fra "virgolette", ed anche virgole...

   L'ideale  sarebbe  forzare  il  separatore fra  i  campi,  per
esempio  usando  VALUES (|@testo[0]|,  |@testo[1]|,  |@testo[2]|)
(cosa che ho provato, per la serie non si mai... con il risultato
che vi lascio immaginare).

   Insomma, sono a un punto fermo.  Non so che pesci pigliare. Ho
cercato fra  la documentazione,  ma questa  volta proprio  non ne
sono venuto a capo

   Grazie per l'aiuto.

-- 
Fakkino(?) DisKre Panza




Maggiori informazioni sulla lista Lug