"CSV"-File in Memo laden - Funktioniert nicht unter Linux

Für Fragen von Einsteigern und Programmieranfängern...
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux

Beitrag von Aliobaba »

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: Ü_äöü

project1.zip
(132.29 KiB) 40-mal heruntergeladen
Grüße! Alfons
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

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

Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux

Beitrag von theo »

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.

Benutzeravatar
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

Beitrag von Winni »

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:

Code: Alles auswählen

function GuessEncoding(const s: string): string;
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

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

Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux

Beitrag von theo »

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.
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.
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. :wink:

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux

Beitrag von Aliobaba »

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:

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;     
Das geht sicher noch viel eleganter, aber - wie gesagt - es funktioniert so.
Was diese Zeile angeht,

Code: Alles auswählen

if ((A_coding = 'cp1252') or (A_coding = 'ISO-8859-1'))
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
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

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

Re: "CSV"-File in Memo laden - Funktioniert nicht unter Linux

Beitrag von theo »

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.
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.
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.

Benutzeravatar
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

Beitrag von Winni »

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. :wink:
Hi!

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

Antworten