Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 17.08.11 10:01 
Könnte das für dich die Lösung sein?
www.delphi-forum.de/viewtopic.php?t=105965
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 17.08.11 10:46 
Sollte nicht all zu lange dauern die Datei einzulesen, 47000 Zeichen ist gar nicht so viel.

ausblenden 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
    // Datei laden
    sl.LoadFromFile('C:\Datei.txt');

    // 1A1A durch Zeilenumbruch ersetzen
    sl.Text := StringReplace(sl.Text, '1A1A', sLineBreak, [rfReplaceAll]);

    // korrigierte Datei speichern
    sl.SaveToFile('C:\Datei2.txt');

    // oder in ein memo ausgeben
    Memo1.Text := sl.Text;
  finally
    FreeAndNil(sl);
  end;
end;
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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... :roll:
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 17.08.11 12:27 
so funzt jetzt erstmal, habs mit Tstringlist gemacht, mit Tstrings hats nicht gefunzt.
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 17.08.11 13:24 
So hab noch ein kleines Problem:
wollte das ganze jetzt in einer Schleife ausführen:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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?

ausblenden Delphi-Quelltext
1:
2:
3:
  s := filedata.Text;
  i := pos('1A1A', s);
  Delete(s, 1, i - 1);


Was genau willst du eigentlich erreichen?
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 17.08.11 13:42 
Kann es sein, dass ihr von #1A#1A und nicht von '1A1A' redet?

Beste Grüße
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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.
ausblenden 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); //Hier wird nur das Trennzeichen gelöscht
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 17.08.11 13:47 
user profile icondaywalker0086 hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden 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(txtdatado
begin
 I:=pos('1A1A'.txtdat);
 delete(txtdat,0,I-1);
form1.Listbox1.items.add(txtdat);
end;


Ist das Absicht?
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: 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...