Zeilen aus TXT per VBS zusamenfassen und mit SEMIKOLON trennen

  • VBScript

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    Zeilen aus TXT per VBS zusamenfassen und mit SEMIKOLON trennen

    Hallo,

    ich habe über Wget sowie htmastxt folgende TXT Datei erzeugt.

    z.b. 10.10.10.222.txt








    Quellcode

    1. Printer
    2. =======
    3. Default Destination: shredder
    4. 10030_rech1_1
    5. Description: Lexmark E360dn
    6. Location: Porsche Cottbus
    7. Printer State: idle, accepting jobs.
    8. "Print file sent, waiting for printer to finish..."
    9. Device URI: socket://10.56.62.148:9100
    10. 10030_rech1_2
    11. Description: Lexmark E360dn
    12. Location: Porsche Cottbus
    13. Printer State: idle, accepting jobs.
    14. "Print file sent, waiting for printer to finish..."
    15. Device URI: socket://10.56.62.148:9100
    16. 10030_Service
    17. Description: Lexmark E360 dn
    18. Location: Porsche Cottbus
    19. Printer State: idle, accepting jobs.
    20. "Print file sent, waiting for printer to finish..."
    21. Device URI: socket://10.56.62.147:9100
    22. .....






    Nun möchte ich folgendes erreichen

    das aus dem Bereich

    10030_Service

    Description: Lexmark E360 dn
    Location: Porsche Cottbus
    Printer State: idle, accepting jobs.
    "Print file sent, waiting for printer to finish..."
    Device URI: socket://10.56.62.147:9100

    folgendes wird
    am liebsten sollte in der ersten Zeile vorher der Wert
    Betrieb;Drucker; Bezeichnung; Location; Printer; Printer status;Device;URL
    und dann die Werte aus der Datei
    10030;10030_Service;Description: Lexmark E360 dn;Location: Porsche Cottbus;Printer State: idle, accepting jobs.;"Print file sent, waiting for printer to finish...";
    Device URI: socket://10.56.62.147:9100;Dateiname hier 10.10.10.222

    sprich
    Betrieb;Drucker; Bezeichnung; Location; Printer; Printer status;Device;URL
    10030;10030_rech1_1;Description: Lexmark E360dn;Location: Porsche Cottbus;Printer State: idle, accepting jobs.;"Print file sent, waiting for printer to finish...";
    Device URI: socket://10.56.62.148:9100;Dateiname hier 10.10.10.222
    10030;10030_rech1_2;Description: Lexmark E360dn;Location: Porsche Cottbus;Printer State: idle, accepting jobs.;"Print file sent, waiting for printer to finish...";
    Device URI: socket://10.56.62.148:9100;Dateiname hier 10.10.10.222
    10030;10030_Service;Description: Lexmark E360 dn;Location: Porsche Cottbus;Printer State: idle, accepting jobs.;"Print file sent, waiting for printer to finish...";
    Device URI: socket://10.56.62.147:9100;Dateiname hier 10.10.10.222

    Die Zeile : " "Print file sent, waiting for printer to finish..."
    kann da sein muss aber nicht bzw. kann einen anderen Inhalt haben, wenn nicht vorhanden, dann soll diese Leer gelassen werden

    10030;10030_Service;Description: Lexmark E360 dn;Location: Porsche Cottbus;Printer State: idle, accepting jobs.;;Device URI: socket://10.56.62.147:9100;Dateiname hier 10.10.10.222



    die Nummer vorne ist immer 5 Stellig. d.h. sie muss nicht 10030 sein sonder jegliche andere 5 Stellige Nummer.



    Ich hoffe ihr könnt mir helfen.



    Vielen Dank für Eure Rückmeldungen
    Hier mal ein Beispiel in Basic.
    Es sollte kein großes Problem sein, das nach VBS umzusetzen. Zum Testen eine EXE im Anhang.

    Visual Basic-Quellcode

    1. #COMPILE EXE
    2. #DIM ALL
    3. FUNCTION PBMAIN
    4. DIM Quelle$, t$, t1$, tmp$, S$, Ziel$, x&
    5. S = ";"
    6. quelle = INPUTBOX$("Namen der Quelldatei eingeben:", "Quelldatei")
    7. ziel = INPUTBOX$("Namen der Zieldatei eingeben:", "zieldatei")
    8. OPEN quelle FOR INPUT AS #1
    9. OPEN ziel FOR OUTPUT AS #2
    10. PRINT #2, "Betrieb;Drucker; Bezeichnung; Location; Printer; Printer status;Device;URL"
    11. WHILE NOT EOF( 1 )
    12. LINE INPUT #1, t
    13. t = TRIM$( t )
    14. IF LEN( t ) THEN
    15. IF LCASE$( LEFT$( t, 4 )) = "desc" THEN
    16. PRINT #2, LEFT$( t1, 5 ) & S & t1 & S t & S;
    17. x = 1
    18. ELSEIF x = 1 THEN
    19. PRINT #2, t & S;
    20. x = 2
    21. ELSEIF x = 2 THEN
    22. PRINT #2, t & S;
    23. tmp = t
    24. x = 3
    25. ELSEIF LCASE$( LEFT$( t, 4 )) = "devi" THEN
    26. IF t1 <> tmp THEN
    27. PRINT #2, t1 & S & t ;
    28. ELSE
    29. PRINT #2, t ;
    30. END IF
    31. PRINT #2, S & "Dateiname hier "; EXTRACT$(quelle, ".")
    32. x = 0
    33. END IF
    34. IF LEN( t ) THEN t1 = t
    35. END IF
    36. WEND
    37. CLOSE
    38. MSGBOX "Fertig", %MB_ICONINFORMATION, "Info"
    39. END FUNCTION
    Dateien
    • svenac.exe

      (11,78 kB, 133 mal heruntergeladen, zuletzt: )
    Hallo,

    vielen Dank, genau das was ich gesucht habe.
    jedenfalls funktioniert es ohne Probleme, mit leichten Einschränkungen

    Leider kenn ich mich mit VBA / VBS nicht aus. Daher wüsste ich es nicht als VBS umzusetzen.

    Vielleicht kann hier nochmal auf Basis VBS aufgeriffen werden.

    Unterm Strich habe ich am Schluss 3 scripte

    Script 1 für für Datei xx.xx.xx.xx.txt ( wobei xx variabel ist)
    Script 2 für Datei xx.xx.xx.xx.txt ( wobei xx variabel ist)
    Script 3 für Datei xx.xx.xx.xx.txt ( wobei xx variabel ist)

    Wo ich im VBS script selber editieren kann welche Datei er ziehen soll und wo er hinspeichert ( ohne die Abfrage einer Inbox) .
    Es funktioniert auch soweit alles , nur das er als URL immer ...Dateiname hier 10 schreibt
    Wenn im VBS die Möglichkeite an dieser Stelle ....z.b. über "http://printers" & "quelle (Datei ohne Endung " einzutragen wäre s perfekt

    Aber sonst bisher Top und DANKE schön für die Hilfestellung.
    Und hier die VBS- Version:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim FSO, Datei, DateiAlt, DateiNeu, QuellDatei, ZielDatei
    3. Dim t, t1, tmp, x, DatName
    4. Const S = ";"
    5. QuellDatei ="d:\##\10.10.10.222.txt"
    6. ZielDatei ="d:\##\svenneu.txt"
    7. Set FSO = CreateObject("Scripting.FileSystemObject")
    8. Set DateiAlt = FSO.OpenTextFile(QuellDatei)
    9. Set DateiNeu = FSO.CreateTextFile(ZielDatei, 2)
    10. Set Datei = FSO.GetFile(QuellDatei)
    11. DatName = Left(Datei.Name, InStrRev(Datei.Name, ".") - 1)
    12. DateiNeu.WriteLine("Betrieb;Drucker; Bezeichnung; Location; Printer; Printer status;Device;URL")
    13. Do Until DateiAlt.atEndOfStream
    14. t = DateiAlt.ReadLine
    15. t = Trim(t)
    16. If Len(t) Then
    17. If LCase( Left(t, 4)) = "desc" Then
    18. DateiNeu.Write(Left(t1, 5) & S & t1 & S & t & S)
    19. x = 1
    20. ElseIf x = 1 Then
    21. DateiNeu.Write(t & S)
    22. x = 2
    23. ElseIf x = 2 Then
    24. DateiNeu.Write(t & S)
    25. tmp = t
    26. x = 3
    27. ElseIf LCase(Left(t, 4)) = "devi" Then
    28. If t1 <> tmp Then
    29. DateiNeu.Write(t1 & S & t)
    30. Else
    31. DateiNeu.Write(t)
    32. End If
    33. DateiNeu.Writeline(S & "Dateiname hier ") & UCase(DatName)
    34. x = 0
    35. End If
    36. If Len(t) Then t1 = t
    37. End If
    38. Loop
    39. DateiAlt.Close
    40. DateiNeu.Close
    41. MsgBox "Fertig", 64, "INFO"
    Danke Eierlein ,

    vielen lieben Dank und tolles Lob an Dich bzw. allen die Versuchen jemanden ohne VBS Kenntnisse zu unterstützen

    so hatte ich mir das gedacht und hab entpsrechende Anpassungen schon vorgenommen,
    nun ist mir aber aufgefallen, dass

    beim Beispiel

    richtig

    10030_rech1_1
    Description: Lexmark E360dn
    Location: Porsche Cottbus
    Printer State: idle, accepting jobs.
    "Print file sent, waiting for printer to finish..."
    Device URI: socket://10.56.62.148:9100

    Betrieb;Drucker; Bezeichnung; Location; Printer; Printer status;Device;URL
    10030;10030_rech1_1;Description: Buchhaltung;Location: Porsche Cottbus ;Printer State: idle, accepting jobs.;"Print file sent, waiting for printer to finish...";Device URI: socket://10.56.62.148:9100 ;10.112.230.119/printers/;


    falsch

    10040_rech1_1
    Description: Lexmark E360dn
    Location: Porsche Cottbus
    Printer State: idle, accepting jobs.
    "Print file sent, waiting for printer to finish..."
    Device URI: socket://10.56.62.xxx:9100

    Betrieb;Drucker; Bezeichnung; Location; Printer; Printer status;Device;URL
    10040;10040_rech1_1;Description: Buchhaltung;Location: Porsche Cottbus ;Printer State: idle, accepting jobs.;Device URI: socket://10.56.62.xxx:9100 ;10.112.230.119/printers/;

    steht.

    wenn die Zeile
    "Print file sent, waiting for printer to finish..."

    nicht gefüllt ist, wandert beim Konvertieren der gesamte dahinterliegende Bereich nach rechts, somit stimmen die Bezeichnungen mit dem darunterliegenden Wert nicht mehr überein. Sprich wenn aktuell gedruckt wird sind 7 Zeilen in der TXT Datei wenn nicht sind nur 6 Zeilen befüllt.

    Vielleicht ist es ein Ansatz die Zeilenwerte zum Teil abzufragen
    diese beginnen ja immer mit folgenden Werten

    beim drucken

    5 Stellige Nummer
    Description:
    Location:
    Printer State:
    "
    Device URI:

    nicht beim drucken

    5 Stellige Nummer
    Description:
    Location:
    Printer State:
    Device URI:

    Daher kann ich mir vorstellen wenn der Wert " nicht vorhanden ist spring zum nächsten Wert

    Wie bekomme ich es hin, dass wenn in der Zeile des Printer status z.b. mit dem Wert " nicht beginnt
    der Wert nicht gefüllt ist, dass er dann den nächsten gefunden Wert in die Spalte Device einträgt

    Hierzu benötige ich letztmalig Hilfe von Euch.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „svenac2010“ ()

    Danke das wars.... klappt nun alles wie ich es haben möchte.

    Habe versucht den Quellcode zu verstehen, soweit auch Ok,
    nur find ich nicht die Stelle wo der Drucker abgefragt wird (z.b. 10030_Service )

    Habe versucht mit DateiNeu.Writeline(S & "http://") & UCase(DatName) & ("/printers/") den Drucker noch hinzuzufügen

    aber weder
    DateiNeu.Writeline(S & "http://") & UCase(DatName) & ("/printers/") & S & t
    noch
    DateiNeu.Writeline(S & "http://") & UCase(DatName) & ("/printers/") & S & t1
    bringt mir nicht das gewünschte Ergebnis

    10.112.216.12/printers/10030_rech1_1
    sondern nur
    10.112.216.12/printers/Device/URI: socket://10.45.94.173:9100
    oder
    10.112.216.12/printers/Printer/State: idle, accepting jobs.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „svenac2010“ ()

    … nur find ich nicht die Stelle wo der Drucker abgefragt wird (z.b. 10030_Service )


    Die Stelle findest du:

    Visual Basic-Quellcode

    1. Dim Drucker
    2. If LCase( Left(t, 4)) = "desc" Then
    3. DateiNeu.Write(Left(t1, 5) & S & t1 & S & t & S)
    4. Drucker = t1
    5. x = 1


    Wenn du das damit nicht hinkriegst, dann häng' eine Textdatei an.

    Die Datei muss
    1. einen echten Quelldatensatz,
    2, eine echte, komplete Zieldatenzeile,
    3. eine komplette Zieldatenzeile mit deinen gewünschten Änderungen,
    4. Beschreibung wo die Daten für die Änderungen herkommen. (Aus der Quelldatei oder Festtexte?),
    enthalten!

    Deine Teilbeschreibungen hab' ich nicht so richtig verstanden. Wo kommt die z. B. die 10.112.216. 12 her?