![]() |
Zeilen mit Stringliste bis zu bestimmten Zeichen auslesen
**Kopf kratz** Hoffe dass ist jetzt einigermassen verständlich :
Hab hier eine Datei, bei dieser möchte ich zunächst einmal den Anfang jeder Zeile auslesen. Die Anzahl der Zeilen habe ich in der Variable count gespeichert. Jetzt ist nur das Problem : Der Anfang jeder Zeile ist unterschiedlich, aber jedes Wort endet mit dem Zeichen |, also das Endzeichen für jedes Wort, zum Beispiel : Blabla1|Rest Blabla24985|Rest Blablu27u6|Rest Ich möchte jetzt dass mir jeweils Blabla1, Blabla24985 und Blablu27u6 in einer Stringliste gespeichert werden, damit ich diese später ausgeben kann... Ich bin mir aber jetzt unsicher wie ich das machen kann... Mit einer for - Schleife und einer Stringliste?!?! |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Guck dir mal die Befehle copy() und pos() an. Damit kannst du in Strings Zeichen auslesen. Musst mal danach suchen, hier gibts bestimmt einige Beispiele.
Edit: Ach ja ich würd jede Zeile in eine Stringlist laden und diese einträge durchgehen. |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Delphi-Quellcode:
StringList.Delimiter := '|':
StringList.DelimitedText := zeile; |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Herzlich willkommen in der Delphi-PRAXiS, DragonsTear.
Hier noch ein anderer Ansatz:
Delphi-Quellcode:
Freundliche Grüße vom marabu
function CreateStrings(fn: TFileName; nvSep: Char): TStrings;
begin Result := TStringList.Create; with Result do begin NameValueSeparator := nvSep; LoadFromFile(fn); end; end; procedure ExtractNames(sIn, sOut: TStrings); var i: Integer; begin sOut.Clear; for i := 0 to Pred(sIn.Count) do sOut.Add(sIn.Names[i]); end; |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Hm, hatte bisjetzt mit Stringlisten nicht viel zu tuen, muss mich insofern da erstmal reindenken...
Wenn ich das aber richtig verstehe, Marabu, machst du folgendes : nvSep ist das Trennzeichen, in meinem Fall | - du kreeierst dann eine Stringliste, mit NameValueSeperator extrahierst du dann den Zeilenanfang bis | und in der zweiten Prozedur werden die dann in der Stringliste sout gespeichert oder? |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Fast richtig,
Zitat:
marabu |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Delphi-Quellcode:
Hm, wollte jetzt erstmal guggen wies und ob es funktioniert... Das Problem ist, dass er mir bereits hier sauber abschmiert...
procedure TForm1.Oeffnen1Click(Sender: TObject);
begin OpenDialog.Options := [ofFileMustExist]; if OpenDialog.Execute then try Textdatei := CreateStrings((OpenDialog.FileName),'|'); ExtractNames(Textdatei,ItemListe); Itemnamen.Items.Assign(ItemListe); except Application.MessageBox ('Datei konnte nicht geladen werden!', 'Fehler', MB_OK); end; end; Die Stringliste ItemListe wird in OnCreate kreeiert... Wo ist der Fehler? Hängt es mit OpenDialog.Filename zusammen? |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Wo ist Textdatei deklariert? Und von welchem Typ?
Verwende bitte Delphi-Tags. |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Tschuldigung, Textdatei ist das Resultat von der Funktion CreateStrings die oben beschrieben ist.
Delphi-Quellcode:
function CreateStrings(fn: TFileName; nvSep: Char): TStrings;
begin Result := TStringList.Create; with Result do begin NameValueSeparator := nvSep; LoadFromFile(fn); end; end; |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Habe leider übersehen, dass der NameValueSeparator in D5 noch fest codiert ist:
Delphi-Quellcode:
So sollte es funktionieren.
function CreateStrings(fn: TFileName; nvSep: Char): TStrings;
var i, iPos: Integer; s: String; begin Result := TStringList.Create; with Result do begin LoadFromFile(fn); for i := 0 to Pred(Count) do begin iPos := Pos(nvSep, Strings[i]); if iPos > 0 then begin s := Strings[i]; s[iPos] := '='; Strings[i] := s; end; end; end; end; marabu |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Ich glaube der Fehler liegt woanders, da ich auch kein Delphi 5 verwende.
Es kommt immer noch zu einem Exception Fehler, wenn ich auf Datei öffnen klicke. Anschliessend klicke ich die Datei an, es ist eine Textdatei in C:\ mit den 3 Beispielzeilen im ersten Post. Dann kommt es zu einer EAccessViolation ... Auf Fortsetzen klicken kommt die nächste, anschliessend kommt, konnte Datei nicht öffnen. Aber die Datei ist vorhanden.... |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
In welcher Zeile stoppt der Debugger?
|
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Delphi-Quellcode:
In dieser Spalte
Itemnamen.Items.Assign(ItemListe);
EDIT : Ich habe bei der von marabu geposteten Funktion vor das sOut.Clear ein sOut.Create hinzugefügt damit die Liste auch kreeiert wird...
Delphi-Quellcode:
procedure ExtractNames(sIn, sOut: TStrings);
var i: Integer; begin sOut.Create; // von mir hinzugefügt // sOut.Clear; for i := 0 to Pred(sIn.Count) do sOut.Add(sIn.Names[i]); end; |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
So geht das nicht. Wenn du die Namensliste in der Funktion selbst erzeugen möchtest, dann so:
Delphi-Quellcode:
marabu
procedure CreateNames(s: TStrings): TStrings;
var i: Integer; begin Result := TStringList.Create; for i := 0 to Pred(s.Count) do Result.Add(s.Names[i]); end; |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Marabu, kleinen Fehler haste gemacht, das ist jetzt ne Funktion! Aber trotzdem vielen Dank für eure Mühen, da stand ich echt auffm Schlauch....
Dankeschön an alle! |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Zitat:
marabu |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Delphi-Quellcode:
Mich hat der Ehrgeiz gepackt und ich wollte versuchen eine Funktion zu schreiben, die jeweils den Teilstring aus der Datei extrahiert, der bei anf anfängt und bei ende aufhört...
function TForm1.CreateTypLists(fn: TFileName; anf : char; ende : char) : TStrings;
var i, ianf, iende : integer; s : string; begin Result := TStringList.Create; with Result do begin LoadFromFile(fn); for i := 0 to Pred(Count) do begin ianf := pos( 'anf' , Strings[i]); iende := pos( 'ende' , Strings[i]); s := copy(Strings[i], ianf, iende); Result.Add(s); end; end; end; Hm, Problem ist : Es funktioniert nicht, er gibt immer die gesamten Strings aus... Danke im Vorraus den Helfenden ... |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Du gibst als Parameter anf und ende vor, suchst aber nach den Literalen 'anf' und 'ende' - so kann es nicht funktionieren.
marabu |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Delphi-Quellcode:
Trotz der Richtigstellung mit dem Iteral Fehler funktioniert es immer noch nicht...
ItemTypeListe := CreateTypLists(OpenDialog.Filename, #91 , #93 );
ListBox1.Items.Assign(ItemTypeListe) Frage : Wenn in der ersten Zeile keines der Zeichen gefunden werdne kann, dann gibt er aber trotzdem für die Zeilen in denen er das Anfangs und Endzeichen findet, den richtigen String aus, oder? |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Probiere es mal so:
Delphi-Quellcode:
Getippt und nicht getestet.
function TForm1.CreateTypLists(fn: TFileName; cStart, sStop: Char): TStrings;
var i, iStart, iStop: Integer; s: String; begin Result := TStringList.Create; Result.LoadFromFile(fn); for i := Pred(Result.Count) downto 0 do begin iStart := Pos(cStart, Result[i]); iStop := Pos(cStop, Result[i]); if (iStart = 0) or (iStop < iStart) then Result.Delete(i); end; end; marabu |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Schon besser ;)
Jetzt gibt er mir nur noch den gesamten String aus in dem die Zeichnen enthalten sind... Aber ich will ja eig nur den Teilstring zwischen den zwei Zeichen, deswegen hab ichs ja mit Copy versucht, nur das hat irgendwie net so geklappt wie ichs wollte.... |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Wenn einen der Ehrgeiz packt:
Delphi-Quellcode:
Freundliche Grüße
function TForm1.CreateTypLists(fn: TFileName; cStart, sStop: Char): TStrings;
var i, iStart, iStop: Integer; s: String; begin Result := TStringList.Create; Result.LoadFromFile(fn); for i := Pred(Result.Count) downto 0 do begin iStart := Pos(cStart, Result[i]); iStop := Pos(cStop, Result[i]); if (iStart = 0) or (iStop < iStart) then Result.Delete(i) else Result[i] := Copy(Result[i], Succ(iStart), Pred(iStop - iStart)); end; end; marabu |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Hm, das funktioniert.
Jetzt kommt aber die Glanz und Gloria Frage, weil damit dasse das einfach reinpostet verstehe ichs noch nicht ganz : Du hast jetzt das was ich vorhatte rückwarts gemacht... Dafür die forto down Schleife. Falls der Begriff nicht gefunden wurde, wurde die Zeile gelöscht. Soweit habe ich das gecheckt... Hm, succ und pred kannte ich noch nicht... Mal wieder was gelernt , danke! |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Zitat:
Klar - ich hätte dir auch mehr prosaische Tipps geben können, aber mit der Delphi Online-Hilfe und dem dank seiner Kompaktheit überschaubaren Code solltest du dein Lerntempo deutlich steigern können. Wenn du lieber anders lernst, dann musst du es schreiben und ich poste keinen Code. marabu |
Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
Jo ;)
Nein war net bös gemeint, ich stand etwas auf der Leitung, weil ich succ und peod erstmal nachschauen musste... Hm, inner Delphihilfe finde ich pos komischerweise net... Ich habs online gefunden , und die Lösung lag bei succ und prod und darauf wär ich so net gekommen ;) Vielen Dank nochmal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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