Import SQLITE aus CSV: Umlauteproblem

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Guten Tag,

folgendes Problem treibt mich in den Wahnsinn...
In ein Stringgrid lade ich eine CSV-Datei, die laut Notepad++ UTF8BOM kodiert ist,
was korrekt ist.
Danach iteriere ich durch das Grid und speichere bestimmte Daten in einer SQLITE-Datei.
Gibt es einem einem Text einen Umlaut, ist alles i.O.
Gibt es einem Text zwei Umlaute, wird anscheinend UTF8 ignoriert.
Die beiliegende Hardcopy zeigt oben das Stringgrid und unten ein DBGrid, das die
entsprechenden Daten im SQLITE-File wiedergibt.
Es ist egal, ob ich ZEOS benutze oder Datensätze per SQL in die Datenbank schreibe.
Das Problem ist auch nicht auf die gezeigten Datensätze beschränkt und ich kann
es beliebig reproduzieren.
Ist das ein Fehler?

Bin für jeden Hinweis dankbar.
Dateianhänge
Liste.zip
(148 Bytes) 39-mal heruntergeladen
StringgridvsDBGrid.jpg
StringgridvsDBGrid.jpg (11.58 KiB) 1475 mal betrachtet

Michl
Beiträge: 2503
Registriert: Di 19. Jun 2012, 12:54

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von Michl »

Ohne und mit StringGrid geht das hier gut - habe das eben mal umgesetzt in einem Beispielprojekt und der von dir geposteten Datei. Ich sehe das hier nicht. (Windows 7, Lazarus 2.3.0 (rev main-2_3-1438-gb0f6b29ad8) FPC 3.2.2 x86_64-win64-win32/win64). Welches OS und welche Lazarus-/FPC-Version nutzt du?

Kannst du da ein Minimalbsp zusammenstellen?

Bsp. anbei (ohne DLL).
Dateianhänge
SqliteListe.zip
(3.09 KiB) 43-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Hallo Michl,

vielen Dank!
Dein Projekt kann nicht kompilieren- es kommt eine Fehlermeldung. Werde mich später damit beschäftigen.
Habe mal ein Minimalprojekt angehängt (der Code will keinen Preis für Schönheit gewinnen- es ging mir
nur darum, das Problem einzukreisen).
BTW: bin im Moment nur unter Windows unterwegs.
Dateianhänge
CSV2SQLITE.zip
(946.61 KiB) 49-mal heruntergeladen

wp_xyz
Beiträge: 4348
Registriert: Fr 8. Apr 2011, 09:01

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von wp_xyz »

BoraBora hat geschrieben:
Mo 14. Mär 2022, 16:59
Habe mal ein Minimalprojekt angehängt (der Code will keinen Preis für Schönheit gewinnen- es ging mir
nur darum, das Problem einzukreisen).
BTW: bin im Moment nur unter Windows unterwegs.
Hab gerade dein Projekt ausprobiert und kann keinen Fehler feststellen (Win 11, Laz main/trunk-FPC3.2.2-32 bit aber auch Laz 2.2.0-FPC3.2.2-32bit; ZEOS ist die Version 7.2.14 vom OPM). Bitte nenne die Versionen (OS, Laz, FPC, ZEOS), die du verwendest.
BoraBora hat geschrieben:
Mo 14. Mär 2022, 16:59
(der Code will keinen Preis für Schönheit gewinnen [..]).
Kein Problem, aber du solltest dir auch für solchen Quick-and-dirty-Code nicht angewöhnen, in Methoden einer Klasse (TForm1) auf eine Instanz der Klasse (Form1) Bezug zu nehmen - einfach weglassen. Also: "ZQuery1.ExecSQL" statt "Form1.ZQuery1.ExecSQL". Ich habe das hier schon mehrmals begründet und will es jetzt nicht wiederholen --> Forum-Suche.

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Ich arbeite mit:
Zeos 7.2.8 (wenn ich das richtig interpretiere) und
Lazarus Version 2.0.12 mit FPC 3.2.0 unter WIN10 Pro

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Habe Zeos auf 7.2.14 aktualisiert- das brachte keine Verbesserung.

Interessanter Effekt: ändere ich einen Umlaut im CSV-File in z.B. ue ab,
wird der Text korrekt in die DB geschrieben...
Habe so ein Verhalten bisher noch nicht kennengelernt (aber man lernt ja nie aus :D )
Dateianhänge
Bild.jpg
Bild.jpg (8.87 KiB) 1358 mal betrachtet

Benutzeravatar
theo
Beiträge: 9265
Registriert: Mo 11. Sep 2006, 19:01

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von theo »

Hast du schon mal mit

Code: Alles auswählen

{$codepage UTF8}
probiert?

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 69
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von Jorg3000 »

Versuche es mal mit folgenden ZConnection1.Properties

Code: Alles auswählen

    codepage=UTF8
    controls_cp=CP_UTF8

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Vielen Dank Theo und Jorg3000,

beide Vorschläge haben leider nichts gebracht.
Habe Lazarus auf 2.2.0 (FPC 3.2.2) geupdated- auch ohne Verbesserung,

Ich lasse mir jetzt etwas anderes einfallen.

Nochmal vielen Dank für die Unterstützung!

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 69
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von Jorg3000 »

Eine Sache hätte ich noch, die du mal ausprobieren könntest.

Code: Alles auswählen

var SQLBefehl: RawByteString;
...
SetCodepage(SQLBefehL,cp_utf8,false);
Form1.ZQuery1.SQL.Text := SQLBefehL;
Der Unterschied ist, dass die interne Codepage des Strings dann nicht 0 ist (default UTF-8), sondern den tatsächlichen Wert für UTF8 (Konstante cp_utf8) hat.
Dieses SetCodepage() hatte bei mir mal bei einer ganz anderen Sache Erfolg, zu meiner Verwunderung.
Das SetCodepage() erst anwenden, wenn der String fertig gefüllt ist.

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Hallo Jorg3000,

vielen Dank!
Ich habe mir jetzt allerdings den Ansatz von Michl zu eigen gemacht
und der funktioniert perfekt.

Gruss BB

Epcop
Beiträge: 127
Registriert: Di 29. Mai 2012, 09:36

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von Epcop »

Nutzt du die 64 oder die 32 bit Version? (Lazarus und Sqlite)


Vor ein paar Wochen hatte ich das gleiche Problem. Bei der 64 Bit Version hatte ich ständig Probleme mit den Umlauten. Bei der 32 Bit Version nicht.
Ich konnte die Gründe nie herausfinden. Da sonst alles andere völlig identisch war.

Falls du es noch kannst: compilier das mal mit 32 version. Würde mich interessieren ob es dann funktioniert.


Voraussetzung ist natürlich, dass die ursprünglichen Umlaute noch "intakt" und nicht vorher schon "zerschossen" sind ;-)

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Hallo Epcop,

habe mein Programm mit der 32Bit-Version und der 32Bit-Version der
Sqlite.dll kompiliert und siehe da- alle Umlaute werden perfekt angezeigt.

Entweder hat die 64Bit-Sqlite.dll ein Problem und/oder die 64Bit-Version
von Lazarus. Leider fehlen mir aber die Kenntnisse, um in diese Richtung
weiter zu suchen.

Gruss BB

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von BoraBora »

Habe das jetzt so gemacht:
kompiliere mit 64Bit-Lazarus und 32Bit-Sqlite DLL und
die Umlaute werden all korrekt dargestellt.

BB

Epcop
Beiträge: 127
Registriert: Di 29. Mai 2012, 09:36

Re: Import SQLITE aus CSV: Umlauteproblem

Beitrag von Epcop »

Super, danke dir für deine Rückmeldung!


Ich hatte damals ewig gesucht, warum das so ist und war eine zufällige Entdeckung.
Hatte auch alles Mögliche mit den Zeichensätzen ausprobiert: Hat der Import den richtigen Zeichensatz, hat die DB den richtigen, ist bei Lazarus der richtige eingestellt, muss ich vielleicht irgendwo was encode/decoden.


Was mich allerdings überrascht ist, dass du die 64bit Lazarus mit 32Bit dll comilieren kannst. Aber schön, dass es funktioniert!

Ich habe mir in das Projektverzeichnis eine liesmich Datei abgelegt, mit der info, dass die Umlaute nur bei der 32 Version funktionieren. Weil wenn man in 12 Wochen wieder am Projekt arbeitet, wundert man sich wieder, warum die Umlaute nicht mehr funktionieren. Aber vielleicht funktioniert es in einer zukünftigen Version richtig.

Antworten