"CSV"-File in Memo laden - Funktioniert nicht unter Linux
Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux
Hallo,
Na gut; ich nehme jetzt einfach mal in Kauf, dass ich hier wahrscheinlich vielfach mitleidiges Lächeln wegen meines Programmierstils auslöse und poste mal den Quellcode meines "Werks".
Das Programm habe ich mir selber geschrieben, um beim Banking mit GnuCash csv-Files einlesen zu können. Diese CSV-Files enthalten aber viel Text, den ich nicht brauche.
Dieses Programm soll aus Texten beliebige Textschnitzel entfernen, aber nicht nur 1 Textschnitzel so wie das jeder Editor kann, sondern beliebig viele.
Oben am Fenster sind zwei Buttons, die das Memo Feld füllen:
1. "Replace" -> Mm_CVS.Text := Form1.String_lesen ( F1 );
und
2. "Button" -> Mm_CVS.Text := CP1252ToUTF8(Form1.String_lesen ( F1 ));
Eingelesen wird das File "A2_statement.txt" (Eine modifizierte csv-Datei)
Das Verhalten unter Windows:
1. "Replace" -> Datei wird eingelesen; Umlaute sind Fragezeichen
2. "Button" -> Datei wird eingelesen; Umlaute sind korrekt
Das Verhalten unter Linux:
1. "Replace" -> Datei wird NICHT eingelesen
2. "Button" -> Datei wird eingelesen; Umlaute sind korrekt
Eingelesen wird nun eine selbst erstellte "ganz normale" Text-Datei mit Umlauten
Das Verhalten unter Windows:
1. "Replace" -> Datei wird eingelesen; Umlaute sind korrekt
2. "Button" -> Datei wird eingelesen; Umlaute sehen so aus: Ü_äöü
Das Verhalten unter Linux:
1. "Replace" -> Datei wird eingelesen, Umlaute sind korrekt
2. "Button" -> Datei wird eingelesen; Umlaute sehen so aus: Ü_äöü
Grüße! Alfons
Na gut; ich nehme jetzt einfach mal in Kauf, dass ich hier wahrscheinlich vielfach mitleidiges Lächeln wegen meines Programmierstils auslöse und poste mal den Quellcode meines "Werks".
Das Programm habe ich mir selber geschrieben, um beim Banking mit GnuCash csv-Files einlesen zu können. Diese CSV-Files enthalten aber viel Text, den ich nicht brauche.
Dieses Programm soll aus Texten beliebige Textschnitzel entfernen, aber nicht nur 1 Textschnitzel so wie das jeder Editor kann, sondern beliebig viele.
Oben am Fenster sind zwei Buttons, die das Memo Feld füllen:
1. "Replace" -> Mm_CVS.Text := Form1.String_lesen ( F1 );
und
2. "Button" -> Mm_CVS.Text := CP1252ToUTF8(Form1.String_lesen ( F1 ));
Eingelesen wird das File "A2_statement.txt" (Eine modifizierte csv-Datei)
Das Verhalten unter Windows:
1. "Replace" -> Datei wird eingelesen; Umlaute sind Fragezeichen
2. "Button" -> Datei wird eingelesen; Umlaute sind korrekt
Das Verhalten unter Linux:
1. "Replace" -> Datei wird NICHT eingelesen
2. "Button" -> Datei wird eingelesen; Umlaute sind korrekt
Eingelesen wird nun eine selbst erstellte "ganz normale" Text-Datei mit Umlauten
Das Verhalten unter Windows:
1. "Replace" -> Datei wird eingelesen; Umlaute sind korrekt
2. "Button" -> Datei wird eingelesen; Umlaute sehen so aus: Ü_äöü
Das Verhalten unter Linux:
1. "Replace" -> Datei wird eingelesen, Umlaute sind korrekt
2. "Button" -> Datei wird eingelesen; Umlaute sehen so aus: Ü_äöü
Grüße! Alfons
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )
Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux
Die beiden Dateien sind halt unterschiedlich kodiert.
"A2_statement.txt" wird bei mir in KWrite als ISO_8859_15 gelesen und "Beliebiges_File_mod.txt" ist UTF-8.
Was hast du denn erwartet?
Wenn es dein GnuCash verträgt, würde ich generell auf UTF-8 umstellen.
"A2_statement.txt" wird bei mir in KWrite als ISO_8859_15 gelesen und "Beliebiges_File_mod.txt" ist UTF-8.
Was hast du denn erwartet?
Wenn es dein GnuCash verträgt, würde ich generell auf UTF-8 umstellen.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux
Hi!
Wenn Du weiterhin auf gemischtem Salat bei Deinen Texten bestehst, dann kannst Du Dein Glück mal hiermit versuchen:
In der Unit LConvEncoding gibt es diese Function:
Die gibt Dir das Encoding als String zurück. Arbeitet nicht immer, hat sich z.B. bei koreanisch verweigert. Aber für Europa sollte die funktionieren.
Winni
Wenn Du weiterhin auf gemischtem Salat bei Deinen Texten bestehst, dann kannst Du Dein Glück mal hiermit versuchen:
In der Unit LConvEncoding gibt es diese Function:
Code: Alles auswählen
function GuessEncoding(const s: string): string;
Winni
Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux
Naja, das kann zwar ggf. zwischen Ansi und UTF-8 bzw. UCS-2 mit oder ohne BOM Quellen unterscheiden, aber um welche 8-bit-Codepage es sich handelt, kann der auch nicht wissen.Winni hat geschrieben: Mo 14. Feb 2022, 14:39 Die gibt Dir das Encoding als String zurück. Arbeitet nicht immer, hat sich z.B. bei koreanisch verweigert. Aber für Europa sollte die funktionieren.
Dann nimmt er halt die Systemkodierung, weil das am naheliegendsten ist.
Wenn du einen kyrillischen etc. Text hast, wird da aber immer Quark rauskommen.
Bei Feinheiten wie Eurozeichen dürfte es auch in "Europa" teilweise problematisch werden.
https://en.wikipedia.org/wiki/ISO/IEC_8859-1
https://en.wikipedia.org/wiki/ISO/IEC_8859-15
Im Prinzip gehört der ganze Quatsch ins Museum und es sollte alles auf UTF-8 umgestellt werden.

Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux
Hallo,
Ihr habt mir enorm geholfen und ich denke, ich habe eine Menge dazu gelernt!
Vielen Dank!!
Wie soll ich mich für ein System entscheiden?
Ich muss ja nehmen was ich bekomme! Sprich: Ich muss ja das File verarbeiten, das mir (von den Banken) geliefert wird
Hier erstmal der Code, der für meine Zwecke sehr gut funktioniert: Das geht sicher noch viel eleganter, aber - wie gesagt - es funktioniert so.
Was diese Zeile angeht,
so muss ich das wohl so machen, denn Windows liefert bei "GuessEncoding()" cp1252 und Linux ist offenbar davon überzeugt, dass das File ISO-8859-1 - codiert ist.
Nochmals Danke! Alfons
Ihr habt mir enorm geholfen und ich denke, ich habe eine Menge dazu gelernt!
Vielen Dank!!
Wie soll ich mich für ein System entscheiden?
Ich muss ja nehmen was ich bekomme! Sprich: Ich muss ja das File verarbeiten, das mir (von den Banken) geliefert wird

Hier erstmal der Code, der für meine Zwecke sehr gut funktioniert:
Code: Alles auswählen
procedure TForm1.Bt_BeidesClick(Sender: TObject);
var
F1 , F2 , A_coding , sss : string;
begin
Mm_CVS.Text := '';
if OpenDialog1.Execute then
begin
F1 := OpenDialog1.FileName;
Lb_CVS_File_load.Caption := F1;
sss := Form1.String_lesen ( F1 );
A_coding := GuessEncoding(sss);
if ((A_coding = 'cp1252') or (A_coding = 'ISO-8859-1')) then
begin
Mm_CVS.Text := CP1252ToUTF8(Form1.String_lesen ( F1 ));
end
else
begin
Mm_CVS.Text := Form1.String_lesen ( F1 );
end;
F2 := Form1.Sicherungs_File_Pfad_bilden ( F1 );
Lb_CVS_File_save.Caption:=F2;
Form1.Lesen_Replace_und_schreiben ( F1 , F2 );
Showmessage( 'File: '+ LineEnding + F1 + LineEnding + ' -->' + LineEnding + F2 + LineEnding + LineEnding + 'Das Ergebnis:');
sss := Form1.String_lesen ( F2 );
if ((A_coding = 'cp1252') or (A_coding = 'ISO-8859-1')) then
begin
Mm_CVS.Text := CP1252ToUTF8(Form1.String_lesen ( F2 ));
end
else
begin
Mm_CVS.Text := Form1.String_lesen ( F2 );
end;
end;
end;
Was diese Zeile angeht,
Code: Alles auswählen
if ((A_coding = 'cp1252') or (A_coding = 'ISO-8859-1'))
Nochmals Danke! Alfons
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )
Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux
Nein, wie oben geschrieben: GuessEncoding hat keinen blassen Schimmer, wie das File (Ansi-)codiert ist und nimmt dann in der Not einfach das, was das System vorgibt, wenn überhaupt.Aliobaba hat geschrieben: Mo 14. Feb 2022, 15:54 so muss ich das wohl so machen, denn Windows liefert bei "GuessEncoding()" cp1252 und Linux ist offenbar davon überzeugt, dass das File ISO-8859-1 - codiert ist.
Aber das ist keine zuverlässige Lösung, denn wie auch oben geschrieben, kennt z.B. ISO-8859-1 kein Euro Zeichen, dafür müsste es ISO-8859-15 sein.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux
Hi!theo hat geschrieben: Mo 14. Feb 2022, 15:25
Im Prinzip gehört der ganze Quatsch ins Museum und es sollte alles auf UTF-8 umgestellt werden.![]()
Mein reden seit 30 Jahren. Spätstens seitdem ich mich für eine Freundin blöd gesucht habe nach einem tschechischen Font. Wegen ň, Ř, Š, š und ähnlichem. Vor der Erfindung des WWW.
Und glücklicherweise sind die Betriebssysteme inzwischen dazu in der Lage
Winni