Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Werte aus String herausfiltern (https://www.delphipraxis.net/55229-werte-aus-string-herausfiltern.html)

Fredbert 18. Okt 2005 12:17


Werte aus String herausfiltern
 
Hallo,

Ich habe in einer Datei mehrere Werte gespeichert zb. eine Zahl 5 und 22 oder 76 etc. Es sind immer 3 in einer Reihe!
Um sie in der Datei zu ordnen schreibe ich diese werte immer folgeendermaßen in die Datei:

1: 67 4 45
2: 45 62 43
...

Wie kann ich nun nur die Werte also 67 4 45 auslesen lassen so das ich mit ihnen weiter arbeiten kann??

EDatabaseError 18. Okt 2005 13:01

Re: Werte aus String herausfiltern
 
Warum nimmst du kein File of Integer???

Phistev 18. Okt 2005 13:02

Re: Werte aus String herausfiltern
 
Nutze Delphi-Referenz durchsuchenCopy, Explode / Split und StrToInt (in der Reihenfolge).

TheAn00bis 18. Okt 2005 13:05

Re: Werte aus String herausfiltern
 
Warum schreibst du sie so auf? Schreibe doch einfach alle untereinander, dann brauchst du nur die jeweilige Zeile auszulesen.

Oder gleich ein Record mit Zahl1,zahl2,zahl3. :P

Fredbert 18. Okt 2005 13:08

Re: Werte aus String herausfiltern
 
hmm kapier das nicht kannst du mir das erklären?

Fredbert 18. Okt 2005 13:09

Re: Werte aus String herausfiltern
 
Ist ne vorgabe damit man die werte schneller ändern kann! Is kleines Projekt von mir und paar Kumpels!

Phistev 18. Okt 2005 13:19

Re: Werte aus String herausfiltern
 
Die Record-Variante:
Delphi-Quellcode:
type TRecord = record
  id: integer; //oder kleiner, wenn's ausreicht
  wert1, wert2, wert3: integer;
end;
{...}
var datei: file of TRecord;
    werte: TRecord;
    wert1: TRecord;
{...}
  read(datei, wert); //readln funzt hier nicht
  wert1:= werte.wert1;
Meine Variante:
Delphi-Quellcode:
var line: string;
    temp: array of string;
    werte: array [0..2] of integer;
    datei: textfile;
{...}
  Readln(datei, line);
  line:= Copy(temp, 3, length(line));
  temp:= Split(' ', line);   //evtl. anpassen!
  werte[0]:= StrToInt(temp[0]);
  werte[1]:= StrToInt(temp[1]);
  werte[2]:= StrToInt(temp[2]);

Fredbert 19. Okt 2005 07:27

Re: Werte aus String herausfiltern
 
[Fehler] formel.pas(86): Inkompatible Typen: 'String' und 'dynamic array'

Das kommt dann!

marabu 19. Okt 2005 09:13

Re: Werte aus String herausfiltern
 
Hallo Fredbert,

herzlich willkommen in der Delphi-PRAXiS.

Lösungen können tendenziell nur so gut sein, wie die Problembeschreibung. Ohne Umschweife würde ich deine im Eröffnungsbeitrag gestellte Frage so beantworten:

Delphi-Quellcode:
uses
  Classes;

var
  slLines, slValues: TStrings;
  fileName: string;
  i, iLines: integer;
  iSum: Int64;

// Kleinere Dateien können komplett im Hauptspeicher verarbeitet werden
begin
  // Container für die Textzeilen mit den drei Werten
  slLines := TStringList.Create;

  // Container für die Zerlegung einer Zeile in drei Werte
  slValues := TStringList.Create;
  slValues.Delimiter := ' ';

  // Dateiname ist erster Aufrufparameter
  fileName := ParamStr(1);

  // Datei Laden
  slLines.LoadFromFile(fileName);

  for iLines := 0 to Pred(slLines.Count) do
  begin
    // Zeile an Leerstellen zerlegen
    slValues.DelimitedText := slLines[iLines];
    iSum := 0;
    // Zahlenwerte konvertieren und summieren
    for i := 0 to Pred(slValues.Count) do
      iSum := iSum + StrToInt(slValues[i]);
    // ...
  end;
end;
Wenn die Datei für diese Vorgehensweise zu groß ist, dann musst du sie zeilenweise verarbeiten:

Delphi-Quellcode:
var
  f: TextFile;
  i, iValue: integer;
  iSum: Int64;
begin
  AssignFile(f, fileName);
  Reset(f);

  while not Eof(f) do
  begin
    iSum := 0;
    for i := 1 to 3 do
    begin
      Read(f, iValue);
      iSum := iSum + iValue;
    end;
    ReadLn(f);
  end;

  CloseFile(f);
end;
Vielleicht gibt dir das ein paar Denkanstöße, wie du dein Problem lösen kannst. Code zum Überprüfen von möglichen Fehlern musst du selbst dazu schreiben.

Grüße vom marabu

Fredbert 20. Okt 2005 12:42

Re: Werte aus String herausfiltern
 
Habs hinbekommen aber anderst: (Code von jbg aus der CodeLibary)

Delphi-Quellcode:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5);
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index);
end;
Aufrufen mit:

zb:

Delphi-Quellcode:
f1 := explode('Bei welchem Zeichen soll getrennt werden', 'Welcher String soll getrennt werden', 0)
Ich hoffe das hilft den Leuten die auch solche Probs hatten wie ich dabei!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz