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);
      // ... irgendetwas mit s tun
      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
user profile icon$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
user profile iconBernhard Geyer hat folgendes geschrieben:
user profile icon$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

user profile iconLossy 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 !