Autor |
Beitrag |
daywalker0086
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 09:57
Hallo Leute,
ich habe folgendes Problem:
In einer TExtdatei stehen immer Strings die mit einem 1A1A enden. Also ein anderes Trennzeichen.
Wie kann ich das einfach auslesen?
kann ich dazu den read Befehl verwenden? Ich wies halt nicht wie der anzuwenden ist. Hab bisher nur readln benutzt.
Für Hinweise wäre ich dankbar.
Grüße Christian
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 17.08.11 10:01
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 10:08
Danke für den Link, den hatte ich mir schon reingezogen.
Das Problem ist, das in den einelnen Zeilen eben die normalen Trennzeichen drin stehen, welche aber zum String gehören und eben nicht das Zeilenende markieren. Wenn ich jetzt mit Readln das Zeilenweise auslese, und dann schaue obmein Trennzeichen 1A1A drin ist muss er ja eventuell nochmal ne Zeile lesen bis das Trennzeichen kommt.
Am besten wäre "lies solange bis 1A1A kommt".
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 17.08.11 10:15
Wenn die Dateien nicht zu groß sind, kannst du die auch komplett einlesen und mit StringReplace 1A1A durch 0D0A (also den "normalen" Zeilenumbruch) und danach wie gewohnt arbeiten.
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 10:22
So eine Datei besteht aus ca. 47000 Zeichen ich weis jetzt nicht ob das viel ist.
Wie müsste ich dann die Datei einlesen.
Das wäre ja ein String mit 47000 Zeichen...
Das mit dem ersetzen kann ich nicht einfach so machen, da ich ja dann wieder das Problem habe das, genau diese Folge im String vorkommt aber nicht das Zeilenende ist.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mi 17.08.11 10:46
Sollte nicht all zu lange dauern die Datei einzulesen, 47000 Zeichen ist gar nicht so viel.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var sl: TStrings; begin sl := TStringList.Create; try sl.LoadFromFile('C:\Datei.txt');
sl.Text := StringReplace(sl.Text, '1A1A', sLineBreak, [rfReplaceAll]);
sl.SaveToFile('C:\Datei2.txt');
Memo1.Text := sl.Text; finally FreeAndNil(sl); end; end; |
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 11:09
Danke für die Antwort, aber wie schon geschrieben bringt das mit dem ersetzen nichts.
ICh habe die 1A1A als Trennzeichen verwendet, weil das übliche Zeilentrennzeichen im String vorkommt.
Wenn ich das jetzt wie du geshcrieben hast abspeichere und dann wieder einlese, hab ich wieder den Salat, dass der mir den String zerteielt weil er denkt da wär das Zeilenende obwohl das eben noch zum String gehört.
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 11:58
ICh habe jetzt versucht die ganze Datei einzulesen und mir erstmal das erste Vorkommen meines Strings anzeigen zu lassen:
Delphi-Quelltext 1: 2: 3:
| sl.LoadFromFile(data); i:=pos('1A1A',sl.Text); form1.Listbox1.Items.add(IntToStr(i)); |
aber ich bekomme nur 0 ausgegeben ob der String nicht an erster stelle kommt.
Das weist darauf hin das der String nicht gefunden wurde, aber wieso? An was kann es liegen?
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mi 17.08.11 12:23
Wie wärs wenn du die Datei (zumindest einen Teil) mal hier postest? Ansonsten ist das hier nur Rätsel raten... 
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 12:27
so funzt jetzt erstmal, habs mit Tstringlist gemacht, mit Tstrings hats nicht gefunzt.
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 13:24
So hab noch ein kleines Problem:
wollte das ganze jetzt in einer Schleife ausführen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var txtdat:string; filedata:tstringlist; begin txtdat:=filedata.Text for lines:=0 to length(txtdata) do begin I:=pos('1A1A'.txtdat); delete(txtdat,0,I-1); form1.Listbox1.items.add(txtdat); end; |
das Problem ist, das er mir den String nicht kürzer macht. Also die Deleteanweisung wird nicht richtig ausgeführt oder ich hab da irendeinen Fehler drinnen, den der Compiler mir nicht sagt.
ZWeitens ist die For Schleife nicht gut, der String wird ja immer kürzer, wird die Variable immer neu verglichen also nach der Deleteanweisung wird ja wieder verglichen oder wird dort immer mit dem Ursprungswert der Variable verglichen?
Über Vorschläge wäre ich sehr dankbar.
Grüße Christian
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mi 17.08.11 13:33
Ein String-Index beginnt bei 1. Wird deine StringList überhaupt erzeugt? Welchen Sinn macht es jedes Zeichen durchzugehen wenn du alles von Anfang bis '1A1A# entfernen willst?
Delphi-Quelltext 1: 2: 3:
| s := filedata.Text; i := pos('1A1A', s); Delete(s, 1, i - 1); |
Was genau willst du eigentlich erreichen?
|
|
Tastaro
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: Mi 17.08.11 13:42
Kann es sein, dass ihr von #1A#1A und nicht von '1A1A' redet?
Beste Grüße
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 13:46
Der Hinweis dass der String bei 1 beginnt hat mich schonmal weiter gebracht. Hatte ich garnicht dran gedacht.
So das mit dem Delete solle nur zum Test sein.
Den Teilstring speichere ich natürlich erst in einer anderen Variable, bevr ich den rauslösche.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var txtdat, substring:string; filedata:tstringlist; begin txtdat:=filedata.Text; for lines:=0 to length(txtdata) do begin I:=pos('1A1A',txtdata); substring:= copy(txtdat,1,I-1); form1.Listbox1.items.add(substring); delete(txtdat,0,I-1); delete(txtdat,0,4); end; |
Jetzt hab ich nur noch das Problem mit der For Schleife, wie kann ich das umändern, dass die Schleife auch nur so oft durchlaufen wird bis der String lehr ist? So wie oben geschrieben wird sie zu oft durchlaufen und gibt mir am Ende nur noch 0 zurück, da ja alles schon gelöscht wurde.
Zuletzt bearbeitet von daywalker0086 am Mi 17.08.11 13:55, insgesamt 1-mal bearbeitet
|
|
buster
      
Beiträge: 66
Erhaltene Danke: 7
WIN 7
Delphi 2010 Prof
|
Verfasst: Mi 17.08.11 13:47
|
|
daywalker0086 
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 17.08.11 13:55
Schreibfehler, habs korrigiert
Edit: so hab das auch gelöst, man nehme einfach die Whileschleife und prüfe ob length(Txtdata)>0 ist.
Danke an alle Beteiligten!
Zuletzt bearbeitet von daywalker0086 am Mi 17.08.11 14:28, insgesamt 2-mal bearbeitet
|
|
Tastaro
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: Mi 17.08.11 14:04
Mit einer for-Schleife kommst du hier nicht so recht weiter. Probier mal eine while-Schleife. Die ist viel toller.
Beste Grüße
|
|
buster
      
Beiträge: 66
Erhaltene Danke: 7
WIN 7
Delphi 2010 Prof
|
Verfasst: Mi 17.08.11 14:05
Da ist immer noch txtdat und txtdata ? Ist das eine Kopie vom Quelltext oder nur abgeschrieben ? Ich schätze mal, du möchtest mit txtdat arbeiten...
|
|