Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Wie Textdateien lesen? Unicode oder ANSI (https://www.delphipraxis.net/152650-wie-textdateien-lesen-unicode-oder-ansi.html)

BlueStarHH 30. Jun 2010 14:51

Wie Textdateien lesen? Unicode oder ANSI
 
Hallo,

ich habe bisher mit AssignFile und ReadLn Textdateien gelesen. Damit kann man leider keine Unicode-Dateien lesen. Nach etwas suchen habe ich das hier gefunden:

Delphi-Quellcode:
var
  Reader: TStreamReader;
begin
  Reader := TStreamReader.Create('C:\Test.txt');
  //Reader := TStreamReader.Create('C:\Test.txt', TEncoding.GetEncoding(28591), false); //Alternative, damit auch deutsche Umlaute dargestellt werden
  while not Reader.EndOfStream do
    Memo1.Lines.Add(Reader.ReadLine);
  Reader.Free;
end;
Das Problem dabei ist, dass dieser Code nur UTF8-Unicode-Dateien lesen kann. Bei normalen ASNI-Dateien wird nichts eingelesen.

Welche Möglichkeiten gibt es eine Textdatei unabhängig davon ob es UTF8 oder ANSI usw. ist einzulesen? Das Format soll also automatisch erkannt werden. Ich habe sehr große Dateien. Das einlesen muss also Zeilenweise passieren und nicht einfach über eine TStringList, die mit LoadFromFile die gewünschte Automatik bietet.

xZise 30. Jun 2010 15:02

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Moin,
geht das nicht mit der Delphi-Referenz durchsuchenTStringList? Abgesehen davon gibt es bei Textdateien ja keinen Header, in den steht, nach welchen Format die kodiert sind.

Das einzige was möglich ist, nach einer Byte Order Mark zu gucken, aber das greift eigentlich nur bei UTF kodierten Texten und selbst dort wird es nicht immer verwendet (Argh der ***** Java Compiler z.B. zerreißt es bei den UTF8 BOM :wall:).

[edit]Ich habe mal bei der Reference geschaut, und dort steht zu der TStrings.LoadFromFile:
Zitat:

If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class.
[/edit]

MfG
Fabian

Bummi 30. Jun 2010 15:04

AW: Wie Textdateien lesen? Unicode oder ANSI
 
für UTF vorher prüfen ob die ersten drei Byte ef bb bf enthalten?

BlueStarHH 30. Jun 2010 15:06

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Zitat:

Zitat von xZise (Beitrag 1032650)
geht das nicht mit der TStringList?

Gerade damit möchte ich es wie erwähnt nicht machen, weil ich große Textdateien habe und die nicht komplette im Speicher halten möchte.

Zitat:

Zitat von xZise (Beitrag 1032650)
Das einzige was möglich ist, nach einer Byte Order Mark zu gucken, aber das greift eigentlich nur bei UTF kodierten Texten

Genau an sowas dachte ich. Also wenn eine BOM da ist, wird so eingelesen wie die BOM es angibt. Sonst als ANSI. Wie kann ich das automatisch ermitteln (und ggf. mit dem TStreamReader nutzen)?

BlueStarHH 30. Jun 2010 15:07

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Zitat:

Zitat von Bummi (Beitrag 1032654)
für UTF vorher prüfen ob die ersten drei Byte ef bb bf enthalten?

Gibts da nichts von Delphi vorgefertigtes für? Ich brauche ja nicht nur UTF8 und ANSI sondern auch die anderen üblichen Kodierungen (UTF7, UTF16, usw). Es muss doch mit Delphi 2010 möglich sein ohne viel Aufwand diese Dateien zeilenweise einzulesen.

Deep-Sea 30. Jun 2010 15:08

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Schau dir dafür doch mal TEncoding.GetPreamble an :wink:

Nachtrag: Oder gleich TEncoding.GetBufferEncoding ...

xZise 30. Jun 2010 15:13

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Moin,
okay das mit den TStringList hatte ich nicht gelesen, aber dennoch habe ich die Lösung "aus Versehen" zitiert. Und zwar guck doch einfach mal wie das TStrings macht. Dann machst du das genauso.

MfG
Fabian

DataCool 30. Jun 2010 15:33

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Hi,

@BlueStarHH:
Mit Deinem Delphi2010, solltest Du aber auch mit TFileStream und TStringStream + Encoding arbeiten können.

Greetz Data

himitsu 30. Jun 2010 15:48

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Wenn es wirklich (fast) nur Zeilenweise sein soll:
http://www.delphipraxis.net/151898-s...ei-reader.html
http://www.delphipraxis.net/151481-t...-einlesen.html
http://www.delphipraxis.net/151934-t...extstream.html

TStringStream, TStringList/TStrings usw. lesen alle die Datei komplett in den Arbeitsspeicher.
Sie können alles dekodieren, welches über TEncoding verfügbar gemacht ist/wird ... also alles.
Standardmäßig kann TEncoding mit Unicode (UTF-16), BigEndian-Unicode, UTF-8, UTF7, Ansi und ASCII umgehn. (wobei ASCII beim Auslesen als Ansi erkannt wird, da es ebenfalls keinen eigenen BOM besitzt)

Bbommel 30. Jun 2010 15:59

AW: Wie Textdateien lesen? Unicode oder ANSI
 
Zitat:

Zitat von BlueStarHH (Beitrag 1032647)
ich habe bisher mit AssignFile und ReadLn Textdateien gelesen. Damit kann man leider keine Unicode-Dateien lesen.

Warum eigentlich nicht? Zugegebenermaßen habe ich es in der Regel mit UTF8-Codierten Dateien zu tun und habe daher jetzt nicht alle anderen Kodierungen präsent, aber für UTF8 kann ich sagen, dass ich AssignFile/readln auch problemlos nutze.

Einziger "Trick" ist, dass man eine neu gelesene Zeile nicht in einen
Delphi-Quellcode:
string
, sondern in einen
Delphi-Quellcode:
RawByteString
einliest, damit Delphi nichts von sich aus umzuwandeln versucht.

Damit könntest du dann auch problemlos testen, ob du beim Einlesen in der ersten Zeile zu Beginn einen BOM stehen hast und diesen auswerten. Mit der passenden Konvertierungsfunktion kannst du dann ja jede Zeile einzeln in einen sauberen Unicode-String wandeln.

Bis denn
Bommel


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 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