Steellion Geschrieben 18. Januar 2010 Teilen Geschrieben 18. Januar 2010 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MartinSt Geschrieben 18. Januar 2010 Teilen Geschrieben 18. Januar 2010 zu 1. Welcher Fehler kommt? in welcher Codezeile? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eratum Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Steellion Geschrieben 19. Januar 2010 Autor Teilen Geschrieben 19. Januar 2010 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eratum Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 So ist es. Aber du musst dann darauf, achten die Dateiaufrufe entsprechend anzupassen. MfG P.s.: Ist irgendwie ganz schön verworren das Teil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Steellion Geschrieben 19. Januar 2010 Autor Teilen Geschrieben 19. Januar 2010 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eratum Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 Kannst ja denn mal dien Ergebnis posten Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Steellion Geschrieben 19. Januar 2010 Autor Teilen Geschrieben 19. Januar 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Steellion Geschrieben 25. Januar 2010 Autor Teilen Geschrieben 25. Januar 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eratum Geschrieben 25. Januar 2010 Teilen Geschrieben 25. Januar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Steellion Geschrieben 25. Januar 2010 Autor Teilen Geschrieben 25. Januar 2010 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eratum Geschrieben 25. Januar 2010 Teilen Geschrieben 25. Januar 2010 (bearbeitet) 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 25. Januar 2010 von Eratum Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Steellion Geschrieben 25. Januar 2010 Autor Teilen Geschrieben 25. Januar 2010 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eratum Geschrieben 25. Januar 2010 Teilen Geschrieben 25. Januar 2010 Der Teil mit dem Datum besteht in jedem Fall aber aus 10 Zeichen (TT/MM/YYYY)? Oder können da auch exoten wie: 1.1.10 drinne stehen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Steellion Geschrieben 25. Januar 2010 Autor Teilen Geschrieben 25. Januar 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eratum Geschrieben 25. Januar 2010 Teilen Geschrieben 25. Januar 2010 (bearbeitet) 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 25. Januar 2010 von Eratum Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.