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
|