Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - .txt einlesen, string bearbeiten


Dark-§hadow - Mi 12.09.07 23:50
Titel: .txt einlesen, string bearbeiten
Hallo Zusammen!

Ich versuche bzw. sucher derzeit folgendes:

Das Programm soll
-Eine .txt einlesen
-jede Zeile scannen und nach dem Doppelpunkt alles in der Zeile löschen
-In eine neue .txt einspeichern (meinetwegen eingelesen: bla.txt ausgabe: bla_bearbeitet.txt

Könnte mir hierfür jemand vielleicht schnell Hilfestellung geben? Ich habe mich noch nie an Text-und Stringverarbeitung vergriffen und bräuchte dieses Programm nun kurzfristig.

Beispiel bla.txt:
123.3435.123 :55
123.453.123 :2000

==> Bla_bearbeitet.txt
123.3435.123
123.453.123

MfG
Dark-§hadow


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Mi 12.09.2007 um 23:53


freak4fun - Mi 12.09.07 23:53

An welcher Stelle kommst du nicht weiter bzw. was hast du schon? :)

Edit:
Zerlege dein Problem in Teilprobleme.
1. Textdatei öffnen.
2. Zeile auslesen.
3. Doppelpunkt suchen.
4. Text hinter Doppelpunkt löschen.
5. Textdatei speichern.

MfG
freak


Christian S. - Mi 12.09.07 23:53

Schau mal nach Pos und Copy. Damit solltest Du weiter kommen.


Dark-§hadow - Do 13.09.07 00:02

Also ich habe bereits das Einlesen ^^

Var
Liste :TStringList;

und dann hab ich noch...

Liste.Loadfromfile('bla.txt'); (wobei es mir lieber wäre, würde man ein lib-Überblick bekommen, und die .txt raussuchen)

Mein Problem ist erstmal, dass er jede Zeile durchläuft, nach : sucht und (mit :) alles, was in der zeile noch folgt, einfach löscht.

//Edit@Freak4Fun: Das Speichern wird auch kein Problem denke ich (Liste.SavetoFile('bla_bearbeitet.txt'));


freak4fun - Do 13.09.07 00:07

user profile iconDark-§hadow hat folgendes geschrieben:
Also ich habe bereits das Einlesen ^^

Var
Liste :TStringList;

Das ist doch schonmal ein Anfang. ;)

user profile iconDark-§hadow hat folgendes geschrieben:
Liste.Loadfromfile('bla.txt'); (wobei es mir lieber wäre, würde man ein lib-Überblick bekommen, und die .txt raussuchen)


Du kannst zum Beispiel den OpenDialog benutzen:

Delphi-Quelltext
1:
2:
if Opendialog1.Execute then
  mytxt := Opendialog1.Filename;


user profile iconDark-§hadow hat folgendes geschrieben:
Mein Problem ist erstmal, dass er jede Zeile durchläuft, nach : sucht und (mit :) alles, was in der zeile noch folgt, einfach löscht.

In der Stringlist sind nun Strings, die du über eine Schleife ansprechen kannst.

Delphi-Quelltext
1:
2:
3:
4:
5:
for i := 0 to Liste.Count - 1 do
  begin
    Liste.Strings[i] 
    ...
  end;


Ich hoffe das hilft dir weiter. ;)

MfG
freak


jaenicke - Do 13.09.07 00:11

Erstens: Nimm keine relativen Verzeichnisse, das gibt nur Probleme, weil das das aktuelle Arbeitsverzeichnis benutzt und wenn dieses nicht das deiner Anwendung ist, wäre das schlecht, wenn die Datei dort liegt, was aber mit einem TOpenDialog kein Problem ist, denn das Aussuchen der Datei kannst du mit einem TOpenDialog machen, damit kann der Benutzer eine Datei auswählen.

Dann zur zeilenweisen Analyse: Weißt du was eine for-Schleife ist? Damit geht das.
// Ich seh gerade, dass da schon eine Antwort mit Beispiel kommt, da kann ich mir das sparen^^
Zur Analyse der Zeile selbst hat user profile iconChristian S. ja schon die Befehle gepostet, wenn du die nicht verstehst, dann frag bitte. Denn wenn du verstanden hast, was die machen, könntest du es auch hinbekommen.

Ansonsten poste einfach wieder den Quelltext wie weit du gekommen bist und was du z.B. an den Befehlen Pos und Copy nicht verstehst...


Dark-§hadow - Do 13.09.07 00:12

Ja, danke auf jeden Fall, aber den eigentlichen Qu, wofür ich die Hilfe brauch, ist ja des Suchen & Löschen, des bekomm ich wie gesagt nicht hin.


Dark-§hadow - Do 13.09.07 00:24

Also das aktuelle Arbeitsverzeichnis ermittelt man mit folgendem Befehl:

Delphi-Quelltext
1:
openDialog.InitialDir := GetCurrentDir;                    


Natürlich weiß ich, was eine For-Schleife ist ;) in dem Fall wird zum integer i:= 0
immer ein Zähler hinzugefügt, bis er alle Reihen (Liste.Count) durch hat. Nur stehe ich immer noch vor dem Pos- und CopyProblem.
Position ermittelt die Position, die speichert man dann i-wo in eine Zwischenvariable, dann soll mit copy ab da alles gelöscht werden... x_X helft mir bitte

//Edit: Entschuldigt den Doppelpost.

Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.


jaenicke - Do 13.09.07 00:28

Das stimmt bis
user profile iconDark-§hadow hat folgendes geschrieben:
dann soll mit copy ab da alles gelöscht werden...
;-)
Es reicht den gewünschten Teil herauszukopieren ;-).

Delphi-Quelltext
1:
ZweiteStringList[i] := Copy(ErsteStringList[i], 1, Pos('Trennmarkierung', ErsteStringList[i]) - 1);                    


Dark-§hadow - Do 13.09.07 00:35

Jaenicke kommentierst du vielleicht nochmal deinen meisterhaften Befehl? ;) Verstanden hab ich ihn zu 90% schon, aber da fehlen noch 10 ^^

Desweiteren taucht folgendes Problem beim versuchten Einlesen auf

Delphi-Quelltext
1:
2:
3:
if Opendialog1.Execute then
mytxt := Opendialog1.Filename;
Liste.Loadfromfile(mytxt);

Mit Verweis auf Liste.Loadfromfile (mytxt);

Was mach ich falsch? =(

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


freak4fun - Do 13.09.07 00:38

Bitte nimm dir etwas mehr Zeit zum Erstellen deiner Antworten/Posts. Ich weiß teilweise nicht was du willst. Auch sind deine Posts ungenau und teilweise unvollständig. :twisted: Du erwatest von uns auch aussagekräftige Antworten. ;)

Edit:
Gehe mit dem Mauscurser auf das Wort "Copy" in deinem Quelltext und drück F1. ;)

MfG
freak


jaenicke - Do 13.09.07 00:43

Die von mir gepostete Zeile macht folgendes:
Pos('Trennmarkierung', ErsteStringList[i]) gibt dir ja die Position von 'Trennmarkierung' im der i-ten Zeile der ersten Stringliste zurück. Copy kopiert alles aus dem angegebenen String von der ersten Stelle bis zur zweiten Stelle, in diesem Fall von Buchstabe eins bis Buchstabe Pos('Trennmarkierung', ErsteStringList[i]) - 1, was ja das Zeichen vor der Trennstelle ist.
Genau das willst du ja in der neuen StringList in der Zeile i haben, also packst du das noch da hin.

Ach so: Bitte poste auch die Fehlermeldungen... Ich vermute mal, dass du mytxt nicht als String-Variable deklariert hast...


Dark-§hadow - Do 13.09.07 00:46

Nur für dich, freak4fun, damit du genau den Fehler siehst, hab ich mal das Projekt geuppt und angehangen. Der Fehler wird in keinster Weis verziert, beschriftet o.ä....soweit ich das seh zumindest nicht x(


jaenicke - Do 13.09.07 00:48

Unterhalb des Quelltextes sollte eigentlich eine Beschreibung des Fehlers kommen ;-). Aber ich sehs mir mal an...

// EDIT: Ich sehs schon... der dritte Befehl gehört nicht mehr zu if, das muss

Delphi-Quelltext
1:
2:
3:
4:
5:
if Opendialog1.Execute then
begin
  mytxt := Opendialog1.Filename;
  Liste.Loadfromfile(mytxt);
end;
sein.


Dark-§hadow - Do 13.09.07 00:59

der gemeinte Fehler besteht jedoch weiterhin =/


freak4fun - Do 13.09.07 01:32

Hast du irgendwo:

Delphi-Quelltext
1:
2:
var
  mytxt: String;

stehen?

MfG
freak


Dark-§hadow - Do 13.09.07 01:36

Nochmals extra für dich =P


Delphi-Quelltext
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:
var
openDialog1 : TOpenDialog;
  Liste :TStringList;
  Liste2 :Tstringlist;
  Form1: TForm1;


procedure TForm1.Button1Click(Sender: TObject);
var i :integer;
mytxt : string;
begin
if Opendialog1.Execute then
begin
mytxt := Opendialog1.Filename;
Liste.Loadfromfile(mytxt);
end;
for i := 0 to Liste.Count - 1 do
  begin
    Liste.Strings[i];
liste2[i] := Copy(Liste[i], 1, Pos(';', Liste[i]) - 1);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
openDialog1 := TOpenDialog.Create(self);
end;


==> Jaaah, hab ich ^^

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


freak4fun - Do 13.09.07 01:38

Ich mach extra für dich mal meinen Rechner mit Delphi an. ;)


Michael Stenzel - Do 13.09.07 01:44

Hi.

Erzeugst Du den die Stringlisten mit

Delphi-Quelltext
1:
2:
3:
4:
...
Liste := TStringList.Create;
Liste2 := TStringList.Create;
...


?
Wenn nicht , hast Du den Fehler Schon gefunden.
Vergesse nicht, die Listen wieder zu löschen mit

Delphi-Quelltext
1:
2:
3:
4:
...
Liste.Free;
Liste2.Free;
...


Gruß
Michael


freak4fun - Do 13.09.07 01:53

Der Michael hat recht., wobei ich FreeAndNil(Liste); benutzen würde.

MfG
freak


Dark-§hadow - Do 13.09.07 01:59

Vielen Dank für die schnelle Hilfe =)


freak4fun - Do 13.09.07 02:09

Immer wieder gerne. :) Wenn der Fragensteller nett und freundlich bleibt macht das Antworten mehr Spaß. ;)

MfG
freak