Entwickler-Ecke
Dateizugriff - UNICODE formatierte Textdatei zeilenweise einlesen ReadLn?
$RumTobi$ - Sa 17.11.07 16:57
Titel: UNICODE formatierte Textdatei zeilenweise einlesen ReadLn?
Ein Hallo an die Experten ...
Folgendes Problem:
Ich besitze eine unicodeformatierte Textdatei "beispiel.tmp"
Ich brauche zeilenweise Zugriff auf die Datei.
Früher als ich noch ansiformatioerte Textdateien hatte ging es noch so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm4.FormActivate(Sender: TObject);
var Daten: TextFile; s: Double;
begin AssignFile(Daten,'beispiel.tmp'); Reset(Daten); ReadLn(Daten,s); CloseFile(Daten); end; |
Wie bekomme ich das denn nun mit der oben beschriebenen unicodeformatierten Textdatei hin?
Ich benutze Delphi 7.
Vielen Dank
Bernhard Geyer - Sa 17.11.07 19:47
Titel: Re: UNICODE formatierte Textdatei zeilenweise einlesen ReadL
$RumTobi$ hat folgendes geschrieben: |
Wie bekomme ich das denn nun mit der oben beschriebenen unicodeformatierten Textdatei hin?
Ich benutze Delphi 7. |
Gar nicht mit Bordmitteln.
Entweder selbst machen, "Vorlagen" von der JclUnicode aus der Jedi verwenden oder das Unicode-Stringlist-Klassen des Elpacks oder der TNTWare-Controls
$RumTobi$ - So 18.11.07 01:50
Titel: Re: UNICODE formatierte Textdatei zeilenweise einlesen ReadL
Bernhard Geyer hat folgendes geschrieben: |
$RumTobi$ hat folgendes geschrieben: | Wie bekomme ich das denn nun mit der oben beschriebenen unicodeformatierten Textdatei hin?
Ich benutze Delphi 7. |
Gar nicht mit Bordmitteln.
Entweder selbst machen, "Vorlagen" von der JclUnicode aus der Jedi verwenden oder das Unicode-Stringlist-Klassen des Elpacks oder der TNTWare-Controls |
Leider bin ich bei dem Versuch JclUnicode und TNTWare-Controls zu verstehen schon gescheitert ... Die ganze Thematik ist für mich doch ziemliches Neuland.
Gibt es denn keine "paar Zeilen" die auch ich verstehe um eine einzelne Zeile aus einer unicodierten Textdatei in einen "klassischen" String in Delphi 7 zu konvertieren ???
Ich hoffe noch immer auf die Hilfe der Experten ...
DANKE !!!
Lossy eX - So 18.11.07 12:08
Mike Lische hat auch eine
Unicode Library [
http://www.soft-gems.net/index.php?option=com_content&task=view&id=23&Itemid=33] veröffentlicht. In der ist auch eine
TWideStringList enthalten. Mit dieser kannst du auch direkt eine ganze Datei einlesen. Es ginge zwar auch das direkt einzulesen allerdings wenn du so gar keine Ahnung davon hast ist es besser das andere machen zu lassen.
Das Konvertieren von einem UnicodeString in einen DelphiString geht ganz einfach in dem du einen WideString auf einen String zuweist oder aber auch mit der Methode
WideCharLenToStrVar. Allerdings solltest du dir bewusst sein, dass beim Konvertieren höchstwahrscheinlich auch Daten verlohren gehen. Denn mit Unicode kannst du wesentlich mehr Zeichen ablegen als mit normalen AnsiStrings.
Unterstützend dazu solltest du dir evtl. mal folgendes anschauen.
http://de.wikipedia.org/wiki/Unicode
Delete - So 18.11.07 13:00
@$RumTobi$:
Häng doch Deine Textdatei - oder wenigstens ein paar Zeilen - an Deine Frage ran.
$RumTobi$ - So 18.11.07 16:03
Lossy eX hat folgendes geschrieben: |
Mike Lische hat auch eine Unicode Library [http://www.soft-gems.net/index.php?option=com_content&task=view&id=23&Itemid=33] veröffentlicht. In der ist auch eine TWideStringList enthalten. Mit dieser kannst du auch direkt eine ganze Datei einlesen. Es ginge zwar auch das direkt einzulesen allerdings wenn du so gar keine Ahnung davon hast ist es besser das andere machen zu lassen.
Das Konvertieren von einem UnicodeString in einen DelphiString geht ganz einfach in dem du einen WideString auf einen String zuweist oder aber auch mit der Methode WideCharLenToStrVar. Allerdings solltest du dir bewusst sein, dass beim Konvertieren höchstwahrscheinlich auch Daten verlohren gehen. Denn mit Unicode kannst du wesentlich mehr Zeichen ablegen als mit normalen AnsiStrings.
Unterstützend dazu solltest du dir evtl. mal folgendes anschauen.
http://de.wikipedia.org/wiki/Unicode |
So nun bin ich einen halben Sonntag weiter und das Ergebnis ist fast schon peinlich ...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| unit Unit1;
interface
uses Windows, SysUtils, Dialogs, Controls, StdCtrls, Unicode , Forms, Classes;
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Label1: TLabel; procedure Button1Click(Sender: TObject); private public end;
const TestFileSize = 10000000;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var tlist:TWideStringList;
begin tlist.Create; tlist.Clear; tlist.LoadFromFile('Federn.tmp');
tlist.SaveToFile('Federn_save.tmp'); tlist.Free; end;
end. |
Resultiert aber in der Zeile:
Delphi-Quelltext
1:
| tlist.SaveToFile('Federn_save.tmp'); |
in einer "Exception" --> EAccessViolation.
Scheinbar sollte ich doch nicht mehr programmieren ?!
Die einzulesende Textdatei habe ich mit hochgeladen ...
Vielleicht versteht das ja jemand und noch besser vielleicht kennt jemand auch noch ne Fehlerlösung ?!
Danke nochmal
$RumTobi$ - So 18.11.07 16:05
nur zur Info :
die Datei "Federn.txt" heist natürlich "Federn.tmp"
jedoch erlaubt das Forum keine tmp-Dateien upzuloaden
Lossy eX - So 18.11.07 16:34
Versuch mal die Klasse folgendermaßen zu erstellen. Denn du hast derzeit keine sinnvolle Instanz erstellt.
Delphi-Quelltext
1:
| tlist := TWideStringList.Create; |
Außerdem sobald du die Datei mit der WideStringList wieder speicherst wird die resultierende Datei genau so Unicode enthalten wird wie die Quelldatei.
Wenn du jetzt auf einzelnen Zeilen zugreifen möchtest dann nimmst du dir die entsprechende Zeile aus der Liste und weist sie einem String zu. Sollte genügen. Mit diesem kannst du dann weiter arbeiten oder ihn abspeichern etc.
$RumTobi$ - So 18.11.07 19:11
VIELEN DANK ! Der Sonntag ist gerettet !
Vielleicht sollte ich och wieder öfters programmieren ... ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| unit Unit1;
interface
uses Windows, SysUtils, Dialogs, Controls, StdCtrls, Unicode , Forms, Classes;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var tlist:TWideStringList; i:integer;
begin tlist := TWideStringList.Create; tlist.Clear; tlist.LoadFromFile('Federn.tmp'); for i := 0 to tlist.Count-1 do begin ShowMessage(tlist.Strings[i]); end; tlist.SaveToFile('Federn_save.tmp'); tlist.Free; end;
end. |
DANKE nochmal !
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!