[risolto][bash] Trasformare righe per insert

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

[risolto][bash] Trasformare righe per insert

Messaggio da ienaplinsky »

Ciao a tutti,
ho delle righe di un file fatte come nell'allegato. Vorrei arrivare a costruire una insert valida per il db. Sono arrivato fino ad un certo punto:
1) sostituisco il separatore di colonna "|$|" con "," e le date non valide con "".

Codice: Seleziona tutto

sed 's/|\$|/\,/g;s/01\/01\/0001\ 00:00:00//g;s/01\/01\/0001//g'  esempio.txt
2) inserisco ad inizio di ogni riga "(" e alla fine "),"

Codice: Seleziona tutto

| awk '{print "("$0"),"}' 
3) elimino le colonne 10 e 30

Codice: Seleziona tutto

| cut -d , -f10,30 --complement
4) inserisco il comando di insert e redirigo l'output su un nuovo file

Codice: Seleziona tutto

| sed '1iINSERT INTO table VALUES (col1, col2, ...., coln)' >> esempio.sql
il comando dall'1 al 4 sono in pipe
5) elimino gli spazi inutili

Codice: Seleziona tutto

awk 'BEGIN{ FS=" *,"; OFS=","} {$1=$1; print $0}' esempio.sql > esempio2.sql  
nel file ci sono alcune colonne che hanno degli 0 iniziali vorrei sostituire le stringhe fatte ad esempio cosi "000000000" con "0"
ho provato con questo

Codice: Seleziona tutto

sed 's/\b\(0*\)//g' >> esempio2.sql  

vengono preservati i segni (ci sono delle stringhe -00000001 che diventano -1) ma le stringe con tutti 0 vengono rimosse. Io vorrei lasciare lo 0 finale. Qualcuno sa come fare?
Inoltre vorrei mettere il carattere ' ad inizio ed alla fine di alcune colonne scelte da me ad esempio la 1 la 22 ecc qualcuno saprebbe come fare anche questo?
Se inoltre avete una soluzione puù elegante è ben accetta.

ps: Sto facendo questa cosa perchè il comando di import ci ha impiegato 11 ore e volevo vedere se con una insert secca risparmiamo un pò di tempo.

Grazie mille
Allegati
esempio.txt
(489 Byte) Scaricato 14 volte
Ultima modifica di ienaplinsky il martedì 14 giugno 2016, 14:20, modificato 1 volta in totale.
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [bash] Trasformare righe per insert

Messaggio da melfnt »

Potresti postare anche il file che sei riuscito ad ottenere finora?

Comunque, per sostituire sequenze di zeri con un solo zero:

Codice: Seleziona tutto

sed -r 's/0+/0/g'
Per l'altro problema: sai quali sono i numeri delle colonne nelle quali inserire gli apici? In tal caso puoi usare paste

(;
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [bash] Trasformare righe per insert

Messaggio da ienaplinsky »

Ciao,

grazie per la risposta. Allora ti allego i file dopo i vari passaggi.

esempio.sql è il file prodotto fino al punto 4 partendo dal file che ho allegato al primo post.
esempio2.sql è il file pordotto dopo il punto 5.
esempio3.sql è il file prodotto dalla sed che mi hai postato.

Però ho notato che facendo le insert con i numeri delle mie colonne ad esempio -0000000001 (la colonna 12 del file esempio2.sql) il db la legge correttamente come -1, quindi l'ultimo passaggio di sed è ridondante e posso saltarlo credo.

Per il problema degli apici mi basterebbe capire come mettere degli apici in determinate colonne, in questo caso puoi scegliere una qualunque l'importante è capire come fare.

EDIT: Ho dovuto modificare l'estensione del file da sql a txt perchè non mi faceva l'upload
Allegati
esempio3.txt
(191 Byte) Scaricato 9 volte
esempio2.txt
(357 Byte) Scaricato 18 volte
esempio.txt
(436 Byte) Scaricato 17 volte
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [bash] Trasformare righe per insert

Messaggio da melfnt »

prova

Codice: Seleziona tutto

awk '{print $1, "\x27"$2"\x27", $3 }'
per mettere la seconda colonna fra apici. \x27 è il carattere ASCII per l'apice.
Con awk puoi anche usare i cicli per stampare specifiche colonne, per esempio da 1 a 50, poi la 51 fra apici, poi da 52 a 60 e così via

(;
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [bash] Trasformare righe per insert

Messaggio da ienaplinsky »

Grazie mille, ho capito come fare.

metto risolto.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti