| Autor |
Beitrag |
PC-22
Hält's aus hier
Beiträge: 15
WIN XP
D6 Pers
|
Verfasst: Fr 22.04.05 11:38
Hallo,
ich möchte gerne eine bestimmte Zeile in einer txt-Datei auslesen.
Habe zur Zeit dies:
Delphi-Quelltext 1: 2: 3: 4:
| AssignFile(f, 'Dateipfad'); Reset(f); ReadLn(f, s); CloseFile(f); |
Dabei wir aber nur die erste Zeile ausgelesen.
Hoffe ihr könnt mir helfen.
MfG
PC-22
Zuletzt bearbeitet von PC-22 am Mo 25.04.05 11:52, insgesamt 1-mal bearbeitet
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 22.04.05 11:46
Entweder eine Schleife um das Readln bauen oder eine TStringList und LoadFromFile benutzen.
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Fr 22.04.05 11:53
Ich weiß zufällig was er will.
Also in einer Konsolenanwendung soll aud einer Datei nacheinander jede Zeile ausgelesen werden damit darin nach einem bestimmten String gesucht werden kann.
Bzw. weiß jemand wie mann direkt in der Datei nach dem String suche kann und dann die entsprechende Zeile auslesen un später überschreiben kann?
MfG,
Bud
|
|
PC-22 
Hält's aus hier
Beiträge: 15
WIN XP
D6 Pers
|
Verfasst: Fr 22.04.05 11:57
genau das 
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Fr 22.04.05 11:59
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 22.04.05 12:04
BudBundi666 hat folgendes geschrieben: | | Bzw. weiß jemand wie mann direkt in der Datei nach dem String suche kann und dann die entsprechende Zeile auslesen un später überschreiben kann? |
Geht nicht direkt. Das muss programmiert werden. Z.B.: Wie GTA-Place das macht.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 22.04.05 12:07
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Fr 22.04.05 13:30
Frauen machen es vielleicht anders? 
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Amiga-Fan
      
Beiträge: 534
|
Verfasst: Fr 22.04.05 13:47
| Zitat: | Frauen machen es vielleicht anders? |
Und Hermaphroditen erst 
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Fr 22.04.05 14:20
Meno, darf ich mich nicht mal vertippen???
Bei der 2. Funktion von GTA-Place sucht die in der ganzen Zeile nach 'Bla' oder muss die ganze zeile dann nur aus 'Bla' bestehen? (Ich hoffe ihr wisst was ich meine)
Und wenn ich nun die Zeile mit der 2. Funktion gefunden hab kann ich doch einfach mit ner Kombi mit der ersten die Richtige Zeile ausgeben?!? Oder?
Also
Delphi-Quelltext 1:
| ShowMessage('1. Zeile: ' + MyStringL[Ergebnis 2. Funktion]); |
Kann ich das dann auch anstatt es auszugeben ans Programm zurückgeben?
Wenn ich das richtig verstanden hab müsstre das dann doch heißen:
Delphi-Quelltext 1:
| Result:=MyStringL[Ergebnis 2. Funktion]); |
Oder nicht.
Und wie kann ich das machen das nach dem Bearbeiten genau die Zeile überschrieben wird?
wie bei normalen String mit replace?
MfG,
Bud
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Fr 22.04.05 16:53
1. Ich glaub, bin aber grad net sicher, der sucht ob die Zeile aus 'bla' besteht, also nicht z.B. 'bloblablub'.
2. Korrekt, eine Kombi aus beiden Funktionen ist möglich.
3. Result könntest du machen, hier würdest du aber als Result nur das bekommen, was du gesucht hast.
4. Was willste denn ersetzen, bzw. mit was willst du 'bla' ersetzen?
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Sa 23.04.05 04:05
Ganz wichtiges vorne weg muss in Delphi6 sein.
Der soll nachher in einer Datei nach Beutzernamen suchen die Zeile kopieren dann wir damit gearbeitet und nacher soll die alte Zeile durch die bearbeitete ersetzt werden.
Zum Beispiel die Datei ist wie ein mehrdeminionales Array aufgebaut:
Benutzername Trennzeichen Passwort Trennzeichen Gehalt Trennzeichen bisher gesammt erhalten Zeilenende
Benutzer1;pass1:1000;3000
Benutzer2;pass2;1200;3600
Chef;Boss;3000;9000
dann in der Konsole nach dem Benutzernamen gefragt, eingabe zB. Beenutzer2 die Zeile soll ausgelesen werden kopiert in ein Array zerteilt (einfacher beim Zugriff), dann soll das Passwort abgefragt werden (soll natürlich das zum Benutzer sein), wenn OK bearbeitet (das kann dann in den Array geschrieben werden), anschließend wird der Array wieder so zusammen gesetzt wie die Zeilen in der Datei.
Nach dem zusammen setzen soll die geänderte Zeile die wieder zusammen gesetzt wurde in die Datei geschrieben werden wo sie vorher ausgelesen wurde.
Also:
Benutzer1;pass1;1000;3000
Benutzer2;pass2;1300;4900
Chef;Boss;3000;9000
So das Prinzip was wir umsetzten wollen.
Gut nä?
MfG,
Bud
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Mo 25.04.05 11:13
Noch eine frage.
Wenn ich jetzt die Sachen in der Stringlist finden würde und über einen Zwischenspeicher bearbeitet hätte.
Wie kann ich einen String in der Stringlist ändern?
Etwa so:
Delphi-Quelltext 1:
| MyStringL[1]:='Bearbeiteter Text'; |
würde das die zweite Zeile in 'Bearbeiteter Text' ändern?
Und ist dann nur was im Speicher bearbeitet oder die Datei?
Oder muss ich die Datei noch ändern?
Wenn ja wie?
Überspeichern? Oder gibt es ne Möglichkei den Zeiger an die richtige Stelle zu setzen und dann replace oder einfach
replace(pos(Daten einer Zeilenkopier, In Datei), lengh(Zeilenkopie), 'neue daten'); ?
Jetzt schon danke.
MfG,
Bud
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 25.04.05 15:28
Delphi-Quelltext 1: 2:
| MyStringL[1] := 'Neuer Text'; MyStringL.SaveToFile('Dateiname.txt'); |
Einfach ändern und überspeichern.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Mo 25.04.05 20:52
Danke das hilft mir doch schon mal weiter.
Und er überschreibt dann die alte datei automatisch?
Wenn sie bereits geöffnet ist muss ich Sie doc bestimmt vorher schließen oder?
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Di 26.04.05 12:19
Logisch, wenn die Datei geöffnet ist kannst du sie nicht löschen,
allerdings beim LoadFromFile wird die Datei ja nicht "geöffnet".
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Di 26.04.05 13:44
Ich hab da ein Problem.
Ich bekomme immer eine Fehlermeldung wenn ich mit einem bestimmten String arbeiten will.
Die Fehlermeldung in der Anwendung selber:
Exeption EAccessViolation in Modul bank.exe bei 000043A4. Zugriffsverletzung bei Adresse 004043A4 in Modul 'bank.exe'. Lesen von Adresse 00000016.
Und in einem Fenster (Wie Nachrichtendienst):
EInvaliedPointer 'ungültige Zeigeroperation'
Das muss irgendwo hir liegen, kann sein das ich da was falsch habe weil ich hab noch nie mit Stringlisten gearbeitet und ich setz auch das erste mal mehrdimensionale dynamische Arrays ein.
Quellcode auf wesentliche gekürzt:
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:
| program bank;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
var ktnr:string=''; zeilenkopie:string='';
dir:string='';
DatenArray: array of array of string; MyStringL: TStringList;
procedure auslesen(); var Durchl: Integer; begin MyStringL:=TStringList.Create; MyStringL.LoadFromFile(dir+'/daten.txt');
SetLength(DatenArray, MyStringL.Count-1,4);
for Durchl:= 0 to MyStringL.Count-1 do begin zeilenkopie:=MyStringL[Durchl]; DatenArray[Durchl,1]:=Copy(zeilenkopie,1,AnsiPos(';', zeilenkopie)-1); Delete(zeilenkopie,1,AnsiPos(';', zeilenkopie)); DatenArray[Durchl,2]:=Copy(zeilenkopie,1,AnsiPos(';', zeilenkopie)-1); Delete(zeilenkopie,1,AnsiPos(';', zeilenkopie)); DatenArray[Durchl,3]:=Copy(zeilenkopie,1,AnsiPos(';', zeilenkopie)-1); Delete(zeilenkopie,1,AnsiPos(';', zeilenkopie)); DatenArray[Durchl,4]:=Copy(zeilenkopie,1,AnsiPos(';', zeilenkopie)-1); Delete(zeilenkopie,1,AnsiPos(';', zeilenkopie)); end;
MyStringL.Free; end;
begin GetDir(0,dir); auslesen(); end; readln; end. |
Unwichtige Textausgaben rausgekürzt.
Kann es sein das mein Versuch einen String aus der Stringliste in die VARIABLE zeilenkopie zu kopieren falsch ausgeführt wird (Falsche Syntax)?
Muss ich ander Metoden verwenden?
Ich hatte mal nur kurz in der Delphihilfe geschaut und da sind mir zwei methoden mit den Namen GetText und Text aufgefallen muss ich die benutzen?
Wenn, ja. Wie?
Jetzt schon danke für eure Hilfe.
MfG,
Bud
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Di 26.04.05 15:34
Der Fehler liegt wohl hier:
Delphi-Quelltext 1:
| SetLength(DatenArray, MyStringL.Count-1,4); |
1. Was soll die "4" bedeuten?
2. Du machst hier ".Count-1". Füllst aber dann die ganze StringList.
->
Delphi-Quelltext 1:
| SetLength(DatenArray, MyStringL.Count); |
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Di 26.04.05 16:23
| Zitat: | Der Fehler liegt wohl hier:
Sourcecode
ausgeblendet markieren
1:
SetLength(DatenArray, MyStringL.Count-1,4);
1. Was soll die "4" bedeuten?
2. Du machst hier ".Count-1". Füllst aber dann die ganze StringList.
|
Datenarray ist ein mehrdimensionales synamisches Array
| Zitat: | | DatenArray: array of array of string; |
Deshalb SetLength(DatenArray, MyStringL.Count-1,4)
Soll die Länge des Arrays auf MyStringCount-1 und 4 setzten, so dass
wenn die Datei aus 10 Zeilenbesteht (Index 0 bis 9) das Array auch aus 10 Zeilen (Index 0 bis 9) bestehen soll.
Und 4 für die zweite Dimension weil ich weis das jede Zeile sozusagen 4 Spalten hat.
Und wiso füll ich die Stringliste?
Der soll doch die Zeile kopieren in zeilenkopie dann alles bis zum ersten ";" in DatenArray[Gleicher Index wie Zeile, Spalte1] schreiben, den Teil löschen mit Simikolon und dann den nächsten Teil kopieren und löschen.
Wenn er dann die ganze Zeile kopiert hat soll er das Gleiche mit der nächsten machen.
Dashalb auch die varible Durchl die den Index der Zeile in der String list bestimmen soll in der Schleife.
Oder gibt MyStringL.Count-1 nicht den hösten Indexwert (letzte Zeile) der Stringliste zurück oder etwa nicht als integer wert?
So sieht die Datei aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| 12345670;9876;0;1000.00;0.00; 12345671;8765;0;1100.00;-100.00; 12345672;7654;0;1200.00;-200.00; 12345673;6543;0;1300.00;-300.00; 12345674;5432;0;1400.00;-400.00; 12345675;4321;0;1500.00;-500.00; 12345676;3210;0;1600.00;-600.00; 12345677;2109;0;1700.00;-700.00; 12345678;1098;0;1800.00;-800.00; 12345679;0987;0;1900.00;-900.00; 12345680;9987;0;2000.00;-1000.00; 12345681;9976;0;2100.00;-1100.00; |
Vielleicht hab ich ja irgendwo einen Denkfehler.
Ich hoffe du weißt was ich damit meine.
MfG,
Bud
|
|
BudBundi666
      
Beiträge: 23
Win 95, Win 98, Win XP
D6 Pers
|
Verfasst: Di 26.04.05 17:35
OK du hattes doch recht bloß hatte ich dich falsch verstanden.
Ich hatte ja .Count-1 benutzt weil ich dachte (falsch) das er dann wenn da zB Count-1=9 raus kommt das zum höhsten Index des Arrays setzt aber man muss ja die Länge angeben.
Also .Count, wenn Count 10 ist setzt er die Länge auf 10 also 0..9.
Und der selbe fehler war auch bei der 2. Dimension ich hab den höhsten Index wert angegeben nicht die länge.
|
|