Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit txt Dateien (https://www.delphipraxis.net/14969-problem-mit-txt-dateien.html)

felro 19. Jan 2004 13:39


Problem mit txt Dateien
 
Hallo, ich habe hier ein kleines Problem mit Textdatein und zwar steht in den Zeilen am Anfang eine IP Adresse und dahinter ein paar Infos. Ich möchte nun aus der Textdatei nur die IP Adressen auslesen hat da wer ne Idee? CU felro

Luckie 19. Jan 2004 13:45

Re: Problem mit txt Dateien
 
Zeig mal die erste Zeile.

felro 19. Jan 2004 13:48

Re: Problem mit txt Dateien
 
Von der txt???
Wenn ja

192.168.0.20 [Rechnername] AMD Athlon(tm) Prozessor 1,00 GHz 256 MB Ram

in den nächsten Zeilen geht es dann genauso weiter

z.B.

192.168.0.50 [felro] AMD Athlon XP(tm) Prozessor 1,66 GHz 512 MB Ram

Luckie 19. Jan 2004 13:51

Re: Problem mit txt Dateien
 
Such dir mit pos das erste Leerzeichen und kopiere mit copy die IP in eine Stringvariable.

felro 19. Jan 2004 13:53

Re: Problem mit txt Dateien
 
Erstmal danke für deine Hilfe!

Aber sorry soweit bin ich in Delph noch nicht dass ich die ganzen Befehle kenne und weiss wie ich damit arbeiten muss, kannst du mir dass evtl genauer erklären? CU felro

WtF 19. Jan 2004 13:54

Re: Problem mit txt Dateien
 
spring zum ersten punkt in der zeile und prüf dann die drei zeichen davor ob es zahlen im gültigen bereich einer ip sind - wenn ja dann kannst du ja den rest auch noch einlesen. Wenn nicht soll er weitersuchen.
Du kannst das alles mit Pos und Copy lösen, das wird kein problem sein.
Mfg

//verlesen//
Wenn die zeile immer nur gleich aufgebaut ist, ist es ganz leicht - dann brauchst du nur den befehl copy - in der delphi hilfe ist der prima beschrieben - oh sorry, nat brauchst du auch noch Pos falls sich die länge der ip ändert. mach das so wie es luckie gesagt hat.

-homer- 19. Jan 2004 13:57

Re: Problem mit txt Dateien
 
hi,
was gibt denn dieser text aus??? Die ip adresse des eigenen rechners, oder die eines anderen? Wenn du die Ip adresse des eigenen Rechner suchst, dann benutze einfach folgene Funktion:

Delphi-Quellcode:
uses winsock;

function GetIpAddress: string;
var phoste: PHostEnt;
  Buffer: array [0..100] of char;
  WSAData: TWSADATA;
begin
  result:='';
  if WSAStartup($0101, WSAData) <> 0 then exit;
  GetHostName(Buffer,Sizeof(Buffer));
  phoste:=GetHostByName(buffer);
  if phoste = nil then result:='127.0.0.1'
  else result:=StrPas(inet_ntoa(PInAddr(phoste^.h_addr_list^)^));
  WSACleanup;
end;

cu -homer-

[edit=FuckRacism]Delphi-Syntax hinzugefügt. Mfg, FuckRacism[/edit]

Luckie 19. Jan 2004 14:01

Re: Problem mit txt Dateien
 
Steht alles in der Hilfe, sogar mit Beispielen.

felro 19. Jan 2004 14:01

Re: Problem mit txt Dateien
 
Die Textdatei gibt verschiedene Ips aus dem lokalen Netzwerk an

Thunderchild 19. Jan 2004 14:30

Re: Problem mit txt Dateien
 
Um herauszufinden, ob ein String eine gültige IP ist, habe ich mir folgende Funktion gebastelt:

Delphi-Quellcode:
function CheckIP(ip:string):boolean;
var ziffern:array[0..3] of integer; index,position,fcode:integer;
begin
  index:=0;
  while (ip<>'') and (index<4) do begin
    position:=pos('.',ip);                          // Teil bis zum ersten Punkt interessiert
    if position=0 then position:=length(ip)+1;      // Kein Punkt»letzte Ziffer»ganzen Reststring nehmen
    val(copy(ip,1,position-1),ziffern[index],fcode); // Teilstring in Zahl wandeln
    delete(ip,1,position);                          // und dann aus dem String löschen
    if fcode>0 then ziffern[index]:=-1;             // Fehler beim Umwandeln»Ziffer ungültig machen
    inc(index);
  end;

  for position:=index+1 to 3 do ziffern[position]:=-1// restliche Ziffern auffüllen, wenn zu wenig Zahlen im String

// gültigen Zahlerbereich prüfen,. Ergebnis ist Funktionsrückgabewert
  checkIP:=(ziffern[0] in [0..255]) and (ziffern[1] in [0..255]) and
           (ziffern[2] in [0..255]) and (ziffern[3] in [1..253])
end;

choose 19. Jan 2004 15:29

Re: Problem mit txt Dateien
 
Für die Arbeit mit Strings möchte ich gerne wieder auf [dp]reguläre Ausdrücke[/dp] verweisen, mit denen eine Prüfung auf gültige IPs (jede Komponente 0-255) relativ kurz gestaltet werden kann:
Delphi-Quellcode:
function IsValidIPAddress(const AString: string): Boolean;
const
  RE255 = '([1-9]?\d|1\d\d|2([0-4]\d|5[0-5]))';
begin
  Result:= RegExp('^(%s\.){3}%:0s$', [RE255]).Execute(AString);
end;
Um also die IPs gem Deiner Beschreibung in ein Memo zu laden, felro, könnte mit dem passenden Ausdruck in ReIPFromLogFile dieser Code verwendet werden:
Delphi-Quellcode:
with TStringList.Create do
try
  LoadFromFile(AFilename);
  with RegExp(ReIPFromLogFile) do
    if Execute(Text) then
    repeat
      Memo1.Lines.Add(Match[0])
    until not ExecuteNext;
finally
  Free;
end;
Wenn Du in Zukunft häufiger mit Strings arbeitest, könnten Lösungen dieser Art einiges an Arbeit ersparen auch wenn sie auf den ersten Blick etwas kryptisch anmuten mögen...

felro 20. Jan 2004 13:03

Re: Problem mit txt Dateien
 
Dass hört sich ja mal sehr gut an :D muss ich gleich mal porbieren. THX felro

felro 19. Feb 2004 19:35

Re: Problem mit txt Dateien
 
hmm hab jetzt nen paar Wochen immer ma wieder probiert aber so richtig weiter gekommen bin ich leider nicht! Kann mir jemand evtl nochma helfen?

Manzoni 19. Feb 2004 20:11

Re: Problem mit txt Dateien
 
Delphi-Quellcode:
procedure einlesen;
var f : textfile;
    s : string;
begin
  AssignFile(f,'C:\beispiel.txt');
  Reset(f);
  while not EOF(f) do
  begin
  Readln(f, s);
  Delete(s, Pos(' ',s),length(s));
  Memo1.Lines.Add(s);
  end;
  CloseFile(f);
end;

felro 19. Feb 2004 20:21

Re: Problem mit txt Dateien
 
Hmm ja dass einlesen hab ich ja schon :D

Mein Problem ist, dass ich den obrigen Quelltext nicht verstehe und es mir lieber wäre wenn es ein Befehl gibt, der nach 16 Zeichen alles abscneidet und dann noch alle leerzeichen und buchstaben entfernt. CU felro

Bit Juggler 19. Feb 2004 22:11

Re: Problem mit txt Dateien
 
Hi felo,
was genau verstehst Du denn nicht ?
Hier bist Du doch genau richtig zum fragen, oder ? ;)

Zu Deinem Wunsch:
Delphi-Quellcode:
  //In Edit1 stehen zb. 40 Zeichen und Du willst nur die ersten 16
  Edit2.Text:= Copy(Edit1.Text,1,16);
und weiter:
Delphi-Quellcode:
//alle Leerzeichen entfernen
function DelSpace(Data:string):string;
var
  i: integer;
begin
  for i:= 1 to length(Data) do
    delete(Data,pos(' ',Data),1);
  DelSpace:= Data;
end;
und zum Schluss:
...String auf Zahlen überprüfen


Gruß Bit

P.S.
Die vor mir geposteten Sourcen sind aber bei weitem besser als das was Du jetzt vorhast !

Thunderchild 20. Feb 2004 14:44

Re: Problem mit txt Dateien
 
Ich weis nicht, ob diese Ersetzen-Routine wirklich funzt.
Edit:
Denn wenn da mehrere Spaces hintereinander stehen, wird er jedes zweite übergehen, da alles nach dem Löschen um eins nach vorn rutscht, Dein Index aber auch um eins weiter geht. Das macht dann einen Suchschritt von zwei Zeichen.

Delphi-Quellcode:
function bla(s:string);
i:integer; c:char;
begin
  // s ist die aus der Datei eingelesene Zeile
  s:=copy(s,1,16);

// Eine Möglichkeit (benötigt Unit StrUtils):
  s:=AnsiReplaceStr(s,' ','');

// Zweite Möglichkeit:
  i:=pos(' ',s);
  while i>0 do begin
    delete(s,i,1);
    i:=pos(' ',s)
  end;

// Bzw auch für Ziffern:
  i:=1;
  while i<=length(s) do
    if s[i] in [' ','0'..'9'] then delete(s,i,1)
                              else inc(i);
  bla:=s
end;

felro 20. Feb 2004 15:32

Re: Problem mit txt Dateien
 
Ok danke an euch beide, dass klingt ja schonmal wesentlich einfacher. Danke felro

Tyrael Y. 20. Feb 2004 15:37

Re: Problem mit txt Dateien
 
..wie wäre es mit
Delphi-Quellcode:
function GetOnlyValidChars(aString:String):String;
  newString := '';
  for i := 0  to length(aString) do
  begin
     if not(aString[i] in [#0]) then //hier könntest du noch mehr zeichen ausschliessen
     begin
       newString := newString + aString[i];
     end;
  end;
  result := newString;
end;

Luckie 20. Feb 2004 15:54

Re: Problem mit txt Dateien
 
Leerzeichen entfernen? Schon mal an StringReplace gedacht? :roll:

Tyrael Y. 20. Feb 2004 15:57

Re: Problem mit txt Dateien
 
mein Code war eher für irgendwelche Zeichen gedacht...spielt halt keine Rolle welche..die Zeichen die man nicht haben möchte einfach in die Liste eintragen

Bit Juggler 20. Feb 2004 22:34

Re: Problem mit txt Dateien
 
@Luckie
danke für den Tipp!
Ist es vorteilhafter diese functin zu benutzen oder eine Selbstgestrickte wie die die ich gepostet habe ?

Gruß Bit

Luckie 20. Feb 2004 22:40

Re: Problem mit txt Dateien
 
StringReplace ist zwar bekannt dafür, dass es nicht die schnellste ist, aber mindestens genauso gut wie deine wird sie sein. Und sie ist wohl sicherer.

Bit Juggler 20. Feb 2004 22:43

Re: Problem mit txt Dateien
 
Hm, was heißt sicherer, die function von mir hat mih noch nie enttäucht ;)

Luckie 20. Feb 2004 22:44

Re: Problem mit txt Dateien
 
Und wenn zwei Blanks aufeinanderfolgen? Wie gesagt, ich habe sie noch nicht richtig getestet.

Bit Juggler 21. Feb 2004 12:46

Re: Problem mit txt Dateien
 
Hi,
es ist egal wie viele Blanks aufeinander folgen!
Wenn Du dir die Funktion noch einmal anschaust wirst Du es merken ;)


Gruß Bit

Thunderchild 22. Feb 2004 19:12

Re: Problem mit txt Dateien
 
@ Tyrael Y.

wenn es auf diese Weise an Strings geht, sollte der Index wohl doch lieber bei 1 anfangen, nicht bei 0.

@Bit Juggler
Interessant. Habs mal getestet, Deine Funktion geht und ich hab kapiert wie und warum *puh*. Allerdings läuft sie IMMER die volle Anzahl an Zeichen ab, während meine nur so oft läuft, bis nix mehr da ist. :roll:
Wenn man viele viele wundervolle Strings hat, die man viele viele Male bearbeiten möchte, macht das bestimmt ein paar Hunderstelsekunden ;-).

Edit:
aus. (sch***s Tippfehler) :wall:

Bit Juggler 22. Feb 2004 20:45

Re: Problem mit txt Dateien
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Thunderchild

Hi,
hm, Deine Methode ist tatsächlich DOPPELT so schnell als meine Funktion... :gruebel:
Aber wir sind BEIDE immer noch besser als AnsiReplacString ;)

Gruß Bit


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 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