erlug
[Top] [All Lists]

[Erlug] ancora bash scripting

To: Erlug <erlug@xxxxxxxxxxxxxx>
Subject: [Erlug] ancora bash scripting
From: Eagleone <andrea.scavolini@xxxxxxxxx>
Date: Sun, 3 Oct 2004 02:54:40 +0000
Il mio problema è questo: ho un file csv proveniente da un dump di un
db (di cui posso avere solo il csv purtroppo). Mediante csv2sql lo
converto in insert e così posso importare tutti i dati su un db
locale.

Con un po' di sed e dos2unix son riuscito a risolvere molti problemi
dati da diverse tabelle.

Me ne resta solo uno: alcune tuple del db contengono campi text su più
righe e questo fa impazzire csv2sql.

Nel file csv ci sono quindi delle righe con meno di n-1 ";" (ossia
delle tuple su più righe. Per fortuna l'ultima colonna del db è sempre
senza testo a capo)

Mediante script vorrei per lo meno individuare queste righe e magari
correggerle automaticamente.

Ad esempio due tuple sono:

---INIZIO---
2002;"0071";"334";"291";"S";2;;"3";"0071";"334";"000";"19338";"0";"010";;26;;10,
00;"B";;"L-ART/06";;"S"
2002;"0071";"334";"291";"S";2;;"3";"0071";"334";"000";"19340";"0";"010";;26;;5,0
0;"B";;"L-ART/06";"



";"S"
---FINE---

Ho provato a pescare una riga alla volta ma a quanto ne so non si fa
banalmente in bash. Uno stratagemma è usare head unito a tail e con un
contatore da 1 a `wc` pesco una riga alla volta. con una cosa del
tipo:

while (($handle<=$LINEE))
do
#echo "$handle"
line="$(head -$handle $FILEID |tail -1)"

CONTO=`echo "$line" | sed -e s/[^\;]//g | wc -c`

if (($CONTO!=$CONTO_CORRETTO))
then
echo "----> ERRORE ALLA LINEA: $handle" >> "$OUTERR"
echo "$line" >> "$OUTERR"
fi


Ma i files sono fino a 500000 e i tempi di calcolo diventano infiniti!

una soluzione potrebbe essere fare tutto al volo con sed... Ma non ho
idea di come si faccia a dirgli: "elimina il testo a capo a fine riga
se la riga contiene meno di n ;"....


Qualcuno ha idee?

ciao,
Andrea

<Prev in Thread] Current Thread [Next in Thread>