![]() |
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:
Ich habe schon verschiedenes TEncoding probiert, aber das hilft hier nicht.
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 Weiß hier jemand einen Rat wie ich die ganze Datei eingelesen bekomme? Vielen Dank im Voraus! |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Delphi-Quellcode:
Wird dir sicherlich nicht helfen. Aber das da funktioniert bei mir einwandfrei. Delphi 10.2 Starter.
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; Die Datei wurde mit Notepad++ erstellt. |
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 |
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: |
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 |
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:
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.
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;
Delphi-Quellcode:
Mir gehen hier leider die Ideen aus.
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; .... Für weitere Hilfe wäre ich sehr dankbar. |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Zitat:
Grüße Dalai |
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 |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Zitat:
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 |
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:
Der Memorystream hat direkt eine SavetToFile-Methode. Somit nutze ich *keine* StringList mehr und alles funktioniert. :-D
fs_Gesamt.CopyFrom(fs, fs.Size);
Vielen Dank für den Schubs in die richtige Richtung! :dp: Zitat:
Vielen Dank an alle und Gute N8! |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Hmm..
Mal eine Frage: Könnte es sein, dass der Text in der TStringList richtig ist, jedoch bei der Ausgabe im Memo am #0 abgeschnitten wird? Ich habe in einer StringList so oft Files mit #0 geladen und bearbeitet.. Alles ohne Probleme. Jedoch bei der Anzeige im Memo ist am #0 ende. |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Nein, LoadFromStream und LoadFromFile behandeln auch extra die 0 und schneiden schon ab.
EXTRA = absichtlich eingebaut Es gibt auch einen Unterschied zwischen den vielen TStrings. Bei TStringList können während ihrer Nutzung sogar #0 und Zeilenumbrüche innerhalb eines "Strings" enthalten sein, da dort intern und in den Property/Methoden des TStrings der Delphi-"String" genutzt wird, welcher es erlaubt. Bei TMemoStrings und Anderen ist das nicht möglich. |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Hmm..
Dass war der Grund meiner Frage.. Ich habe bisher TStringList zum Laden von Text-Dateien verwendet und da hat es mit #0 kein Abschneiden gegeben. LoadFromStream und LoadFromFile mach jeweils keinen Unterschied, da ja LoadFromFile einen FileStream erzeugt und mit diesem dann an LoadFromStream aufruft. (Zumindest bei D6 ;) ) Unter D6 verwendet das LoadFromStream von TStringList auch nur die Funktionen von TStrings und ist somit identisch zu TMemoStrings. Die TStringList hat keine eigene LoadFrom.. Funktionen. Das bei einem Memo bei #0 abgeschnitten wird, hat eher den Hintergrund, dass der Text per SendMessage (WM_SETTEXT) an das Memo.Handle (= Windows Edit) geschickt wird, und dort halt ein String ohne Längenangabe versendet wird, welcher dann wie ein PChar verwendet wird und bei dem ist an #0 ende.. ;) Würde man somit auf Memo.Lines direkt zugreifen, könne nach einem LoadFrom.. dort doch der komplette Test stehen, nur wird dieser nicht im Memo angezeigt. (Oder so ähnlich...) ich vermute, dass sich mit Umstellung auf Unicode hier etwas verändert hat.. |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Seit Delphi 2009 gibt es im LoadFrom... auch noch die Behandlung des Encodings.
Und da kommt es auch drauf an, wie TEncoding mit #0 umgeht. Nach dem Laden und Decodieren der Datei/Stream kommt der Text dann in TStrings.SetTextStr rein und siehe da, eine Abbruchbehandlung für #0, da das Ganze als PChar behandelt wird. :stupid:
Delphi-Quellcode:
procedure TStrings.SetTextStr(const Value: string);
var P, Start, LB: PChar; S: string; LineBreakLen: Integer; begin BeginUpdate; try Clear; P := Pointer(Value); if P <> nil then if CompareStr(LineBreak, sLineBreak) = 0 then begin // This is a lot faster than using StrPos/AnsiStrPos when // LineBreak is the default (#13#10) while P^ <> #0 do begin Start := P; while not (P^ in [#0, #10, #13]) do Inc(P); SetString(S, Start, P - Start); Add(S); if P^ = #13 then Inc(P); if P^ = #10 then Inc(P); end; end else begin LineBreakLen := Length(LineBreak); while P^ <> #0 do begin Start := P; LB := AnsiStrPos(P, PChar(LineBreak)); while (P^ <> #0) and (P <> LB) do Inc(P); SetString(S, Start, P - Start); Add(S); if P = LB then Inc(P, LineBreakLen); end; end; finally EndUpdate; end; end; |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
@Holger,
Zitat:
Ich habe die Datei aus Post #4 nur per LoadFromFile() in eine TStringList geladen und *direkt* wieder über SaveToFile() als Datei ausgegeben. Also kein Memo dazwischen. himitsu hat ja gezeigt wo die Abbruch-Bedingung steht. Danke für die Infos! Ist schon verrückt was einem alles als zu bearbeitende Dateien "untergejubelt" wird... :shock: |
AW: StringList => LoadFromFile liest Datei nur zum Teil ein
Wenn Du eh nur kopieren willst, warum nutzt Du dafür einen Interpreter (TStringlist) ?
Nutz Tfilestream/Blockread/blockwrite oder das OS. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz