Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeilen mit Stringliste bis zu bestimmten Zeichen auslesen (https://www.delphipraxis.net/74196-zeilen-mit-stringliste-bis-zu-bestimmten-zeichen-auslesen.html)

DragonsTear 30. Jul 2006 11:58


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?!?!

droppi 30. Jul 2006 12:00

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.

mkinzler 30. Jul 2006 12:03

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Delphi-Quellcode:
StringList.Delimiter := '|':
StringList.DelimitedText := zeile;

marabu 30. Jul 2006 12:42

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Herzlich willkommen in der Delphi-PRAXiS, DragonsTear.

Hier noch ein anderer Ansatz:

Delphi-Quellcode:
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;
Freundliche Grüße vom marabu

DragonsTear 30. Jul 2006 12:47

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?

marabu 30. Jul 2006 13:13

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Fast richtig,

Zitat:

Zitat von DragonsTear
... mit NameValueSeperator extrahierst du dann den Zeilenanfang bis | ...

der gesetzte NameValueSeparator wird erst später beim Zugriff auf die indizierte property Names verwendet - und zwar intern. Eingelesen wird die ganze Textdatei.

marabu

DragonsTear 30. Jul 2006 14:02

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Delphi-Quellcode:
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;
Hm, wollte jetzt erstmal guggen wies und ob es funktioniert... Das Problem ist, dass er mir bereits hier sauber abschmiert...
Die Stringliste ItemListe wird in OnCreate kreeiert...

Wo ist der Fehler? Hängt es mit OpenDialog.Filename zusammen?

mkinzler 30. Jul 2006 14:12

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Wo ist Textdatei deklariert? Und von welchem Typ?
Verwende bitte Delphi-Tags.

DragonsTear 30. Jul 2006 14:14

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;

marabu 30. Jul 2006 14:23

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Habe leider übersehen, dass der NameValueSeparator in D5 noch fest codiert ist:

Delphi-Quellcode:
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;
So sollte es funktionieren.

marabu

DragonsTear 30. Jul 2006 14:27

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....

mkinzler 30. Jul 2006 14:29

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
In welcher Zeile stoppt der Debugger?

DragonsTear 30. Jul 2006 14:31

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Delphi-Quellcode:
            Itemnamen.Items.Assign(ItemListe);
In dieser Spalte

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;

marabu 30. Jul 2006 14:48

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:
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;
marabu

DragonsTear 30. Jul 2006 14:53

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!

marabu 30. Jul 2006 15:07

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Zitat:

Zitat von DragonsTear
Marabu, kleinen Fehler haste gemacht

Kleine Fehler sind meine Spezialität ...

marabu

DragonsTear 30. Jul 2006 16:42

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Delphi-Quellcode:
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;
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...

Hm, Problem ist : Es funktioniert nicht, er gibt immer die gesamten Strings aus...

Danke im Vorraus den Helfenden ...

marabu 30. Jul 2006 16:52

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

DragonsTear 30. Jul 2006 17:58

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Delphi-Quellcode:
           ItemTypeListe := CreateTypLists(OpenDialog.Filename, #91 , #93 );
           ListBox1.Items.Assign(ItemTypeListe)
Trotz der Richtigstellung mit dem Iteral Fehler funktioniert es immer noch nicht...

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?

marabu 30. Jul 2006 18:09

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Probiere es mal so:

Delphi-Quellcode:
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;
Getippt und nicht getestet.

marabu

DragonsTear 30. Jul 2006 18:22

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....

marabu 30. Jul 2006 18:27

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Wenn einen der Ehrgeiz packt:

Delphi-Quellcode:
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;
Freundliche Grüße

marabu

DragonsTear 30. Jul 2006 18:35

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!

marabu 30. Jul 2006 18:43

Re: Zeilen mit Stringliste bis zu bestimmten Zeichen auslese
 
Zitat:

Zitat von DragonsTear
Jetzt kommt aber die Glanz und Gloria Frage, weil damit dasse das einfach reinpostet verstehe ichs noch nicht ganz

Ist jetzt wohl mehr eine Feststellung als eine Frage, oder?

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

DragonsTear 30. Jul 2006 18:49

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