Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CSV mit gemischter Codierung lesen (https://www.delphipraxis.net/189842-csv-mit-gemischter-codierung-lesen.html)

dataspider 28. Jul 2016 15:34


CSV mit gemischter Codierung lesen
 
Hallo

Ich dreh langsam durch...
Ich habe eine CSV - Datei, die irgendwie sämtliche Codierungen enthalten kann.

Da steht z.B. in einer Zeile:

;Hr. Brückner 6;;108;1;211;Weißweinschorle 0,5 l;

also ü codiert - aber ß bleibt.

Die Sonderzeichen aüü etc. kommen auch häufig nicht codiert vor.

Und damit das Glück perfekt ist, steht dann noch

H & # 2 5 2;tte (ohne die Leerzeichen, aber sonst macht DP ein ü draus)

für Hütte

Wenn ich jetzt die Zeilen irgendwie mit UTF8Encode manipuliere, erhalte ich halt:

;Hr. Brückner 6;;108;1;211;Wei�weinschorle 0,5 l;

ü ist nun da, ß ist weg

Kann man aus so etwas lesbaren Text mit Sonderzeichen machen?

Frank

Benedikt Magnus 28. Jul 2016 16:01

AW: CSV mir gemischter Codierung lesen
 
Wenn es sich nur um einige wenige Ausnahmen handelt, die dir bekannt sind, könntest du vor dem UTF8Encode die entsprechenden Zeichen mit StrReplace selbst kodieren. Oder andersherum, falls das bei den entsprechenden Ausnahmen sinnvoller ist: Statt des UTF8Encode nur mit StrReplace Entsprechendes ersetzen.

Bernhard Geyer 28. Jul 2016 16:07

AW: CSV mir gemischter Codierung lesen
 
In einem Datenfeld ist es aber korrekt Codiert?
Falls ja würde ich die Daten nach Zeilen/Spalten auftrennen und dann dort versuchen die Codierung zu erkennen.

himitsu 28. Jul 2016 16:14

AW: CSV mir gemischter Codierung lesen
 
* Datei als ANSI laden
* Schauen, ob das Feld (jeder Wert einzeln und nicht für ganze Zeilen/Datei) "valides" UTF-8 enthält
* wenn ja, dann das UTF-8 dekodieren, nach Unicode
* wenn nein, dann von ANSI (definierte CodePage) nach Unicode
** überleg dir hier, was dein Standard-Encoding ist ... z.B. CodePage 1252 (Latin 1 / ISO 8859-1), CodePage 1250 (Latin 2 / ISO 8859-2) oder CodePage weißichgradnicht (Latin-9 / ISO/IEC 8859-15)
* und zum Schluß noch ein HTML-Encode drüber jagen

und ich würde den verhauen, der so eine CSV generieren lässt und keine passende Dokumentation/Spezifikation liefert ... aber alleine schon für so einen Mischmasch gehört er gerädert.

MichaelT 28. Jul 2016 17:41

AW: CSV mir gemischter Codierung lesen
 
Am besten wäre es mal in der Datenquelle zu prüfen was drinnensteht und damit meine ich nicht die CSV Datei sondern wo wie herkommt. Du kannst das mal jetzt so patchen wie angeführt. Aber bitte lass den Datenunsinn beheben.

Zitat:

Zitat von dataspider (Beitrag 1343677)
Hallo
Ich dreh langsam durch...
Ich habe eine CSV - Datei, die irgendwie sämtliche Codierungen enthalten kann.


dataspider 28. Jul 2016 22:40

AW: CSV mir gemischter Codierung lesen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1343681)
In einem Datenfeld ist es aber korrekt Codiert?
Falls ja würde ich die Daten nach Zeilen/Spalten auftrennen und dann dort versuchen die Codierung zu erkennen.

Ich denke, dass es in einem Feld nur eine Codierung gibt.
Da aber das Semikolon Teil der Codierung ist, ist das Trennen der Felder etwas aufwändiger.

Zitat:

Zitat von MichaelT (Beitrag 1343685)
Am besten wäre es mal in der Datenquelle zu prüfen was drinnensteht und damit meine ich nicht die CSV Datei sondern wo wie herkommt. Du kannst das mal jetzt so patchen wie angeführt. Aber bitte lass den Datenunsinn beheben.

Ja, das wäre natürlich der logische Ansatz. Aber ich stehe nicht das erste mal vor solchen Situationen.
Diese Kämpfe haben nur leider die höchste Misserfolgsbilanz...

Zitat:

Zitat von himitsu (Beitrag 1343682)
* Datei als ANSI laden
* Schauen, ob das Feld (jeder Wert einzeln und nicht für ganze Zeilen/Datei) "valides" UTF-8 enthält
* wenn ja, dann das UTF-8 dekodieren, nach Unicode
* wenn nein, dann von ANSI (definierte CodePage) nach Unicode
** überleg dir hier, was dein Standard-Encoding ist ... z.B. CodePage 1252 (Latin 1 / ISO 8859-1), CodePage 1250 (Latin 2 / ISO 8859-2) oder CodePage weißichgradnicht (Latin-9 / ISO/IEC 8859-15)
* und zum Schluß noch ein HTML-Encode drüber jagen

und ich würde den verhauen, der so eine CSV generieren lässt und keine passende Dokumentation/Spezifikation liefert ... aber alleine schon für so einen Mischmasch gehört er gerädert.

Das Letzte wäre sicher sinnvoll...
Beim Code scheitert es momentan schon am Prüfen des "validen" UTF-8.
Da ich das bis morgen lösen muss, habe ich das nun doch schnell mit StringReplace realisiert.

Vielen Danke für die Lösungsansätze.

Frank

himitsu 29. Jul 2016 10:34

AW: CSV mit gemischter Codierung lesen
 
Das UTF8Decode in der System.pas ist da sehr rabiat und gut nutzbar, für soeinen Mist. :stupid:
> bei ungültigem UTF-8 gibt das einfach einen Leerstring zurück, anstatt einer Fehlermeldung.

Delphi-Quellcode:
var
  A: AnsiString;
  S: string; // UnicodeString

A := ...;
if (A <> '') and (UTF8Decode(A) <> '') then
  S := UTF8Decode(A)
else
  S := A; // hier eventuell TEncoding, mit passender CodePage ... oder A als String mit CodePage definieren, siehe UTF8String in der System.pas
S := HTMLEncode(S);
http://stackoverflow.com/questions/2...-escaping-html
http://www.delphipraxis.net/148888-u...vertieren.html
Es dürfte dafür bestimmt auch irgendwo in den INDY ein Code versteckt sein.

p80286 29. Jul 2016 10:47

AW: CSV mit gemischter Codierung lesen
 
Zitat:

Zitat von himitsu (Beitrag 1343704)
Das UTF8Decode in der System.pas ist da sehr rabiat und gut nutzbar, für soeinen Mist. :stupid:
> bei ungültigem UTF-8 gibt das einfach einen Leerstring zurück, anstatt einer Fehlermeldung.

Das könnte aber unproduktiv sein, da dann der Chef auf der Matte steht und meckert wo denn die Lücken herkommen.
Langfristig gesehen, empfehle ich den Produzenten solcher Daten, die Finger einzeln zu brechen.


Gruß
K-H

himitsu 29. Jul 2016 12:52

AW: CSV mit gemischter Codierung lesen
 
Ich meinte "TEncoding" ersetzt "ungültige" Zeichen/Zeichenfolgen durch "?" und UF8Encode macht einfach garnichts.

Heißt, daß man UTF8Encode was reingeben kann und wenn nichts rauskommt, dann war es kein valides UTF-8
und dann nimmt man einfach was Anderes. :zwinker:

dataspider 29. Jul 2016 14:24

AW: CSV mit gemischter Codierung lesen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von himitsu (Beitrag 1343713)
Ich meinte "TEncoding" ersetzt "ungültige" Zeichen/Zeichenfolgen durch "?" und UF8Encode macht einfach garnichts.

Heißt, daß man UTF8Encode was reingeben kann und wenn nichts rauskommt, dann war es kein valides UTF-8
und dann nimmt man einfach was Anderes. :zwinker:

Ich habe mal Screenshot vom Debugger angehangen.
Da kann man den String (original) mit dem nach UTF8Decode vergleichen.

Damit kann ich wirklich nichts sinnvolles anfangen.
Es ist aber auch nicht gerade mein "Fachgebiet"...:oops:

Frank

p80286 29. Jul 2016 15:15

AW: CSV mit gemischter Codierung lesen
 
War weiter oben nicht die Rede von einem Ansi-String?
Und im Zweifel bevorzuge ich in solchen Fällen die Darstellung als Text und Hex-Code, Text ist auch immer nur interpretiert.

Gruß
K-H

nahpets 29. Jul 2016 15:48

AW: CSV mit gemischter Codierung lesen
 
Für so ein aberwitziges Zeichenänderungsumgewusel hab' ich mit mal angehängte Funktion geschrieben.

Nicht elegant, aber erweiterbar für allen möglichen Schrott, den man da so geliefert bekommen könnte.

[OT]Da die Forumssoftware einige der auszutauschenden Zeichenfolgen interpretiert und daher der Quelltext verfälscht wird, hab' ich die Routine hier nicht zwischen Delphi-Tags reingepackt.[/OT]

dataspider 29. Jul 2016 16:20

AW: CSV mit gemischter Codierung lesen
 
Zitat:

Zitat von p80286 (Beitrag 1343735)
War weiter oben nicht die Rede von einem Ansi-String?
Und im Zweifel bevorzuge ich in solchen Fällen die Darstellung als Text und Hex-Code, Text ist auch immer nur interpretiert.

Gruß
K-H

Ich habe das auch mit AnsiString getestet. Das Ergebnis ist gleich. Und zum Analysieren nehme ich immer die HEX - Ansicht.

Zitat:

Zitat von nahpets (Beitrag 1343740)
Für so ein aberwitziges Zeichenänderungsumgewusel hab' ich mit mal angehängte Funktion geschrieben.

Vielen Dank, damit kann ich meine Liste erweitern.
Das erspart mir etwas Arbeit.

Frank

himitsu 29. Jul 2016 17:29

AW: CSV mit gemischter Codierung lesen
 
Einmal String (UnicodeString) und es ist alles zu spät, denn diese Konvertierung kann schon zu viel zerstört haben und zurückkonvertieren ist nicht immer möglich.
probier mal Folgendes: nimm einen Text, lass ihn von Google-Translate in irgendeine Sprache übersetzen und schau nach, was raus kommt, wenn du es versuchst wieder zurück zu übersetzen.

Und wie ich schon gesagt hab, mußt du jeden Wert einzeln übersetzen, was einem auch klar sein sollte.
Nimm einen Text, wo du mehrere Sprachen benutzt.
Egal in welcher Reihenfolge der vielen Sprachen du versuchst das nach deutsch zu übersetzen, kann niemals was Ordentliches bei rauskommen, wenn man das versucht im Ganzen zu übersetzen.

freejay 3. Aug 2016 15:21

AW: CSV mit gemischter Codierung lesen
 
Wenn Du mir eine Beispieldatei zukommen lassen könntest (muss ja nix großes sein), könnte ich mal schauen, ob mein StreamReader das sauber lesen kann. Der wechselt nämlich das Encoding, wenn's sein muss - soweit ich mich recht erinnere... ;-)

dataspider 4. Aug 2016 14:01

AW: CSV mit gemischter Codierung lesen
 
Zitat:

Zitat von himitsu (Beitrag 1343749)
Und wie ich schon gesagt hab, mußt du jeden Wert einzeln übersetzen, was einem auch klar sein sollte.
Nimm einen Text, wo du mehrere Sprachen benutzt.
Egal in welcher Reihenfolge der vielen Sprachen du versuchst das nach deutsch zu übersetzen, kann niemals was Ordentliches bei rauskommen, wenn man das versucht im Ganzen zu übersetzen.

Danke für die Erklärungen.
Ich hatte auch daran gedacht (wie von B.G. ja schon empfohlen), die Spalten einzeln zu decodieren.
Aber ich komme nicht umhin, vorher die Codierungen wie "& # 2 5 2 ;" zu ersetzen, da das letzte Semikolon (dank fehlender Quoten) ja als Delimiter interpretiert wird.


Zitat:

Zitat von freejay (Beitrag 1344078)
Wenn Du mir eine Beispieldatei zukommen lassen könntest (muss ja nix großes sein), könnte ich mal schauen, ob mein StreamReader das sauber lesen kann. Der wechselt nämlich das Encoding, wenn's sein muss - soweit ich mich recht erinnere... ;-)

Vielen Dank für das Angebot. Aber ich versuche immer erst mal, mit eigenem Code hinzukommen.
Und momentan ist dieser Fall gelöst. Der Hersteller der Software, der die CSV erzeugt, hat auch ein Schreiben von mir und ich hoffe,
dass das Problem diesmal an der Wurzel beseitigt werden kann.

Frank

freejay 4. Aug 2016 15:13

AW: CSV mit gemischter Codierung lesen
 
Zitat:

Zitat von dataspider (Beitrag 1344163)
Zitat:

Zitat von freejay (Beitrag 1344078)
Wenn Du mir eine Beispieldatei zukommen lassen könntest (muss ja nix großes sein), könnte ich mal schauen, ob mein StreamReader das sauber lesen kann. Der wechselt nämlich das Encoding, wenn's sein muss - soweit ich mich recht erinnere... ;-)

Vielen Dank für das Angebot. Aber ich versuche immer erst mal, mit eigenem Code hinzukommen.
Und momentan ist dieser Fall gelöst. Der Hersteller der Software, der die CSV erzeugt, hat auch ein Schreiben von mir und ich hoffe,
dass das Problem diesmal an der Wurzel beseitigt werden kann.

Frank

Hätte mich trotzdem interessiert :wink:, aber Hauptsache Du hast eine Lösung - und hoffentlich ja auch bald saubere Daten... :-D

dataspider 4. Aug 2016 15:23

AW: CSV mit gemischter Codierung lesen
 
Zitat:

Zitat von freejay (Beitrag 1344173)
Hätte mich trotzdem interessiert :wink:

Siehe PN

freejay 4. Aug 2016 15:26

AW: CSV mit gemischter Codierung lesen
 
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz