Italian Mysql "LOAD DATA INFILE"

micro

Well-Known Member
Licensed User
Longtime User
Si Luca
grazie comunque.
Prima di postare ho guardato un po dappertutto e mi sono rifatto agli esempi visti, ma continua a non andare
e mostrare gli errori che ho postato.
Non capisco dove sbaglio e le prove sono state tante.
Non voglio utilizzare il classico caricamento a record perchè rallenterei il processo se i record sono tanti mentre con
questa funzione se ne occuperebbe il server mysql.
 

LucaMs

Expert
Licensed User
Longtime User
Questa è la query nel messaggio di errore:

F:\Progetti_SW_HW\B4J_Gest\products.csv INTO TABLE Products FIELDS TERMINATED

Non l'ho mai usato, ma dalla descrizione del comando, se usi la clausola facoltativa FIELDS TERMINATED, devi aggiungerci BY "qualcosa", cioè il separatore dei campi.
Essendo facoltativa, probabilmente di default usa già la virgola e ti basterebbe non inserirla (oppure passargli la virgola)


P.S.
Tu hai usato:
sql.ExecNonQuery("LOAD DATA INFILE " & namedir & "\" & namef & " INTO TABLE Products FIELDS TERMINATED BY ';'")

I campi sono separati da punto e virgola?
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Dato che ho tanto da fare e poca voglia di fare (o nessuna?), ho fatto una provola, direttamente in PHPMyAdmin:

LOAD DATA INFILE "FileDaImportare.csv"
INTO TABLE buttami


ha funzionato perfettamente, con questo file di testo:

1,"uno2","uno3"
2,"due2","due3"
3,"tre2","tre3"


Ora, però, devo provare con un campo PK autoincrement...


P.S. mica vero che ha funzionato perfettamente; avevo controllato solo che la query non desse errore ed il messaggio che diceva di aver inserito 3 record, ma ha inserito soltanto il primo campo, quindi è necessario dettagliare meglio la query.
 
Last edited:

micro

Well-Known Member
Licensed User
Longtime User
:) si ma la prova la devi fare con B4j, io è con questo che ho problemi è non so se sbaglio la query o è un problema del CSV anche se non credo perchè è un CSV creato da excel da un file xls.
Bye
 

LucaMs

Expert
Licensed User
Longtime User
evidentemente l'utente non ha il permesso per il file di testo!
Dato che ho tanto da fare e poca voglia di fare (o nessuna?), ho fatto una provola, direttamente in PHPMyAdmin:

LOAD DATA INFILE "FileDaImportare.csv"
INTO TABLE buttami


ha funzionato perfettamente, con questo file di testo:

1,"uno2","uno3"
2,"due2","due3"
3,"tre2","tre3"


Ora, però, devo provare con un campo PK autoincrement...


P.S. mica vero che ha funzionato perfettamente; avevo controllato solo che la query non desse errore ed il messaggio che diceva di aver inserito 3 record, ma ha inserito soltanto il primo campo, quindi è necessario dettagliare meglio la query.

In questo modo, sempre tramite PHPMyAdmin, l'importazione funziona bene:
LOAD DATA INFILE "FileDaImportare.csv"
INTO TABLE buttami
FIELDS TERMINATED BY ','


Funziona anche tramite query in B4J:
Private Query As String = "LOAD DATA INFILE 'FileDaImportare.csv' INTO TABLE buttami FIELDS TERMINATED BY ','"
 

LucaMs

Expert
Licensed User
Longtime User
Ora, però, devo provare con un campo PK autoincrement...

Se c'è un campo definito Auto Increment, è necessario elencare i nomi dei campi da riempire ed impostare a NULL il campo auto increment:

LOAD DATA INFILE 'FileDaImportare.csv'
INTO TABLE buttami
FIELDS TERMINATED BY ','
(Campo2, Campo3)
SET Campo1 = NULL

Probabilmente è meglio elencare sempre i nomi dei campi, anche quando non c'è un campo auto increment; può aiutare ad evitare errori (magari gli si passa il file csv sbagliato).
 
Last edited:

micro

Well-Known Member
Licensed User
Longtime User
Funziona anche tramite query in B4J:
Private Query As String = "LOAD DATA INFILE 'FileDaImportare.csv' INTO TABLE buttami FIELDS TERMINATED BY ','"

E' la query che utilizzo io, infatti puoi vedere nel forum inglese.
Comunque la riposto qui:
B4X:
sql.ExecNonQuery("LOAD DATA INFILE " & namedir & "\" & namef & " INTO TABLE Products FIELDS TERMINATED BY ';'")

exception
B4X:
java.lang.Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'F:\Progetti_SW_HW\B4J_Gest\products.csv INTO TABLE Products FIELDS TERMINATED' at line 1

Il problema potrebbe essere che nel csv manca il camp Id e io non lo setto.
Faccio qualche prova
 

micro

Well-Known Member
Licensed User
Longtime User
Niente
anche aggiungendo SET Id = NULL non funziona, mi dice sempre errore di sintassi.
Bhà
il percorso del file deve essere senza apici altrimenti mi dice che il file non è stato trovato.

Utilizzo il ; perchè è il mio separatore nel csv
 

LucaMs

Expert
Licensed User
Longtime User
il percorso del file deve essere senza apici altrimenti mi dice che il file non è stato trovato.
Nella query che ho usato io (B4J) devo usare gli apici singoli:
Private Query As String = "LOAD DATA INFILE 'FileDaImportare.csv' INTO TABLE buttami FIELDS TERMINATED BY ','"

Utilizzo il ; perchè è il mio separatore nel csv
Come separatore dei campi? O fine record?
 

micro

Well-Known Member
Licensed User
Longtime User
Come separatore dei campi? O fine record?
come separatore campi.
Dove tu dici 'FileDaImportare.csv' io ho il mio perocorso completo e se metto il carattare quote (') all'inizio e alla fine
mi dice file non trovato.
I soliti misteri....
 

LucaMs

Expert
Licensed User
Longtime User
Mi fa incaz... sta cosa, ti DEVE funzionare! :)

Non ho molto tempo, adesso :(

Uhm...

due provette:

1) metti un backslash prima del punto e virgola
2) prova ad usare Notepad ++ per "convertire" il file (menu Formato)


Dove tu dici 'FileDaImportare.csv' io ho il mio perocorso completo e se metto il carattare quote (') all'inizio e alla fine
mi dice file non trovato.
Sei sicuro del percorso? Dovrebbe essere [roba varia].mysql.data.[nome db]
 

micro

Well-Known Member
Licensed User
Longtime User
Sei sicuro del percorso? Dovrebbe essere [roba varia].mysql.data.[nome db]
Ma io intendo il percorso del mio file csv che devo importare e penso che possa essere da qualsiasi parte nel pc.
Comunque per ora ho risolto con LoadCSV e con la ExecNoQueryBatch, in debug e con un file di 6000 record con 12 campi
stiamo sul secondo ed è accettabile come tempo.
Grazie come sempre per l'impegno che ci metti ad aiutare chi chiede info.
Ci ritorno sul problema appena posso, adesso devo andare vanti.
 

LucaMs

Expert
Licensed User
Longtime User
Ma io intendo il percorso del mio file csv che devo importare e penso che possa essere da qualsiasi parte nel pc.
Comunque per ora ho risolto con LoadCSV e con la ExecNoQueryBatch, in debug e con un file di 6000 record con 12 campi
stiamo sul secondo ed è accettabile come tempo.
Grazie come sempre per l'impegno che ci metti ad aiutare chi chiede info.
Ci ritorno sul problema appena posso, adesso devo andare vanti.
Anche io intendo quel percorso e non posso far accedere al file in qualunque posizione sul disco, nel senso che MySql solleva un'eccezione per l'autorizzazione.
 
Last edited:
Top