Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi UTF8 - Große csv-Datei Zeilenweise lesen (https://www.delphipraxis.net/149782-utf8-grosse-csv-datei-zeilenweise-lesen.html)

Pfaffe2 30. Mär 2010 08:20


UTF8 - Große csv-Datei Zeilenweise lesen
 
Delphi 2009

Früher konnte man mit folgender Varaiante eine Textdatei zeilenweise lesen, jedoch funktioniert das nicht mit UTF8 kodierten Dateien:
Delphi-Quellcode:
F: TextFile;
lStr: string;
...
AssignFile(F, OpenDialog1.Filename);
Reset(F);
while not Eof(F) do begin
  Readln(F, lStr);
  Do_Auswerten(lStr);
end;
OK mit Hilfe einer Stringliste kann ich die UTF8 Daten laden und auswerten:
Delphi-Quellcode:
lStringList:= TStringList.create;
try
  lStringList.LoadFromFile(OpenDialog1.FileName, TEncoding.UTF8);
  for i:= 0 to StringList.count-1 do begin
    Do_Auswerten(lStringList[i]);
  end;
finally
  lStringList.free
end;
Diese Variante hat jedoch den Nachteil, dass die Datei erstmal komplett in den RAM geladen werden muss.

Gibt es auch eine Variante eine UTF8-Datei zeilenweise auszuwerten ohne sie komplett in den RAM zu laden?

[edit=SirThornberry]Titel geändert - Mfg, SirThornberry[/edit]

Bernhard Geyer 30. Mär 2010 08:34

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
Ja, indem du selbst mit TFileStream arbeitest und die Textdatei "häppchenweise" einlist und nach CRLF untersuchst.

himitsu 30. Mär 2010 08:54

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
Delphi-Quellcode:
F: TextFile;
aStr: RawByteString;
//lStr: String;
...
AssignFile(F, OpenDialog1.Filename);
Reset(F);
while not Eof(F) do begin
  ReadLn(F, aStr);
  //lStr := Utf8Decode(aStr);
  //Do_Auswerten(lStr);
  Do_Auswerten(Utf8Decode(aStr));
end;
Diese alten "Pascal"-Funktionen arbeiten, auch unter D2009/2010, immer nur mit ANSI (oder notfalls anderen Single-Byte-Codierungen), selbt wenn man ihnen einen String/WideString/UnicodeString übergibt.

p80286 30. Mär 2010 09:40

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
Zitat:

Zitat von Pfaffe2
Früher konnte man mit folgender Varaiante eine Textdatei zeilenweise lesen, jedoch funktioniert das nicht mit UTF8 kodierten Dateien:

Was funktioniert denn da nicht?
das CRLF ist doch von UTF8 nicht betroffen oder?

Gruß
K-H

himitsu 30. Mär 2010 09:44

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
Zitat:

Zitat von p80286
Was funktioniert denn da nicht?

Delphi dekodiert das nur nicht automatisch :roll:

Zitat:

Zitat von p80286
das CRLF ist doch von UTF8 nicht betroffen oder?

Die bekannten Steuercodes #0 bis #31 liegen ja unterhalb von #128 (im 7-Bit-Bereich) und werden nicht umcodiert.

Pfaffe2 30. Mär 2010 09:49

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
Danke für die Antworten.
TFileStream ist wohl die Alternative.

himitsu 30. Mär 2010 09:52

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
TFileStream + TStringStream könnte auch hilfreich sein.

Pfaffe2 30. Mär 2010 15:12

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
lStringStream.LoadFromFile() ist aber keine Alternative, da auch hier die komplette Datei geladen wird.

Folgendes funktioniert:
Delphi-Quellcode:
F: TextFile;
lStr: string;
...
AssignFile(F, OpenDialog1.Filename);
Reset(F);
while not Eof(F) do begin
  Readln(F, lStr);
  lStr:= UTF8ToWideString(lStr);
  Do_Auswerten(lStr);
end;

SirThornberry 30. Mär 2010 15:18

Re: UTF8 - Grosse csv-Datei Zeilenweise lesen
 
Zitat:

Zitat von Pfaffe2
lStringStream.LoadFromFile()

Du kannst ja auch einen Filstream nehmen und anstelle die Datei in einem Rutsch komplett einzulesen liest du sie (wie bereits von anderen erwähnt) Stückchenweise ein bis ein Zeilenumbruch kommt.

himitsu 30. Mär 2010 16:19

Re: UTF8 - Große csv-Datei Zeilenweise lesen
 
Ups, ich dachte man kann dem StringStream auch einen anderen Stream übergeben, aber da hatte ich wohl was werwechselt ... mal sehn, wenn ich ein bissl aufgeräumt hab, dann lade ich meine Klasse vielleicht hoch.


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