TXT zeilenweise per VBS auslesen
So Servus ich habe folgende txt Datei
Systeme.txt
in dieser Datei stehen PC-Namen drinne ...
PC1
PC2
PC3
nun sollen die Namen per VB-Script ausgelesen werden und in Variablen gespeichert werden, die aller dings auch dynamisch angelegt werden sollen, dass heißt sind in der txt 10 Namen 10 Variablen anlegen und soweiter...
habe noch kein Code würde mich aber freuen wenn mir das jemand schreiben könnte
Mit freundlichem Gruß
Daniel
und Danke schonmal
Systeme.txt
in dieser Datei stehen PC-Namen drinne ...
PC1
PC2
PC3
nun sollen die Namen per VB-Script ausgelesen werden und in Variablen gespeichert werden, die aller dings auch dynamisch angelegt werden sollen, dass heißt sind in der txt 10 Namen 10 Variablen anlegen und soweiter...
habe noch kein Code würde mich aber freuen wenn mir das jemand schreiben könnte
Mit freundlichem Gruß
Daniel
und Danke schonmal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 65403
Url: https://administrator.de/contentid/65403
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
15 Kommentare
Neuester Kommentar
Nö, kann niemand, weil Variablen dynamisch anlegen geht nicht. Macht auch keinen Sinn, weil wie willst Du danach Programmiertechnisch drauf zugreifen, wenn man den Namen nicht kennt?
Schon mal was von einem Array oder Variablenfeld gehört?
Ein Array ist ein Konstrukt, welches man unter einem Namen ansprechen kann und mittels Index mehrere Werte reinschreiben kann und wieder auslesen. Sozusagen Strassenname mit Hausnummern der verschiedenen Lager.
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
i=0
' Erstmal zählen wieviele Einträge
while not oFile.AtEndOfStream
i=i+1
oFile.ReadLine
Wend
oFile.Close
' Array definieren
REDIM sEingabe(i)
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
i=0
' Jetzt Werte ins Array übernehmen
while not oFile.AtEndOfStream
sEingabe(i)=oFile.ReadLine
i=i+1
Wend
oFile.Close
' Beispiel für Zugriff
MsgBox "Wert an Index 0: " & sEingabe(0)
MsgBox "Wert an Index 3: " & sEingabe(3)
Kein schönes Beispiel, tut aber und in VB-Script würde ich auch eher ein Dictionary Objekt verwenden (Arrays gibts halt in praktisch jeder Sprache):
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDict = CreateObject("Scripting.Dictionary")
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
'Direktes Einlesen, Dictionary Objekt darf nämlich beliebig wachsen
i=0
while not oFile.AtEndOfStream
oDict.add i,oFile.ReadLine
i=i+1
Wend
oFile.Close
' Beispiel für Zugriff
MsgBox "Wert an Index 0: " & oDict.Item(0)
MsgBox "Wert an Index 3: " & oDict.Item(3)
EDIT: Wenn ich die Code-Beispiel mit < code > versuche zu formatieren, sieht man nichts mehr von meinem Text. Deswegen ohne Code Formatierung.
Schon mal was von einem Array oder Variablenfeld gehört?
Ein Array ist ein Konstrukt, welches man unter einem Namen ansprechen kann und mittels Index mehrere Werte reinschreiben kann und wieder auslesen. Sozusagen Strassenname mit Hausnummern der verschiedenen Lager.
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
i=0
' Erstmal zählen wieviele Einträge
while not oFile.AtEndOfStream
i=i+1
oFile.ReadLine
Wend
oFile.Close
' Array definieren
REDIM sEingabe(i)
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
i=0
' Jetzt Werte ins Array übernehmen
while not oFile.AtEndOfStream
sEingabe(i)=oFile.ReadLine
i=i+1
Wend
oFile.Close
' Beispiel für Zugriff
MsgBox "Wert an Index 0: " & sEingabe(0)
MsgBox "Wert an Index 3: " & sEingabe(3)
Kein schönes Beispiel, tut aber und in VB-Script würde ich auch eher ein Dictionary Objekt verwenden (Arrays gibts halt in praktisch jeder Sprache):
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDict = CreateObject("Scripting.Dictionary")
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
'Direktes Einlesen, Dictionary Objekt darf nämlich beliebig wachsen
i=0
while not oFile.AtEndOfStream
oDict.add i,oFile.ReadLine
i=i+1
Wend
oFile.Close
' Beispiel für Zugriff
MsgBox "Wert an Index 0: " & oDict.Item(0)
MsgBox "Wert an Index 3: " & oDict.Item(3)
EDIT: Wenn ich die Code-Beispiel mit < code > versuche zu formatieren, sieht man nichts mehr von meinem Text. Deswegen ohne Code Formatierung.
Hallo VBSnoobDlu und AndreasHoster!
Auch ich würde als "dynamische" Variable nur ein Array für sinnvoll halten, und dann (ewas knapper formuliert) zB so vorgehen (um gleich das obige Beispiel zu übernehmen):
Grüße
bastla
Auch ich würde als "dynamische" Variable nur ein Array für sinnvoll halten, und dann (ewas knapper formuliert) zB so vorgehen (um gleich das obige Beispiel zu übernehmen):
Const sInFile = "C:\Systeme.txt"
aEingabe = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(sInFile, 1).ReadAll, vbCrLF)
MsgBox "Wert an Index 0: " & aEingabe(0)
MsgBox "Wert an Index 2: " & aEingabe(2)
Grüße
bastla
@bastla:
An Split hatte ich gar nicht gedacht, guter Hinweis.
An Split hatte ich gar nicht gedacht, guter Hinweis.
Na ja, TXT einlesen sollte man anhand der Beispiele ja schon machen können.
Wenn man sich das Skript von Bastla anschaut, kriegt man das Trennen nach Zeichen: Split
Split(Text,Trennzeichen) gibt ein Array zurück mit entsprechend vielen Elementen je nach Trennzeichen.
Also Split("C;D;E",";") ergibt ein Array mit a(0)="C", a(1)="D" und a(2)="E"
Ein mehrdimensionaler Array geht praktisch wie ein eindimensionaler, nur hat man mehrere Indizes:
REDIM a(10,10,10) wäre ein 3D Array. Es sollten bis 60 Dimensionen gehen, habe das aber noch nicht ausprobiert.
Und insgesamt solltest Du Dir ein paar Gedanken über Deine Datenstruktur machen.
Ein 2D Array mit sagen wir 10x5 Elementen ist bei:
Name1_c_d_e_Pfad
Name2_c_d___Pfad
ungeeignet, weil es wohl verschiedene Anzahl von c,d,e ... gibt und irgendwann kommt f und dann reichen 5 nicht. Und vorsorglich mal 1000 reservieren ist auch kein schöner Programmierstil und auch nicht ressourcenschonend.
Wenn man sich das Skript von Bastla anschaut, kriegt man das Trennen nach Zeichen: Split
Split(Text,Trennzeichen) gibt ein Array zurück mit entsprechend vielen Elementen je nach Trennzeichen.
Also Split("C;D;E",";") ergibt ein Array mit a(0)="C", a(1)="D" und a(2)="E"
Ein mehrdimensionaler Array geht praktisch wie ein eindimensionaler, nur hat man mehrere Indizes:
REDIM a(10,10,10) wäre ein 3D Array. Es sollten bis 60 Dimensionen gehen, habe das aber noch nicht ausprobiert.
Und insgesamt solltest Du Dir ein paar Gedanken über Deine Datenstruktur machen.
Ein 2D Array mit sagen wir 10x5 Elementen ist bei:
Name1_c_d_e_Pfad
Name2_c_d___Pfad
ungeeignet, weil es wohl verschiedene Anzahl von c,d,e ... gibt und irgendwann kommt f und dann reichen 5 nicht. Und vorsorglich mal 1000 reservieren ist auch kein schöner Programmierstil und auch nicht ressourcenschonend.
Hallo VBSnoobDlu!
Ansonsten: Was verstehst Du konkret unter "Sprung" und wozu würdest Du ihn brauchen?
Zum Einlesen der Textdatei mit Datensätzen über 3 (oder, falls die in Deinem Beispiel dargestellte Leerzeile auch in der Datei steht, 4) Zeilen mit zum Teil unterschiedlicher Feldanzahl könntest Du auf Basis der "Dictionary"-Variante von AndreasHoster etwa so vorgehen:
Ablauf:
Zunächst werden alle (4, da Leerzeile berücksichtigt) zu einem Satz gehörigen Zeilen eingelesen und in umgestellter Reihenfolge (PC-Name; Zielpfad; c; d; e; f; ...) durch ";" getrennt als zusammengehöriger Eintrag in einem Dictionary-Element gespeichert. Dabei wird auch die benötigte Feldanzahl für (c; d; ...) ermittelt.
Im zweiten Schritt kann ein passendes Array deklariert und aus den einzelnen Dictionary-Einträgen befüllt werden, wobei zunächst aus jedem Datensatz über Split() ein temporäres (eindimensionales) Array erstellt wird, dessen Elemente dann in das Ergebnis-Array übertragen werden können.
Hat in einem Datensatz ein Feld keinen Inhalt (zB fehlendes "e" beim Satz für "PC-Name2"), bleibt das Array-Feld (siehe zweite MsgBox-Ausgabe) leer.
Grüße
bastla
gibt es in VBS einen Sprung befehl sowie in VB ?
Was es alles in VBS gibt, findest Du zB in der Doku scd56.chm oder scd56de.chm (Download siehe etwa http://dieseyer.de/dse-downloads.html) ...Ansonsten: Was verstehst Du konkret unter "Sprung" und wozu würdest Du ihn brauchen?
Zum Einlesen der Textdatei mit Datensätzen über 3 (oder, falls die in Deinem Beispiel dargestellte Leerzeile auch in der Datei steht, 4) Zeilen mit zum Teil unterschiedlicher Feldanzahl könntest Du auf Basis der "Dictionary"-Variante von AndreasHoster etwa so vorgehen:
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDict = CreateObject("Scripting.Dictionary")
Set oFile = fso.OpenTextFile("Z:\Systeme.txt")
i = 0
iMaxField = 0
Do While Not oFile.AtEndOfStream
sLine1 = oFile.ReadLine 'PC-Name
sLine2 = oFile.ReadLine 'c;d;e
sLine3 = oFile.ReadLine 'Zielpfad
sLine4 = oFile.ReadLine 'Leerzeile
oDict.Add i, sLine1 & ";" & sLine3 & ";" & sLine2
aTemp = Split(sLine2, ";")
If UBound(aTemp) > iMaxField Then iMaxField = UBound(aTemp)
i = i + 1
Loop
oFile.Close
iMaxRec = i 'Höchster Datensatzindex
iMaxField = iMaxField + 2 'Höchster Feldindex (zusätzlich zu iMaxField aufgrund "c;d;e" Felder für PC-Name und Zielpfad)
ReDim aSysteme(iMaxRec, iMaxField)
For i = 0 To iMaxRec
aTemp = Split(oDict.Item(i), ";")
For j = 0 To UBound(aTemp)
aSysteme(i, j) = aTemp(j)
Next
Next
'Dictionary löschen
Set oDict = Nothing
'Beispiel für Zugriff
MsgBox "Wert 'e' aus Satz 0: " & aSysteme(0, 4)
MsgBox "Wert 'e' aus Satz 1: " & aSysteme(1, 4)
Zunächst werden alle (4, da Leerzeile berücksichtigt) zu einem Satz gehörigen Zeilen eingelesen und in umgestellter Reihenfolge (PC-Name; Zielpfad; c; d; e; f; ...) durch ";" getrennt als zusammengehöriger Eintrag in einem Dictionary-Element gespeichert. Dabei wird auch die benötigte Feldanzahl für (c; d; ...) ermittelt.
Im zweiten Schritt kann ein passendes Array deklariert und aus den einzelnen Dictionary-Einträgen befüllt werden, wobei zunächst aus jedem Datensatz über Split() ein temporäres (eindimensionales) Array erstellt wird, dessen Elemente dann in das Ergebnis-Array übertragen werden können.
Hat in einem Datensatz ein Feld keinen Inhalt (zB fehlendes "e" beim Satz für "PC-Name2"), bleibt das Array-Feld (siehe zweite MsgBox-Ausgabe) leer.
Grüße
bastla
Hallo VBSnoobDlu!
Da Du ewähntest, in java zu programmieren, war ich etwas verwundert - daher die Nachfrage wegen des Sprunges ...
"GoTo" gibt es in VBS eigentlich nur in Zusammenhang mit dem Errorhandling (On Error GoTo 0), es stehen Dir aber Kontrollstrukturen wie "If-Then-Else(If)-End If" oder "Select Case" zur Verfügung.
Grüße
bastla
Da Du ewähntest, in java zu programmieren, war ich etwas verwundert - daher die Nachfrage wegen des Sprunges ...
"GoTo" gibt es in VBS eigentlich nur in Zusammenhang mit dem Errorhandling (On Error GoTo 0), es stehen Dir aber Kontrollstrukturen wie "If-Then-Else(If)-End If" oder "Select Case" zur Verfügung.
Grüße
bastla
Hallo VBSnoobDlu!
Mittlerweile sind wir schon ziemlich OT, daher beim nächsten Mal bitte einen neuen Beitrag ...
Du könntest den Zielrechner einfach anpingen, etwa wie hier gezeigt: http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/he ...
Anstelle der IP-Adresse kannst Du auch den Computernamen einsetzen.
Grüße
bastla
Mittlerweile sind wir schon ziemlich OT, daher beim nächsten Mal bitte einen neuen Beitrag ...
Du könntest den Zielrechner einfach anpingen, etwa wie hier gezeigt: http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/he ...
Anstelle der IP-Adresse kannst Du auch den Computernamen einsetzen.
Grüße
bastla