Voyons ceci:
► Afficher le texte
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
#include <windowsconstants.au3>
;# Ouverture Fichier CSV
Local $File = FileOpenDialog('Open csv', @ScriptDir & '\', 'Csv files (*.csv)', 1, 'base.csv')
Local $hFile = FileOpen($File)
;# Création Affichage compteur import
GUICreate("" , 150 , 50,100,-1,$WS_POPUP)
GUISetState()
$d=GUICtrlCreateLabel("" , 15 , 15 , 100 , 100)
;# Ouverture de la connexion Sqlite
_SQLite_Startup ()
If @error > 0 Then Exit MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
$bdd=_SQLite_Open ("AD.bdd")
If @error > 0 Then Exit MsgBox(16, "SQLite Error", "Can't Load Database!")
_SQLite_Exec (-1, "CREATE TABLE if not exists utilisateurs (Identifiant, Nom, Prénom, Groupe);")
Local $ligne, $data, $compte
$ligne = FileReadLine($hFile) ; lecture des en-tête (ignorés)
_SQLite_Exec (-1, "begin;")
;# debut Boucle d'insertion
While True
$ligne = FileReadLine($hFile)
If @error Then ExitLoop
$data = StringSplit($ligne, ',')
If $data[0] <> 4 Then
MsgBox(0, "Ligne mal formée", $ligne)
ContinueLoop
EndIf
;# insertion sqlite
; attention, les littéraux en SQL doivent être entre apostrophes '' (simple quote) et non ""
; d'autre part, si un champ contient une simple quote, il convient de la doubler
;~ _SQLite_Exec (-1, "INSERT INTO utilisateurs VALUES ('" & $IdentifiantCSV & "','" & $NomCSV & "','" & $PrenomCSV & "','" & $GroupCSV & "');")
_SQLite_Exec (-1, "INSERT INTO utilisateurs VALUES (" & _
_SQLite_Escape($data[1]) & "," & _
_SQLite_Escape($data[2]) & "," & _
_SQLite_Escape($data[3]) & "," & _
_SQLite_Escape($data[4]) & _
");")
$compte += 1
;# Mise à jour de la Affichage compteur import
GUICtrlSetData($d , $compte & " utilisateurs importés")
;# Fin de boucle
WEnd
_SQLite_Exec (-1, "end;")
FileClose($hFile)
;# Fermeture de la connexion Sqlite
_SQLite_Close ()
_SQLite_Shutdown ()
Ce n'est pas vraiment la peine de se faire suer avec des usines à gaz pareilles pour traiter les .CSV car il n'y en a pas deux qui respectent les mêmes conventions. De plus, comme ce sont en général des sources externes sur lesquelles l'on a peu ou pas du tout de contrôle, le format employé est bien (trop) souvent susceptible de changer. J'ai même une source qui me renvoie pas moins de trois formats distinct (et incompatibles) suivant le serveur qui me répond ! Ou bien je redemande le fichier en boucle jusqu'à "tomber" sur un serveur qui me fournit le format X attendu, ou bien je "depiaute" le premier fichier reçu pour déterminer dans quelle moulinette il faut le mixer...
Je traite une vingtaine de sources de .CSV et j'ai actuellement 17 routines distinctes. C'est du sur-mesure.
Ceci dit, cette UDF CSV est un modèle d'inefficacité, tes temps de traitement le montrent !
Attention à la quotation (escape) des littéraux SQL. La prochaine version de SQLite risque de ne plus faire l'interprétation elle-même, ce qui n'est pas plus mal. Donc 'abc' est un littéral chaîne, "abc" est un nom de table ou un alias, un nom d'index, un nom de base, ...
Pour info, vide ta base et refais les timmings avec et sans transaction
EDIT 2 : regarde aussi l'UDF AD dans le forum d'outre-étang (aka US), il pourrait t'être utile.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.