Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr.
Seite 1 von 2  1 2      

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