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

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

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

Beitrag von Aliobaba »

Hallo und Guten Morgen,

ich bin dabei, meine Buchführung von Quicken auf GnuCash umzustellen.
GnuCash bietet die Möglichkeit, Daten der Bank im "CSV"-Format einzulesen.

In den von den Banken zur Verfügung gestellten Files sind allerdings eine Vielzahl von immer gleichen Text-"Floskeln" enthalten, die ich vor dem Einlesen in GnuCash mit dem Befehl "StringReplace" aus dem "CSV"-File entfernen möchte.
WICHTIG: Tabulatorzeichen, Separatoren usw. werden bei diesem Vorgang NICHT entfernt oder verändert.
Zur Kontrolle des Ergebnisses von "StringReplace" möchte ich das "CSV-File" "vorher" und "nachher" in ein Memo-Feld laden.

All dies funktioniert unter Windows völlig problemlos!! Auch das Einlesen eines so veränderten "CSV"-Files in GnuCash.

Wenn ich aber das Programm unter Linux kompiliere, dann läuft das Programm zwar problemlos, das Memo liest auch "normale" ".txt"-Files ein, verweigert aber hartnäckig seinen Dienst unter Linux, aber nur bei "CSV"-Files: Das Memo-Feld bleibt nach dem Einlesen leer; egal ob ich es mit "Memo1.Lines.LoadFromFile()" einlese oder mit einer Prozedur, die "TFileStream" verwendet.

Meine Frage nun:
Warum verhält sich das Windows-Kompilat anders als das Linux-Kompilat?
Welche "Text-Bestandteile" stören das "Linux-Memo"?
Was muss ich tun, dass ich auch unter Linux das "csv"-File einlesen kann?

Das "CSV-File" möchte ich nicht extra vorher auftrennen müssen, es sollte ganz einfach nur der gesamte String in ein Memo-Feld eingelesen werden können - so wie es ja unter Windows sehr gut funktioniert.
Noch ein Hinweis: Wenn ich das "CSV-File" nur in einen String lade, diesen String dann mit "StringReplace" bearbeite und den String dann gleich wieder in ein File speichere, dann werden - auch unter Linux - die Textveränderungen völlig korrekt durchgeführt, das "CSV-File" bleibt korrekt und kann in "GnuCash" eingelesen werden; nur das "Linux-Memo" mag die "CSV-Files" offenbar nicht.


Einen schönen Tag aus dem sonnigen Bayern!
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

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

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

Beitrag von theo »

Klingt, als ob die Datei nicht UTF-8 kodiert ist und Umlaute etc. enthält.

Probier mal so:

Code: Alles auswählen

uses ... LConvEncoding;

var SL:TStringList;
begin
  SL:=TStringList.Create;
  SL.LoadFromFile('ansitest.txt');
  Memo1.Text:=CP1252ToUTF8(SL.Text);
  SL.free;
end;  

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

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

Beitrag von Aliobaba »

Hallo theo,

Super!!! Vielen, vielen Dank! Funktioniert!!
Sicher gibt es gute Gründe, warum dies bei der Windows-Version anders ist als bei der Linux Version.

Liebe Grüße
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

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

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

Beitrag von theo »

Aliobaba hat geschrieben:
So 13. Feb 2022, 10:03
Sicher gibt es gute Gründe, warum dies bei der Windows-Version anders ist als bei der Linux Version.
Eine absolut qualifizierte Antwort kann ich dir nicht geben, aber modernes Linux benutzt nun mal durchgehend Unicode/UTF-8 und keine 8-bit Codepage, wie Windows.
Da ein Memo nur das Widgetset Control kapselt, hier wahrscheinlich das GtkTextView, kann es damit halt nichts anfangen.
Automatische Konvertierung kann trickreich sein, da eine ANSI Textdatei keine konkrete Information enthält, wie sie kodiert ist.

Mein Tipp mit CP1252ToUTF8 ist ja auch nur eine Vermutung. Für einen russischen Text müsstest du vielleicht KOI8RToUTF8 verwenden.
https://en.wikipedia.org/wiki/KOI8-R

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

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

Beitrag von wp_xyz »

Ich hab's gerade ausprobiert: Unter Windows mit Notepad++ eine Datei mit dem Text 'abc-äöü-ABC' erzeugt und als Codepage 1252 gespeichert, nach Linux kopiert und mit Lazarus dort in ein Memo eingelesen -> das Memo bleibt leer. Wundert mich allerdings, dass das sonst so liberale Linux einem gleich den ganzen Text vorenthält, bloß weil vielleicht auch nur ein einziges nicht UTF-8 konformes Zeichen enthalten ist. Da finde ich das Verhalten von Windows praktischer, das alles anzeigt, nur halt bei den Nicht-UTF-8-Bytes Unsinn. So bleibt bis auf diese wenigen Zeichen der Inhalt des Textes erkennbar.

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

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

Beitrag von theo »

wp_xyz hat geschrieben:
So 13. Feb 2022, 10:59
Wundert mich allerdings, dass das sonst so liberale Linux einem gleich den ganzen Text vorenthält, bloß weil vielleicht auch nur ein einziges nicht UTF-8 konformes Zeichen enthalten ist. Da finde ich das Verhalten von Windows praktischer, das alles anzeigt, nur halt bei den Nicht-UTF-8-Bytes Unsinn.
Das ist schon etwas polemisch. Verantwortlich ist nicht "Linux" sondern das Zusammenspiel zwischen GtkTextView und Lazarus.
Mit dem "LCLWidgetType" Qt4/5 wird zwar der Text geladen, aber die fraglichen Zeichen werden mit "?" ersetzt.
Ob das nun besser ist?
Tatsache ist, dass 8-bit Codepages nicht zuverlässig automatisch nach Unicode konvertiert werden können, weil die Quellcodierung (meist) nicht in der Datei definiert ist.

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

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

Beitrag von theo »

P.S. Das gleiche Verhalten mit den "?" lässt sich für GTK einstellen, indem man so lädt:

Code: Alles auswählen

  Memo1.lines.LoadFromFile('ansi.txt', TEncoding.ASCII); 

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

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

Beitrag von Aliobaba »

Hallo,
der Text wird mit dieser Maßnahme
Memo1.Text:=CP1252ToUTF8(SL.Text)
nun zwar im Memo-Textfeld angezeigt, aber nun treten die Probleme mit den Umlauten noch auf:
" ABC_äöü-ÄÖÜ- " --> " äöü-ÄÖÜ- "
:| :(
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

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

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

Beitrag von theo »

Na dann war die Quellcodierung eine andere oder die Quelle war schon UTF-8 und anderweitig "korrupt".
Bin aber kein Hellseher (leider).

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

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

Beitrag von Aliobaba »

... gibt es dafür nicht auch eine weitere Konvertierungsmöglichkeit, die sich nur um dieses Umlaute-Problem kümmert?
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
Winni
Beiträge: 1280
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

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

Beitrag von Winni »

Aliobaba hat geschrieben:
Mo 14. Feb 2022, 08:15
Hallo,
der Text wird mit dieser Maßnahme
Memo1.Text:=CP1252ToUTF8(SL.Text)
nun zwar im Memo-Textfeld angezeigt, aber nun treten die Probleme mit den Umlauten noch auf:
" ABC_äöü-ÄÖÜ- " --> " äöü-ÄÖÜ- "
:| :(
Hi!

So sahen in den späten 90ern die Webseiten aus, wenn man mit Win95/98 - also Win1252 - unterwegs war und auf eine Webseite stieß, die mit UTF-8 codiert war.

Winni

PS.: Zip doch bitte mal Deinen Originaltext und kleb den an einen Beitrag. Dann können wir mittels Hex-Editor nachsehen, was da nun wirklich steht.
Zuletzt geändert von Winni am Mo 14. Feb 2022, 09:46, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 9073
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, 09:22
... gibt es dafür nicht auch eine weitere Konvertierungsmöglichkeit, die sich nur um dieses Umlaute-Problem kümmert?
Wenn mit CP1252ToUTF8 die Umlaute nicht funktionieren, dann war die Konvertierung falsch und es braucht keine "weitere" Konvertierung.
Wenn du den Text nicht anhängst, kann man aber nicht viel sagen.
Wenn du auf Linux/KDE bist, schau doch mal was z.B. KWrite als Kodierung anzeigt. So etwas gibt es bestimmt auch für andere Systeme, aber die kenne ich nicht.

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

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

Beitrag von Michl »

theo hat geschrieben:
Mo 14. Feb 2022, 09:44
Wenn du auf Linux/KDE bist, schau doch mal was z.B. KWrite als Kodierung anzeigt. So etwas gibt es bestimmt auch für andere Systeme, aber die kenne ich nicht.
Ich nutze unter Windows dafür den Total Commander. Man benötigt aber nicht zwangsläufig einen externen Dienst. Man kann die Datein auch per DragNDrop in das aktuell geöffnete Lazarus-Fenster ziehen. Da wird die Datei im SourceEditor angezeigt: rechtsklick auf Source -> Menu Dateieinstellungen -> Zeichenkodierung -> Man sieht die aktuell verwendete Zeichenkodierung

Wenn dabei ungewöhliche Zeichen angezeigt werden, kann man die Datei mit anderer Kodierung anzeigen. Solange, bis man die richtige Kodierung gefunden hat: rechtsklick auf Source -> Menu Dateieinstellungen -> Zeichenkodierung -> andere Kodierung wählen -> Mit anderer Kodierung erneut lesen

Code: Alles auswählen

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1079
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

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

Beitrag von fliegermichl »

Notepad++ zeigt den verwendeten Zeichensatz auch ziemlich zuverlässig an.

Benutzeravatar
Winni
Beiträge: 1280
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

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

Beitrag von Winni »

Hi!

Wenn wir den Originaltext nicht haben, ist alles nur Tappen im Dunkeln.

Ich habe die Vemutung, dass im Text zwei (oder mehrere) Codierungen gemischt werden.

Winni

Antworten