Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

IP Adresse aus TXT auslesen und neue Textdatei zusammenbauen!?

Frage Entwicklung VB for Applications

Mitglied: Mike85

Mike85 (Level 1) - Jetzt verbinden

15.02.2010 um 13:54 Uhr, 7004 Aufrufe, 21 Kommentare

Die Suche nach IP Adressen mit regulärem Ausdruck funktioniert schon.

Fehlt nur noch wie ich den gefundenen Ausdruck in eine neue TXT Datei schreiben kann?!

Guten Tag,

es liegt eine Textdatei in folgendem Format vor:

AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.205

Davon gibt es mehrere Zeilen!

Ich möchte aus jeder Zeile die IP-Adresse extrahieren und in eine neue TXT Datei schreiben, finde aber nicht die richtigen Mittel dazu, oder suche einfach nach dem falschen.

Mit Hilfe dieses Codes: http://www.mcseboard.de/windows-forum-scripting-71/zeile-string-auslese ...

und dem RegExp: "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"

kann ich zumindest schon einmal die Zeilen "greifen" in denen die IP vorhanden ist.
Kann mir jmd. nen Tipp geben wie ich den getroffenen Ausdruck nun abgespeichert bekomme?

Danke für eure Ratschläge!
Mitglied: micneu
15.02.2010 um 14:24 Uhr
wie soll das ergebnis denn aussehen?
du hast nur geschrieben wie deine ausgangs datei ist.

gruß michael
Bitte warten ..
Mitglied: Edi.Pfisterer
15.02.2010 um 14:24 Uhr
hallo!
mein Vorschlag in vbs:

01.
file = "ipliste.txt" 
02.
fileneu = "ipneu.txt" 
03.
Set fs = CreateObject("Scripting.FileSystemObject") 
04.
 
05.
 
06.
   Set File = fs.OpenTextFile(file , 1, true) 
07.
     ' Datei zum Lesen öffnen 
08.
 
09.
 
10.
Do While not file.AtEndOfStream 
11.
   ipadresse = ipadresse & right(file.ReadLine,13) & vbcrlf 
12.
Loop 
13.
 
14.
 
15.
set objtextstream = fs.createtextfile(fileneu, True) 
16.
strwritestring = ipadresse 
17.
objtextstream.write strwritestring 
18.
objtextstream.close 
19.
set objtextstream = nothing 
20.
set file = nothing 
21.
set fs = nothing 
22.
 
die Variable FILE meint deine txt-Datei.
Achtung: Dieser rudimentäre Code funktioniert nur, wenn Deine IP-Adressen nur 13 Zeichen lang sind (wie in Deinem Beispiel). Ansonsten halt die Zeil e ipadresse = ..... entsprechend ändern
Solltest Du auch längere Ip-Adressen (oder kürzere) haben, dann bitte hier nochmal posten (oder selber suchen...)
Ich würde mich mit InstrRev an die Sache heranwagen...

hoffe, geholfen zu haben
lg
Bitte warten ..
Mitglied: Edi.Pfisterer
15.02.2010 um 15:10 Uhr
Hallo!

der Vollständigkeit halber der fertige Code für ALLE Längen von IP-Adressen (der Code sucht nach dem letzten Leerzeichen, ab da muss die IP-Adresse beginnen....)
(Code in VBS, wer mag kann aber auch noch den batch-code posten... eh klar!)

01.
file = "ipliste.txt" 
02.
fileneu = "ipneu.txt" 
03.
Set fs = CreateObject("Scripting.FileSystemObject") 
04.
 
05.
 
06.
   Set File = fs.OpenTextFile(file , 1, true) 
07.
     ' Datei zum Lesen öffnen 
08.
 
09.
 
10.
Do While not file.AtEndOfStream 
11.
   zeile = (file.ReadLine) 
12.
   Iplaenge = len(zeile)-InstrRev(zeile," ") 
13.
 
14.
   ipadresse = ipadresse & right(zeile,Iplaenge) &  vbcrlf 
15.
Loop 
16.
 
17.
 
18.
set objtextstream = fs.createtextfile(fileneu, True) 
19.
strwritestring = ipadresse 
20.
objtextstream.write strwritestring 
21.
objtextstream.close 
22.
file.close 
23.
set objtextstream = nothing 
24.
set file = nothing 
25.
set fs = nothing 
26.
 
Ergebnis
ipliste.txt:

AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.34.205
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.206
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.255.207
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.8
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.205
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.16.0.206
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.207
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.18.0.28

ipneu.txt:
192.168.34.205
192.168.0.206
192.168.255.207
192.168.0.8
192.168.0.205
192.16.0.206
192.168.0.207
192.18.0.28


Hoffe, das entpsricht Deinen Anforderungen. Falls dem so ist: bitte Frage als gelöst markieren!
Hoffe, geholfen zu haben und freue mich - wie immer eigentlich - über postives Feedback
lg
Bitte warten ..
Mitglied: bastla
15.02.2010 um 15:16 Uhr
Hallo Mike85 und willkommen im Forum!

Soferne nicht alle Zeilen eine IP enthalten und daher tatsächlich RegEx benötigt wird, etwa so:
01.
DateiEin = "D:\Liste.txt" 
02.
DateiAus = "D:\IP.txt" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
Set rE = New RegExp 
06.
rE.Global = True 
07.
rE.Pattern = "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" 
08.
 
09.
Set Aus = fso.CreateTextFile(DateiAus, True) 
10.
For Each Match In rE.Execute(fso.OpenTextFile(DateiEin).ReadAll) 
11.
    Aus.WriteLine Match 
12.
Next 
13.
Aus.Close
Grüße
bastla
Bitte warten ..
Mitglied: Mike85
15.02.2010 um 15:25 Uhr
Ich habe es jetzt soweit hinbekommen durch probieren:

01.
im txt, feld 
02.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
03.
 
04.
txt="AP IP	hostname	00:07:0e:38:ae:a0	11.02.2010 15:30:00	192.168.0.205	" 
05.
txt = Replace(txt,vbTab,";") 
06.
feld = Split(txt, ";") 
07.
Call WriteToLog(strLogFile, feld(4)) 
08.
 
09.
 
10.
Sub WriteToLog(inFile, inText) 
11.
 
12.
Set objFile1 = objFSO.OpenTextFile(inFile, 8, True) 
13.
objFile1.WriteLine("AL;"+inText) 
14.
objFile1.Close 
15.
 
16.
End Sub
Jetzt stehe ich aber vor nem größeren Problem!

In der Textdatei stehen noch mehr Informationen wie z.B.: hostname01

AP Name 00:07:0e:38:ae:a0 15.02.2010 14:45:00 hostname01
AP Name 00:0f:24:78:07:70 15.02.2010 14:45:00 hostname02
AP Name 00:0f:24:78:07:a0 15.02.2010 14:45:00 hostname03
AP IP 00:07:0e:38:ae:a0 15.02.2010 14:45:00 192.168.0.1
AP IP 00:0f:24:78:07:70 15.02.2010 14:45:00 192.168.0.2
AP IP 00:0f:24:78:07:a0 15.02.2010 14:45:00 192.168.0.3

Wenn ich die neue Textdatei zusammengebaut habe, soll es danach so aussehen:

192.168.0.1;hostname01

Das heißt nun er soll aus der ersten Zeile sich den "hostname01" holen und aus der 4. Zeile die IP-Adresse.
Das einzigste was gleich ist, ist die MAC Adresse (00:07:0e:38:ae:a0)!

Könnte es vllt damit gehen, dass ich die erste Zeile mit "AP Name" am Anfang suche, dann den Hostnamen extrahiere und danach die erste Zeile mit "AP IP" am Anfang suche und die IP-Adresse rausziehe und die beiden Werte dann in die neue Datei schreibe?

Danke für eure Hilfe!
Bitte warten ..
Mitglied: Edi.Pfisterer
15.02.2010 um 15:26 Uhr
Hallo bastla!
wie eigentlich stets bisher hab ich mal wieder meinen Meister gefunden )
Good Job, well done!

lg
Bitte warten ..
Mitglied: bastla
15.02.2010 um 15:42 Uhr
Hallo Mike85!

Da sich offensichlich auch TAB zwischen den einzelnen Feldern befinden, poste bitte Deine Beispieldaten unter Code-Tags ...

Gibt es nur die beiden beschriebenen Arten von Zeilen? Falls nein: Sind die Zeilen mit den Hostnamen eindeutig anhand des "AP Name" zu erkennen?
@urobe73
Danke für die Blumen - Deine zweite Version hat mir aber auch gefallen ...

Grüße
bastla
Bitte warten ..
Mitglied: Edi.Pfisterer
15.02.2010 um 15:54 Uhr
hallo Mike85!

hier nun ein Update...

01.
file = "ipliste.txt" 
02.
fileneu = "ipneu.txt" 
03.
dim liste(50,1) 
04.
Set fs = CreateObject("Scripting.FileSystemObject") 
05.
set objtextstream = fs.createtextfile(fileneu, True) 
06.
 
07.
   Set File = fs.OpenTextFile(file , 1, true) 
08.
 
09.
i = 0 
10.
k = 0 
11.
Do While not file.AtEndOfStream 
12.
   zeile = (file.ReadLine) 
13.
     Iplaenge = len(zeile)-InstrRev(zeile," ") 
14.
  if Instr(zeile,"AP Name")>= 1 then 
15.
  liste(i,0) = right(zeile,Iplaenge) 
16.
  i = i+1 
17.
  else 
18.
    liste(k,1) = right(zeile,Iplaenge) 
19.
  K = k+1 
20.
  end if 
21.
Loop 
22.
 
23.
for i = 0 to ubound(liste) 
24.
objtextstream.write liste(i,1) & ";" & liste(i,0) & vbcrlf 
25.
next
Achtung: Das Array wird in Zeile mit 50 Hosts angenommen...
Entweder hat bastla hier einen Verbesserungsvorschlag (Redim wird hier ja nicht funktionieren, oder? kenne mich aber mit Arrays nicht ganz soo aus) oder Du korrigierst den Wert auf Deine Anzahl...

Ansonsten gebe ich bastla recht:
Schön wäre es gewesen, Du hättest gleich einen Auszug Deiner .txt hier gepostet...
Tipp: Verwende den "< code >" Tag (ohne Leerzeichen)

lg
Bitte warten ..
Mitglied: bastla
15.02.2010 um 15:59 Uhr
Hallo Mike85!

Da ich leider gerade nicht mehr Zeit habe, als Grundgerüst (und unter der Annahme, dass sich die Felder anhand von TAB trennen lassen und anhand des ersten Feldes der jeweilige Satz identifiziert werden kann):
01.
DateiEin = "D:\Liste.txt" 
02.
DateiAus = "D:\IPHost.txt" 
03.
Host = "AP Name" 
04.
IP = "AP IP" 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
Set d = CreateObject("Scripting.Dictionary") 
08.
 
09.
Set Aus = fso.CreateTextFile(DateiAus, True) 
10.
 
11.
T = Split(fso.OpenTextFile(DateiEin).ReadAll, vbCrLf) 
12.
For i = 0 To UBound(T) 
13.
    F = Split(T(i), vbTab) 
14.
    If F(0) = Host Then d.Add F(1), F(4) 
15.
Next 
16.
 
17.
For i = 0 To UBound(T) 
18.
    F = Split(T(i), vbTab) 
19.
    If F(0) = IP Then 
20.
        If d.Exists(F(1)) Then 
21.
            Aus.WriteLine F(4) & ";" & d.Item(F(1)) 
22.
        End If 
23.
    End If 
24.
Next 
25.
 
26.
Aus.Close
Grüße
bastla
Bitte warten ..
Mitglied: micneu
15.02.2010 um 16:01 Uhr
ich habe es mit "grep" gelöst:

01.
grep -o -E "([0-9]*.\.[0-9]*.\.[0-9]*.\.[0-9]*.)" ip-test.txt > test.txt
gruß michael
Bitte warten ..
Mitglied: bastla
15.02.2010 um 16:02 Uhr
@urobe73

Du kannst "ReDim Preserve" verwenden, allerdings neige ich eher zum Einlesen am Stück und "Split" bei den Zeilenschaltungen ...

Grüße
bastla
Bitte warten ..
Mitglied: Edi.Pfisterer
15.02.2010 um 16:15 Uhr
Servus bastla!
Tja, auf "split" hätte ich auch kommen können....
Wäre bei mir trotzdem nicht so schön ausgefallen...
Respekt!

Danke für den Tipp mit Redim Preserve. Habe allerdings wenig ergoogelt, das dafür gesprochen hätte...
habe mich also für ein Workaround entschieden....

@Mike

Ersetze bitte die Schleife am Ende meines codes gegen

01.
for i = 0 to ubound(liste) 
02.
zeile = liste(i,1) & ";" & liste(i,0) & vbcrlf 
03.
if len(zeile)>= 5 then objtextstream.write zeile 
04.
next
Dann verschwinden diese überflüssigen ";"

btw: Der Code von bastla ist selbstverstänlich deutlich sexyer...
Da dieser bei mir leider nicht funktionierte (hab den fehler nicht gesucht...) und falls Du - so wie ich - auch mit quick und dirty zufrieden bist, die 2.beste-Lösung

Und: dieser Code gibt nur Sinn für Dich, wenn Deine Ausgangsdatei wirklich zuerst die Namen und dann in der selben Reihenfolge die Adressen gespeichert hat. Einen Abgleich der MAC nehme ich nicht vor...
lg
Bitte warten ..
Mitglied: Mike85
15.02.2010 um 16:33 Uhr
Servus Leute, ich hab grad ne eigene Lösung auf die Beine gestellt, weiß nur nicht wie effektiv die ganze Geschichte ist und ob der von euch gepostete Code nicht effektiver wäre...:

01.
strLogFile = "fehlerobjekte.txt"   
02.
Dim txt, feld, feld2 
03.
 
04.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
05.
Set objFile = objFSO.OpenTextFile("test.txt", 1) 
06.
 
07.
 
08.
Do Until objFile.AtEndOfStream 
09.
    strLine = objFile.ReadLine 
10.
        If instr(strLine, "AP Name") > 0 Then 
11.
            strLine = Replace(strLine,vbTab,";") 
12.
 
13.
            feld = Split(strLine, ";") 
14.
             Wscript.Echo feld(4) 
15.
                 
16.
                Set objFile2 = objFSO.OpenTextFile("test.txt", 1) 
17.
                Do Until objFile2.AtEndOfStream 
18.
                    zweiteLine = objFile2.ReadLine 
19.
                        If instr(zweiteLine, "AP IP") > 0 Then 
20.
                             
21.
                            If instr(zweiteLine, feld(2)) > 0 Then 
22.
                                zweiteLine = Replace(zweiteLine,vbTab,";") 
23.
                                feld2 = Split(zweiteLine, ";") 
24.
                                Wscript.Echo feld2(4) 
25.
                                 
26.
                            End if 
27.
                        End if 
28.
                Loop 
29.
 
30.
            Call WriteToLog(strLogFile, feld(4), feld2(4)) 
31.
        End if 
32.
Loop 
33.
 
34.
Sub WriteToLog(inFile, inHostname, inIP) 
35.
 
36.
Set objFile1 = objFSO.OpenTextFile(inFile, 8, True) 
37.
objFile1.WriteLine(inHostname+";"+inIP+";") 
38.
objFile1.Close 
39.
 
40.
End Sub
Bitte warten ..
Mitglied: bastla
15.02.2010 um 17:29 Uhr
Hallo Mike85!

Nur als Anmerkung: Splitten kannst Du auch anhand des Trennzeichens "TAB" - das "Replace" ist nicht nötig ...
Für das Testen meines Ansatzes hatte ich übrigens folgende Daten verwendet:
01.
AP Name	00:07:0e:38:ae:a0	15.02.2010	14:45:00	hostname01 
02.
AP Name	00:0f:24:78:07:70	15.02.2010	14:45:00	hostname02 
03.
AP Name	00:0f:24:78:07:a0	15.02.2010	14:45:00	hostname03 
04.
AP IP	00:07:0e:38:ae:a0	15.02.2010	14:45:00	192.168.0.1 
05.
AP IP	00:0f:24:78:07:70	15.02.2010	14:45:00	192.168.0.2 
06.
AP IP	00:0f:24:78:07:a0	15.02.2010	14:45:00	192.168.0.3
Abhängig von den tatsächlichen TAB-Positionen sind ggf die Felder (zB F(1) für die MAC-Adresse) anzupassen ...

Grüße
bastla
Bitte warten ..
Mitglied: Mike85
15.02.2010 um 18:35 Uhr
Ich glaub das Problem liegt darin, dass ich die Daten aus einem anderen Prozess rausgespuckt bekomme, deshalb weiß ich nicht ob es nun ein TAB oder einfach nur ein " ".
Aber mit der Replace und Split Methode klappts auf jeden Fall.
Bitte warten ..
Mitglied: bastla
15.02.2010 um 18:42 Uhr
Hallo Mike85!

Wenn Du vor dem Replace keine ";" in der Zeile hattest, danach aber schon (sonst würde das Splitten nicht funktionieren), kann ja nur jeweils ein TAB ersetzt worden sein ...

Was ich eigentlich meinte: Du könntest gleich
feld = Split(strLine, vbTab)
verwenden.

Grüße
bastla

P.S.: Mit einem vernünftigen Editor (oder zur Not auch mit zB Word) kannst Du Dir ja Steuerzeichen anzeigen lassen - dann weißt Du ganz genau, ob TAB oder " ".
Bitte warten ..
Mitglied: Biber
15.02.2010 um 18:47 Uhr
[OT] Moin bastla,
Zitat von bastla:
P.S.: Mit einem vernünftigen Editor
....oder einer vernünftigen Editorin...

Immer schön gender-konform bleiben...

Grüße
Biber
[/OT]
Bitte warten ..
Mitglied: bastla
15.02.2010 um 18:51 Uhr
[OT]
Hallo Biber!
....oder einer vernünftigen Editorin...
Würdest Du auch Editeuse gelten lassen?

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: Biber
15.02.2010 um 18:55 Uhr
[OT ii]
Zitat von bastla:
Würdest Du auch Editeuse gelten lassen?
Auch Editörin ... oder Editesse... ...Hauptsache rothaarig...

Und ihre TABs muss sie zeigen..

*~~ 50c in die Chauvikasse schnipp ~~*

Grüße
Biber
[/OT ii]
Bitte warten ..
Mitglied: mrtux
15.02.2010 um 19:00 Uhr
Hi!

Zitat von Biber:
Auch Editörin ... oder Editesse... ...Hauptsache rothaarig...

Oder Edith's Tine...aber ob die wirklich rothaarig ist, muss ich erst mal genau erschauen, sehe sie momentan eher selten.

Und ihre TABs muss sie zeigen..

Solange die TABs keine Leerzeichen sind ;-P bin ja schon ruhig...

mrtux
Bitte warten ..
Mitglied: Mike85
15.02.2010 um 19:31 Uhr
Danke für den Tipp!

Doppelt gemoppelt muss wirklich nicht sein, teste ich morgen einfach mal aus!

Aber Hauptsache das Script bringt das gewünschte Ergebnis!

Vor allem mal einen dicken Applaus für all die netten Leute hier, die sich meinem Problem angenommen und bemüht haben, auch wenn ich es im Endeffekt selbst hinbekommen habe!

Falls es noch Fragen gibt, melde ich mich.
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows 7
gelöst Bereits eingebundener Drucker - IP Adresse lokal auslesen (17)

Frage von harald.schmidt zum Thema Windows 7 ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

LAN, WAN, Wireless
gelöst TP-Link WA501G als Client einrichten - Keine IP Adresse wir bezogen (14)

Frage von bestelitt zum Thema LAN, WAN, Wireless ...

E-Mail
gelöst Falsche SMTP Server IP Adresse (6)

Frage von laster zum Thema E-Mail ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (12)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...