Zum Inhalt springen

Probleme mit VB Script


Steellion

Empfohlene Beiträge

Hallo liebe Fachinformatiker Kollegen.

Ich hab ein für mich riesiges Problem:

Ich habe vor längerer Zeit mal ein VB Script Programm erstellen sollen, welches aus einer Liste nach dem Schema:

Name;18.01.2010

Name2;19.01.2010

Name3;30.01.2010

Den Namen und das Datum heraussuchen sollte um dann zu schauen, ob das Datum in der Zeile, mit dem aktuellen Datum übereinstimmt. sollte dies der Fall sein, soll der Name in eine zweite Liste geschrieben werden.

Das Programm hab ich mir dann mehr oder weniger funktionierend (der erste Eintrag wird in die Log-Datei geschrieben, die anderen nicht) aus verschiedenen Quellen zusammengestückelt, da VBS für mich eine vollkommen unverständliche Sprache ist. In C oder PHP wäre das Problem schon viel kleiner, aber ich versteh VBS einfach keinen Meter...

Nun habe ich das Problem, dass ich das Programm in einzelne Funktionen zerlegen soll, ich aber nicht weiß, wo irgendwas anfängt und irgendwas aufhört, geschweige denn, wie ich Funktionen überhaupt mache/aufrufe/mit Attributen füttere...


Const ForReading = 1

Dim arrDn()

Dim arrAkt()

x = 1

datum = date

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\Liste.txt")

Set fso = CreateObject("Scripting.FileSystemObject")

sZDatei = "C:\Scripts\Log.txt"

Set oZDatei = fso.OpenTextFile(sZDatei, 2, True)


   Set objFileSystem = CreateObject("Scripting.FileSystemObject")  


Do Until objFile.AtEndOfStream

    strData = ""

    strSearchString = objFile.ReadLine


    intStart = InStr(strSearchString, ";")


    If intStart <> 0 Then

        intStart = intStart + 1

        strText = Mid(strSearchString, intStart, 50)


        For i = 1 to Len(strText)

            If Mid(strText, i, 1) = ";" Then

                Exit For

            Else

                strData = strData & Mid(strText, i, 1)

            End If

          Next


    Dn = ""


      Pos = InStr(strSearchString, ";")

      Dn = Dn + Left(strSearchString, Pos - 1)


    Akt = ""

      Pos = InStr(strSearchString, ";")

      Akt = Akt + Right(strSearchString, 3)


     End If


     If StrComp(strData, datum, vbTextCompare) = 0 Then


    redim preserve arrDn(x)

    arrDn(x) = Dn

    redim preserve arrAkt(x)

    arrAkt(x) = Akt    

    wscript.echo arrDn(x)

    wscript.echo arrAkt(x)

     oZDatei.Write Dn

     oZDatei.Write ";"

     oZDatei.Write Akt

     oZDatei.Close


    Else

     wscript.echo "Leider nicht das korrekte Datum"

End If

Loop

Ich hätte allso 2 Bitten:

1. Kann jemand irgendwas mit meinem Quellcode anfangen und ihn vllt zerstückeln oder wenigstens ohne Fehlermeldungen zum Laufen bekommen?

2. Gibts ne gute Quelle wo man das ganze VB Zeug leicht verständlich erklärt bekommt? Hab schonmal gesucht, aber irgendwie nie etwas, wo ich mich dann Schritt für Schritt von anfang an durchhangen konnte.

Wäre echt nett von euch, Danke schonmal im Voraus!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mir fallen da spontan schon einmal diverse Sachen auf.

1. Objekte (z.b. Filesystemobjekt) lassen sich wieder verwenden

D.h.: Es ist nicht nötig

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set fso = CreateObject("Scripting.FileSystemObject")

Set objFileSystem = CreateObject("Scripting.FileSystemObject")

zu dimensionieren. Eins reicht aus :-)

2. Schau dir mal an wie in VBS Dateien Lesend/Schreibend geöffnet werden.

(Als kleine Kurzreferenz, die recht gut erklärt ist nehm ich immer asphelper.de.

Soweit mal meine ersten Gedanken, nachm überfliegen deines Skriptes...Mehr dazu später :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Welcher Fehler kommt? in welcher Codezeile?

Test.vbs<51, 6> Microsoft VBScript runtime error: Object variable not set

Das wäre diese Zeile:

oZDatei.Write Dn

@Eratum:

Also kann ich 2 von den 3 Zeilen löschen?

Alles klar, die Seite schau ich mir mal an.

Vielen Dank schonmal euch beiden!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja ich weiß... wie gesagt, ich blick in VBS irgendwie nicht durch, weil mir der Syntax nicht verständlich ist.

Zudem hab ich das Teil aus verschiedenen Beispielen und Programmteilen zusammengeschnipselt, wollte nur das es irgendwie funktioniert, da ichs einfach nicht verstehe :)

Hab jetzt grad mit meinem Ausbilder eine Funtkion rausgefiltert. Hoffentllich schaff ich das beim Rest auch irgendwie...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alles klar, mach ich doch glatt:


Call Datei_einlesen("C:\Scripts\Liste.txt",Dateiinhalt)


Private Function Datei_einlesen(Pfad,Ergebnis)

'Pfad ....... Pfad der Datei welche eingelesen werden soll

'Ergebnis ... Array mit dem kompletten Inhalt der eingelesenen Datei


Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile(Pfad)

Set fso = CreateObject("Scripting.FileSystemObject")

Dim i:i=0

Do Until objFile.AtEndOfStream

    strSearchString = objFile.ReadLine

	redim preserve Dateiinhalt()

	Dateiinhalt(i) = strSearchString

	i = i+1

Loop

End Function

So sieht bis jetzt die erste Funktion aus, muss ich jetzt testen und dann den Rest irgendwie in Funktionen packen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, die anfänglichen Probleme sind gelöst:


Private Function Einlesen(Pfad,Ergebnis)

'Pfad ....... Pfad der Datei welche eingelesen werden soll

'Ergebnis ... Array mit dem kompletten Inhalt der eingelesenen Datei

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile(Pfad)

Set fso = CreateObject("Scripting.FileSystemObject")

Dim i:i=0

Do Until objFile.AtEndOfStream

	redim preserve Dateiinhalt(i)

	Dateiinhalt(i) = objFile.ReadLine

	i = i+1

Loop

End Function


Private Function Zerteilen(Dateiinhalt)

For j = LBound(Dateiinhalt) to UBound(Dateiinhalt)

	strData = ""

    strSearchString = Dateiinhalt(j)

    intStart = InStr(strSearchString, ";")


    If intStart <> 0 Then

        intStart = intStart + 1

        strText = Mid(strSearchString, intStart, 50)


        For i = 1 to Len(strText)

            If Mid(strText, i, 1) = ";" Then

                Exit For

            Else

                strData = strData & Mid(strText, i, 1)

            End If

        Next


		Name = ""

		Pos = InStr(strSearchString, ";")

		Name = Name + Left(strSearchString, Pos - 1)

		redim preserve arrName(j)

		arrName(j) = Name		


		Zeitpunkt = ""

		Pos = InStr(strSearchString, ";")

		Zeitpunkt = Zeitpunkt + Right(strSearchString, 10)

		redim preserve arrDatum(j)

		arrDatum(j) = Zeitpunkt


    End If

Next

End Function


Private Function Vergleichen(arrDatum)

Dim i:i=0

For j = LBound(arrDatum) to UBound(arrDatum)

    If StrComp(arrDatum(j), datum, vbTextCompare) = 0 Then

		redim preserve arrZeilen(i)

		arrZeilen(i) = j

		i=i+1

    Else

		wscript.echo "Leider nicht das korrekte Datum"

	End If

Next

End Function

Nun habe ich aber ein neues Problem...

Die Liste in der die Einträge stehen, soll genaustens geprüft werden, das heißt, als erstes eine Funtkion welche eine Zeile überprüft und schaut, ob ein Datum in ihr vorkommt, wenn ja, wo es anfängt und das Datum an sich zurückgeben.

Leider habe ich keine Ahnung wie ich das ganze Elegant lösen könnte...

Ich habe mir schon überlegt mit einer Menge an If-Abfragen zu arbeiten, aber das wäre total unübersichtlich. Und ansonsten fällt mir nichts akzeptables ein.

Hat einer von euch ne schöne Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich das jetzt richtig verstanden habe, willst du nach verschiedenen Daten abfragen. Jetzt wäre die Frage wie die abzuprüfenden Datums da rein sollen.

Idee 1:

Ein array (oder auch normaler String) in das du alle "korrekten" Daten reinklemmst und dann einfach abprüfst ob das ausgelesene Datum im String/Array auch drin steht. Das wäre dann eine einzige If-Abfrage.

Idee 2:

Über ein Conditionall-Select. D.h.:

Select case true

 case Instr( usw.usf...

 case Instr( usw.usf...

 case else

end select

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sorry, habe mich vielleicht etwas blöd ausgedrückt:

Ich habe eine Liste, in diesem Schema:

Test123Acc;08.04.2009

Fi4Si;20.01.2010

Az56u23bilb;10.04.2009 jdfh

Nun brauche ich eine Funtkion, welche eine Zeile liest, und überprüft ob in der Zeile das Schema:

XX#XX#XXXX

X= 0-9

# = . oder /

vorkommt.

Eine Liste zu erstellen, scheint mir hier Sinnlos, da ich dann jedes Datum ab heute bis in ein paar Jahren eintragen müsste...

InStr klingt zwar gut, aber wie kann ich damit das oben genannte Schema prüfen?

Mein Ausbilder meinte, ich solle es mit diesen Funtkionen probieren:


For i=1 to ende

	z=Mid(a,i,1)

' um jedes Zeichen einzeln zu prüfen


If (Asc(z)>=48 and Asc(z)<=57)

' mit Asc bekkommt man den ASCII Code einers Zeichens, also kann man genau schauen, um was für ein Zeichen es sich handelt

Leider komme ich damit auch nicht weiter, meine letze Idee, war einen String nach und nach zu füllen, sprich:

Wenn Zahl

String = Zahl

Wenn nächstes Zeichen Zahl

String = String +Zahl

Wenn nächstes Zeichen Punkt oder Schrägstrich

String = String + Punkt oder Schrägstrich

...

aber ich weiß nich, ob es:

1. Funtkioniert

2. Nicht einfacher geht

3. Wie ich dabei die Startposition des Datums rausziehen soll...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, also Datei Zeilenweise auslesen hast du ja schon gemacht. Sollte also zu schaffen sein :)

Das Datum herausfiltern (angenommen der Struktur [Text];[Datum]):

Datum_Zeile = Mid(Zeilenstring,Instr(Zeilenstring,";")+1,10)

'Instr(Zeilenstring,";") gibt die Position des ersten ";" zurück
dann hast du schonmal den Datumstring. Den kannst du dir ja nun zerstückeln. Da du ja das Schema an sich hast. D.h. Ich würde folgendermaßen vorgehen:
'mit Isnummeric prüfst du ob es sich um eine Zahl handelt

If isnummeric(Left(Datum_Zeile,2))=true and ....

[blubb]

end if

Die If-Abfrage kannst du ja beliebig mit "and" erweitern und somit deinen String zerpflücken...

Edith:

Anstatt die Strings mit "For to next" zu durchpflügen würde ich einfach nen Instr() machen...

Bearbeitet von Eratum
Link zu diesem Kommentar
Auf anderen Seiten teilen

Das mit der Suche nach dem ; hatte ich so eigentlich auch schon in meinem Script, Problem hierbei ist, dass mein Ausbilder fast sämtliche Fehler die in der Liste gemacht werden können, vom Programm ausgemerzt werden sollen... Es sollen also auch Extrembeispiele wie:

a1468asd1a8 20.01.2010

s20.32ldsf;ase / 21.01.2010

aaabbbcccddd 01/19/2010**

erkannt werden... und deshalb, soll ich die Zeile Zeichen für Zeichen durchsuchen und nach dem genannten Schema scannen...aber ich find einfach keinen einfachen Weg...

Link zu diesem Kommentar
Auf anderen Seiten teilen

also, anscheinend wird es nur Daten in dem Schema:

XX#XX#XXXX

X= Zahl 0-9

#= . oder /

geben...deswegen wollte er wahrscheinlich, dass ich mit dem ASC arbeite, weil ich damit genau abfragen kann um was für ein Zeichen es sich handelt.

Wie könnte ich denn, an einen String immer eine Stelle hunzufügen?

Sprich, ich teste ob das Zeichen eine Zahl ist, wenn ja wird sie auf einen String geschrieben, wenn die nächste auch eine Zahl ist, wird sie dem String hinten angefügt, sodass ich das Datum nach und nach aneinandereihe. Wenn das nicht geht, könnte ich auch ein Array machen, welches ich fülle, sobald aber ein Zeichen kommt, das nicht ins Schema passt, wird das Array wieder gelöscht...

Würde das funktionieren?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sohoooo...

Ich hab' mal was zusammengetippert (hat mich jetz selber interessiert) und den relevanten Schnipsel extrahiert:

do while not Quelldatei.AtEndOfStream

	'Zeile für Zeile auslesen

	Zeile = Quelldatei.Readline

	'Die gesamte Zeile Zeichen für Zeichen durchsuchen

	for i=1 to len(Zeile)

		'Wenn eine der nächsten anweisungen "false" zurückgibt, ist es nicht der Datumswert

		Select case false

			case Nummer(mid(Zeile,i,2))

			case Nummer(mid(Zeile,i+3,2))

			case Nummer(mid(Zeile,i+6,4)) 

			case else

				'den vermeintlichen Datumswert wiedergeben

				wscript.echo mid(Zeile,i,10)

				exit for

		end select

	next


loop
Die Funktion:

function Nummer(Datumsstring)

	Nummer=true

	'Wieder wird der String durchforstet

	For n=1 to len(Datumsstring)

		'Prüfung ob es Zahlen sind

		if Asc(mid(Datumsstring,n,1))>=48 and Asc(mid(Datumsstring,n,1))<=57 then

		else

			'Wenn nicht, wird die Funktion beendet

			Nummer=false

			exit function 

		end if

	next

end function

Ich hab's ein wenig kommentiert, aber wenn du noch Erläuterungen brauchst dann sprich dich aus ^^

Im Endeffelkt mach' ich an der Stelle nichts anderes als zu schauen ob irgendwo in der Zeile ein String mit dem Format: XX[Zeichen]XX[Zeichen]XXXX (X=Zahl) ist....

Bearbeitet von Eratum
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...