Page 1 sur 1

[R] Sqlite et les accents

Posté : jeu. 08 sept. 2016 10:41
par walkson
Bonjour,
J'aimerais savoir s'il est possible d'importer un CSV avec sqlite3.exe et de conserver les accents dans la base.
En reprenant l'exemple de l'aide:
#include <File.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <StringConstants.au3>

; Filenames
Local $sTsvFile = FileGetShortName(_TempFile(@ScriptDir, "~", ".tsv"))
Local $sDbFile = FileGetShortName(_TempFile(@ScriptDir, "~", ".db"))

; Create Tsv File
FileWriteLine($sTsvFile, "é" & @TAB & "à" & @TAB & "ê")
FileWriteLine($sTsvFile, "a1" & @TAB & "b1" & @TAB & "c1")
FileWriteLine($sTsvFile, "a2" & @TAB & "b2" & @TAB & "c2")

; import (using SQLite3.exe)
Local $sIn, $sOut, $i, $sCreate = "CREATE TABLE TblImport (";
For $i = 1 To _StringCountOccurance(FileReadLine($sTsvFile, 1), @TAB) + 1
   $sCreate &= "Column_" & $i & ","
Next
$sCreate = StringTrimRight($sCreate, 1) & ");"
$sIn = $sCreate & @CRLF ; Create Table
$sIn &= ".separator \t" & @CRLF ; Select @TAB as Separator
$sIn &= ".import '" & $sTsvFile & "' TblImport" & @CRLF
_SQLite_SQLiteExe($sDbFile, $sIn, $sOut, "C:\Program Files\AutoIt3\Include\sqlite3.exe", False)

If @error = 0 Then
   ;Show Table (using SQLite3.dll)
   Local $iRows, $iColumns, $aRes
   _SQLite_Startup()
   ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion() & @CRLF)
   _SQLite_Open($sDbFile)
   _SQLite_GetTable2d(-1, "SELECT ROWID,* FROM TblImport;", $aRes, $iRows, $iColumns)
   _SQLite_Display2DResult($aRes) ; Output to Console
   _SQLite_Close()
   _SQLite_Shutdown()
Else
   If @error = 2 Then
      ConsoleWrite("ERROR: Sqlite3.exe file not found" & @CRLF)
   Else
      ConsoleWrite("ERROR: @error=" & @error & " when calling _SQLite_SQLiteExe" & @CRLF)
   EndIf
EndIf
ShellExecute($sTsvFile)
MsgBox(0,"","")
; Remove Temp Files
FileDelete($sTsvFile)
FileDelete($sDbFile)

Func _StringCountOccurance($sSearchString, $sSubString, $iCaseSense = $STR_NOCASESENSE) ; Returns Number of $sSubString in $sSearchString
   Local $iOccCnt = 1
   Do
      If StringInStr($sSearchString, $sSubString, $iCaseSense, $iOccCnt) > 0 Then
         $iOccCnt += 1
      Else
         ExitLoop
      EndIf
   Until 0
   Return $iOccCnt - 1
EndFunc   ;==>_StringCountOccurance
J'obtiens ceci dans la console de Scite
_SQLite_LibVersion=3.8.11.1
 rowid  Column_1  Column_2  Column_3
 1      ?         ?         ?        
 2      a1        b1        c1      
 3      a2        b2        c2
Y a t'il un moyen pour y remédier ? merci de vos réponses

Re: [..]Sqlite et les accents

Posté : jeu. 08 sept. 2016 23:47
par jchd
Il faut utiliser le paramètre $hPrintCallback de _SQLite_Startup pour forcer l'utilisation d'un *_ConsoleWrite qui affiche de l'UTF8 à condition que le réglage de la console soit ussi UTF8 (voir dans SciTE), sinon c'est ConsoleWrite qui est utilisé et il ne gère pas l'UTF8.
Sinon, la "CLI" (Command-Line Interface) sqlite3.exe lit "bêtement" les octets et les stocke "bêtement" dans la base, sans chercher à interpréter un encodage quelconque.
Si tu visualises le contenu de ta base avec un outil tiers (SQLite Expert par exemple) tu verras que tout doit être identique à l'entrée initiale.

Re: [..] Sqlite et les accents

Posté : lun. 12 sept. 2016 08:15
par walkson
Bonjour,
Ma question portait bien sur la conversion CSV en base SQLITE et donc sans solution...
Merci pour la réponse

Re: [R] Sqlite et les accents

Posté : lun. 12 sept. 2016 09:49
par jchd
Normalement une version à jour de sqlite3.exe doit convertir un fichier .CSV correctement.
Si ce n'est pas le cas, poste un fichier qui pose problème.

Re: [R] Sqlite et les accents

Posté : lun. 12 sept. 2016 11:19
par walkson
Bonjour,
Comme j'avais une vieille version de sqlite3.exe, j'ai téléchargé la dernière version mais sans changement.
Je joints le CSV et la base qui m'ont servi de test. Le problème rencontré ici est le même avec d'autres CSV et je n'ai jamais réussi à obtenir des lettres accentuées correctes.

Re: [R] Sqlite et les accents

Posté : lun. 12 sept. 2016 18:01
par jchd
Confusion de ma part : sqlite3.exe permet l'import de .CSV sous encodage UTF8 sans BOM.
Un simple FileWrite('srcu.txt', FileRead('src.txt')) fera la conversion.