AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CSV mit gemischter Codierung lesen

Ein Thema von dataspider · begonnen am 28. Jul 2016 · letzter Beitrag vom 4. Aug 2016
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#1

CSV mit gemischter Codierung lesen

  Alt 28. Jul 2016, 16:34
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
Frank Reim

Geändert von TBx (28. Jul 2016 um 23:01 Uhr) Grund: Titel korrigiert
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#2

AW: CSV mir gemischter Codierung lesen

  Alt 28. Jul 2016, 17:01
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.

Geändert von Benedikt Magnus (28. Jul 2016 um 17:02 Uhr) Grund: Rechtschreibung
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: CSV mir gemischter Codierung lesen

  Alt 28. Jul 2016, 17:07
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#4

AW: CSV mir gemischter Codierung lesen

  Alt 28. Jul 2016, 17:14
* 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: CSV mir gemischter Codierung lesen

  Alt 28. Jul 2016, 18:41
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.

Hallo
Ich dreh langsam durch...
Ich habe eine CSV - Datei, die irgendwie sämtliche Codierungen enthalten kann.
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: CSV mir gemischter Codierung lesen

  Alt 28. Jul 2016, 23:40
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.

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

* 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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

AW: CSV mit gemischter Codierung lesen

  Alt 29. Jul 2016, 11:34
Das UTF8Decode in der System.pas ist da sehr rabiat und gut nutzbar, für soeinen Mist.
> 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: CSV mit gemischter Codierung lesen

  Alt 29. Jul 2016, 11:47
Das UTF8Decode in der System.pas ist da sehr rabiat und gut nutzbar, für soeinen Mist.
> 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

AW: CSV mit gemischter Codierung lesen

  Alt 29. Jul 2016, 13:52
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: CSV mit gemischter Codierung lesen

  Alt 29. Jul 2016, 15:24
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.
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"...

Frank
Miniaturansicht angehängter Grafiken
original.jpg   utf8decode.jpg  
Frank Reim
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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