Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringList => LoadFromFile liest Datei nur zum Teil ein (https://www.delphipraxis.net/195050-stringlist-%3D-loadfromfile-liest-datei-nur-zum-teil-ein.html)

juergen 29. Jan 2018 19:21

StringList => LoadFromFile liest Datei nur zum Teil ein
 
Hallo zusammen,

ich muss bestimmte Dateien weiter verarbeiten. Dazu lade ich mir die Datei in eine TStringList. Dazu nutze ich die "LoadFormFile"-Methode.
Leider liest diese Methode die Datei nur soweit ein, bis "2"- Zeichen auftauchen.
Code:
Antwort
n. Gueltig: 244500018
18.01.2018 16:02:29.074 Resultat: Maschinenbarcode: 244500018 nicht aktiv !!!
18.01.2018 16:03:31.036 Datensatzart / Verarbeite Satz mit Länge: 0 / 84  2127 2187026       0244090018   BEGN 0244090018                            F   //<== bis "2127 wird eingelesen, der Rest fehlt
18.01.2018 16:03:31.036 Seriennummer gelesen: 2127
18.01.2018 16:03:31.038 Seriennummer nach Verarbeitung 1: 2127
18.01.2018 16:03:31.038 Snr: 2127
18.01.2018 16:03:31.038 Prüfe Ausweisnummer: 244090018
18.01.2018 16:03:31.038 Prüfe Ausweisnummer: 0
18.01.2018 16:03:31.038 Zeile: B 18.01.2018 07:50:26 244090018 0 187026 0 44090018 0 0 0 F «» 0 0 0 0 0 0 «»
18.01.2018 16:03:31.039 Buchungssatz: B 18.01.2018 07:50:26 244090018 0 187026 0 44090018 0 0 0 F «» 0 0 0 0 0 0 «»
18.01.2018 16:03:31.039 QS_Bemerkung gelesen:
18.01.2018 16:03:31.039 PersonID gelesen: 0
Ich habe schon verschiedenes TEncoding probiert, aber das hilft hier nicht.

Weiß hier jemand einen Rat wie ich die ganze Datei eingelesen bekomme?

Vielen Dank im Voraus!

LTE5 29. Jan 2018 19:27

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
var
 sl: TStringList;
begin
 sl := TStringList.Create;
 try
  sl.LoadFromFile('1.txt');

  ShowMessage(sl.Text);
 finally
  sl.Free;
 end;
end;
Wird dir sicherlich nicht helfen. Aber das da funktioniert bei mir einwandfrei. Delphi 10.2 Starter.
Die Datei wurde mit Notepad++ erstellt.

Dalai 29. Jan 2018 19:28

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Ist unmittelbar hinter der Stelle, bis zu der eingelesen wird, vielleicht ein Nullbyte oder anderes "ungültiges" (nicht druckbares) Zeichen? Der Blick auf die Datei mit einem Hexeditor ist in solchen Fällen immer eine gute Idee.

Grüße
Dalai

juergen 29. Jan 2018 19:47

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Liste der Anhänge anzeigen (Anzahl: 1)
Am Anhang mal ein Auszug aus einer der Dateien.
Für mich sieht das erste Zeichen wie ein Enterzeichen aus. Im Hex-Editor (Ultra-Edit im Hexmodus) verstehe ich nicht so ganz was da angezeigt wird. :oops:

Dalai 29. Jan 2018 20:11

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Nimm mal Notepad++ und du wirst sehen, dass meine Vermutung richtig war. Zeile 6 der angehängten Datei enthält nach dem 2127 ein NUL Byte (und danach noch weitere nicht-druckbare Zeichen). Ganz genau sieht man es mit HxD vom DP-Kollegen Mael - ein dickes Danke an ihn für das tolle Programm an dieser Stelle!

Sofern du diese Zeichen in der Datei nicht vermeiden kannst (weiß ja nicht, wie die Datei zustande kommt), wirst du wohl eine andere Methode zum Einlesen benutzen müssen, vielleicht über Streams.

Grüße
Dalai

juergen 29. Jan 2018 22:02

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
erstmal danke für die Tipps.

Ich hatte gehofft dass es mit TStream gehen könnte. Aber da wird auch nur bis "2127" gelesen.

Delphi-Quellcode:
var
  fs: TStream;
begin
  fs := TFileStream.Create(lbCsvDateien.Items[i], fmOpenRead);
  try
    try
      sl_EinzelDatei.LoadFromStream(fs);
    except
      on E: EReadError do
        ShowMessage(E.Message);
    end;
  finally
    FreeAndNil(fs);
  end;
end;
Dann hatte ich es mit ReadLn probiert. Damit werden zwar alle Zeichen gelesen, aber die Datei hat nicht mehr denselben Satz-Aufbau. Einige, wenige Zeilen haben einen anderen Inhalt wie die Ursprungsdatei.

Delphi-Quellcode:
sl_Gesamt_alle_Dateien := TStringList.Create;
try
  for i := 0 to ListBox_mit_allen_Dateien.Items.Count - 1 do
  begin
    sl_EinzelDatei := TStringList.Create;
    try
      try
        AssignFile(F, ListBox_mit_allen_Dateien.Items[i]);
        Reset(F);
        while not eof(F) do
        begin
          s := '';
          Readln(F, s);
          sl_EinzelDatei.Add(s);
        end;
      Except
        on E: EReadError do
          ShowMessage(E.Message);
      end;
    finally
      CloseFile(F);
    end;

      sl_Gesamt_alle_Dateien.AddStrings(sl_EinzelDatei);

      sl_EinzelDatei.Free;
  end;

  sl_Gesamt_alle_Dateien.SaveToFile(txtAusgabePfad.Text, TEncoding.Default);

finally
  sl_Gesamt_alle_Dateien.Free;
end;
....
Mir gehen hier leider die Ideen aus.

Für weitere Hilfe wäre ich sehr dankbar.

Dalai 29. Jan 2018 22:18

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Zitat:

Zitat von juergen (Beitrag 1392490)
Ich hatte gehofft dass es mit TStream gehen könnte. Aber da wird auch nur bis "2127" gelesen.

Delphi-Quellcode:
var
  fs: TStream;
begin
  fs := TFileStream.Create(lbCsvDateien.Items[i], fmOpenRead);
  try
    try
      sl_EinzelDatei.LoadFromStream(fs);
    except
      on E: EReadError do
        ShowMessage(E.Message);
    end;
  finally
    FreeAndNil(fs);
  end;
end;

Gehe ich recht in der Annahme, dass sl_EinzelDatei eine Stringliste ist? Wenn ja: das wird so nix. Der Stream liest alles, völlig egal, was das für Zeichen sind. Nur bei der Zuweisung zur Stringlist ist eben bei den Nullbytes Schluss. Du musst vor dieser Zuweisung die unerwünschten Zeichen rausfiltern, wenn du hinterher mit Strings arbeiten willst. Leider kann ich nichts konkretes in dieser Richtung beitragen, weil ich eine derartige Problemstellung noch nicht hatte. Ich meine mich aber zu erinnern, dass es bereits Thema hier in der DP war.

Grüße
Dalai

Fukiszo 29. Jan 2018 22:33

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
ich hatte mal ein vergleichbares problem,
ich habs per Stream in speicher geladen und dann nach $0D + $0A gesucht,
alles was vor $0D $0A kommt wird mit einer BufToText funktion in eine stringlist gespeichert.
Alle nicht lesbaren/druckbaren zeichen werden in BufToText rausgefiltert.
So etwas ist nur sinnvoll bei kleinen input dateien da jedes einzelne zeichen geprüft wird.

falls interesse daran besteht such ich den source raus wo ich es nutzte.
falls es generell falsch wäre spare ich mir die suche.

Grüße

p80286 29. Jan 2018 22:52

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Zitat:

Zitat von juergen (Beitrag 1392490)
Dann hatte ich es mit ReadLn probiert. Damit werden zwar alle Zeichen gelesen, aber die Datei hat nicht mehr denselben Satz-Aufbau. Einige, wenige Zeilen haben einen anderen Inhalt wie die Ursprungsdatei.

Woran machst Du das denn fest?
Lässt Du Dir den Inhalt z.B. in einem Memo anzeigen?

Alle Zeichen kleiner x20 sind Steuerzeichen und werden (oder auch nicht) bei der Ausgabe interpretiert. Hierbei ist es teilweise möglich, daß ein Ersatzzeichen ausgegeben wird oder auch das das Zeichen ignoriert wird.

Eine Quick and very dirty-Lösung wäre es, alle Zeichen kleiner x20 durch x20 zu ersetzen, dann könntest Du mit weiterhin mit Strings arbeiten.
Solange aber nicht klar ist woher die Zeichen stammen, ob sie sinnvoll oder sinnlos sind, geht wohl kein Weg an einer binären Verarbeitung vorbei.

Gruß
K-H

juergen 29. Jan 2018 23:15

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Hallo zusammen,

von Dalai kam der für mich entscheidende Tipp! (ich darf keine StringList nutzen, jetzt im Nachhinein ist das auch klar...)
Die einzelnen Dateien lade ich mir nun in einen TStream. Dann kopiere ich diesen Stream in einen TMemoryStream per copyfrom()
Delphi-Quellcode:
fs_Gesamt.CopyFrom(fs, fs.Size);
Der Memorystream hat direkt eine SavetToFile-Methode. Somit nutze ich *keine* StringList mehr und alles funktioniert. :-D

Vielen Dank für den Schubs in die richtige Richtung! :dp:

Zitat:

Zitat von juergen:
Dann hatte ich es mit ReadLn probiert. Damit werden zwar alle Zeichen gelesen, aber die Datei hat nicht mehr denselben Satz-Aufbau. Einige, wenige Zeilen haben einen anderen Inhalt wie die Ursprungsdatei.
Woran machst Du das denn fest?
Ich hatte das Ergebnis mit UltraCompare jeweils verglichen. Da sah ich dann die Unterschiede.

Vielen Dank an alle und Gute N8!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.
Seite 1 von 2  1 2      

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