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
|
Re: Problem mit txt Dateien
Zeig mal die erste Zeile.
|
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 |
Re: Problem mit txt Dateien
Such dir mit pos das erste Leerzeichen und kopiere mit copy die IP in eine Stringvariable.
|
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 |
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. |
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] |
Re: Problem mit txt Dateien
Steht alles in der Hilfe, sogar mit Beispielen.
|
Re: Problem mit txt Dateien
Die Textdatei gibt verschiedene Ips aus dem lokalen Netzwerk an
|
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; |
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:
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:
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;
Delphi-Quellcode:
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...
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; |
Re: Problem mit txt Dateien
Dass hört sich ja mal sehr gut an :D muss ich gleich mal porbieren. THX felro
|
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?
|
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; |
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 |
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:
und weiter:
//In Edit1 stehen zb. 40 Zeichen und Du willst nur die ersten 16
Edit2.Text:= Copy(Edit1.Text,1,16);
Delphi-Quellcode:
und zum Schluss:
//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; ...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 ! |
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; |
Re: Problem mit txt Dateien
Ok danke an euch beide, dass klingt ja schonmal wesentlich einfacher. Danke felro
|
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; |
Re: Problem mit txt Dateien
Leerzeichen entfernen? Schon mal an StringReplace gedacht? :roll:
|
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
|
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 |
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.
|
Re: Problem mit txt Dateien
Hm, was heißt sicherer, die function von mir hat mih noch nie enttäucht ;)
|
Re: Problem mit txt Dateien
Und wenn zwei Blanks aufeinanderfolgen? Wie gesagt, ich habe sie noch nicht richtig getestet.
|
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 |
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: |
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