Dateien auslesen und an Excel übergeben

  • Einen wunderschönen guten Morgen,

    eigentlich ist mein Anliegen nicht besonders schwer, aber ich brauche Optimierung und paar Gedankenanstöße von euch. :)
    Ich habe einen Ordner mit TXT-Dateien, wo Systeminfos abgespeichert sind.
    Alle Dateien haben diesen Aufbau:

    Spoiler anzeigen


    Windows-IP-Konfiguration


    Hostname. . . . . . . . . . . . . : Dell05_02

    Primäres DNS-Suffix . . . . . . . : BLA.DE

    Knotentyp . . . . . . . . . . . . : Hybrid

    IP-Routing aktiviert. . . . . . . : Nein

    WINS-Proxy aktiviert. . . . . . . : Nein

    DNS-Suffixsuchliste . . . . . . . : BLA.DE

    bla.de


    Ethernetadapter LAN-Verbindung:


    Verbindungsspezifisches DNS-Suffix: sunpoint.de

    Beschreibung. . . . . . . . . . . : Broadcom 440x 10/100 Integrated Controller

    Physikalische Adresse . . . . . . : 00-11-43-19-AD-C1

    DHCP aktiviert. . . . . . . . . . : Ja

    Autokonfiguration aktiviert . . . : Ja

    IP-Adresse. . . . . . . . . . . . : 192.168.22.211

    Subnetzmaske. . . . . . . . . . . : 255.255.255.0

    Standardgateway . . . . . . . . . : 192.168.22.84

    DHCP-Server . . . . . . . . . . . : 192.168.22.3

    DNS-Server. . . . . . . . . . . . : 192.168.22.2

    192.168.22.3

    Primärer WINS-Server. . . . . . . : 192.168.22.2

    Sekundärer WINS-Server. . . . . . : 192.168.22.189

    Lease erhalten. . . . . . . . . . : Dienstag, 10. Mai 2011 07:00:02

    Lease läuft ab. . . . . . . . . . : Mittwoch, 18. Mai 2011 07:00:02

    ALLUSERSPROFILE=C:\Dokumente und Einstellungen\All Users
    APPDATA=\\SUN12\TSPROFILES$\cklosowski\Anwendungsdaten
    CD=\\DC2\NETLOGON
    CommonProgramFiles=C:\Programme\Gemeinsame Dateien
    COMPUTERNAME=DELL05_02
    ComSpec=C:\WINDOWS\system32\cmd.exe
    FP_NO_HOST_CHECK=NO
    HOMEDRIVE=C:
    HOMEPATH=\Dokumente und Einstellungen\cklosowski
    IFMEM="\\DC2\NETLOGON\ITMgmt\ifmember.exe"
    LOGONSERVER=\\DC2
    NUMBER_OF_PROCESSORS=2
    OS=Windows_NT
    Path=\\DC2\NETLOGON;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Programme\ATI Technologies\ATI Control Panel;C:\WINDOWS\system32\WindowsPowerShell\v1.0;C:\Programme\Microsoft SQL Server\80\Tools\Binn\;C:\WINDOWS\system32\WindowsPowerShell\v1.0
    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1;.PSC1
    PROCESSOR_ARCHITECTURE=x86
    PROCESSOR_IDENTIFIER=x86 Family 15 Model 3 Stepping 4, GenuineIntel
    PROCESSOR_LEVEL=15
    PROCESSOR_REVISION=0304
    ProgramFiles=C:\Programme
    PROMPT=$P$G
    PSModulePath=C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\
    SEE_MASK_NOZONECHECKS=1
    SESSIONNAME=Console
    SystemDrive=C:
    SystemRoot=C:\WINDOWS
    TEMP=C:\DOKUME~1\CKLOSO~1\LOKALE~1\Temp
    TMP=C:\DOKUME~1\CKLOSO~1\LOKALE~1\Temp
    USERDNSDOMAIN=BLA.DE
    USERDOMAIN=BLA
    USERNAME=cKlosowski
    USERPROFILE=C:\Dokumente und Einstellungen\cklosowski
    windir=C:\WINDOWS

    Hostname: DELL05_02
    Betriebssystemname: Microsoft Windows XP Professional
    Betriebssystemversion: 5.1.2600 Service Pack 3 Build 2600
    Betriebssystemhersteller: Microsoft Corporation
    Betriebssystemkonfiguration: Mitglied der Dom„ne/Arbeitsgruppe
    Buildtyp von Betriebssystem: Multiprocessor Free
    Registrierter Benutzer: admin
    Registrierte Organisation:
    Produktkennung: 76497-OEM-0011903-00102
    Ursprngliches Installationsdatum: 26.01.2005, 13:54:27
    Systembetriebszeit: 0 Tage, 0 Stunden, 6 Minuten, 17 Sekunden
    Systemhersteller: Dell Inc.
    Systemmodell: Dimension 5000
    Systemtyp: X86-based PC
    Prozessor(en): 1 Prozessor(en) installiert.
    [01]: x86 Family 15 Model 3 Stepping 4 GenuineIntel ~2992 MHz
    BIOS-Version: DELL - 7
    Windows-Verzeichnis: C:\WINDOWS
    System-Verzeichnis: C:\WINDOWS\system32
    Startger„t: \Device\HarddiskVolume2
    Systemgebietsschema: de;Deutsch (Deutschland)
    Eingabegebietsschema: de;Deutsch (Deutschland)
    Zeitzone: Nicht verfgbar
    Gesamter physikalischer Speicher: 1.022 MB
    Verfgbarer physikalischer Speicher: 627 MB
    Virtueller Speicher: Maximale GrӇe: 2.048 MB
    Virtueller Speicher: Verfgbar: 2.001 MB
    Virtueller Speicher: Zurzeit verwendet: 47 MB
    Auslagerungsdateipfad(e): C:\pagefile.sys
    Dom„ne: BLA.DE
    Anmeldeserver: \\DC2
    Hotfix(es): 433 Hotfix(e) installiert.

    Ich habe mit folgendem Script meine gewünschten Infos herausgeholt, aber dann die Erweiterung mit Excel.. ich hoffe, ihr seht durch.

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>
    #include <Excel.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $i, $Filelist, $file, $Inhalt, $oExcel, $g

    [/autoit] [autoit][/autoit] [autoit]

    $FileList = _FileListToArray("\\bdc\clientconfig$")
    If @error = 1 Then
    MsgBox(0, "", "Keine Ordner gefunden.")
    Exit
    EndIf
    If @Error=4 Then
    MsgBox (0,"","Keine Dateien gefunden.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $i = $FileList[0]
    $oExcel = _ExcelBookOpen("\\sun12\cyber\Dokumentationen\Übersichtsdokus\InstallDate.xlsx")

    [/autoit] [autoit][/autoit] [autoit]

    While $i > 0

    [/autoit] [autoit][/autoit] [autoit]

    $File = FileOpen("\\bdc\clientconfig$\" & $FileList[$i], 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1

    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $2=StringInStr($line, "COMPUTERNAME=")
    _ExcelWriteCell($oExcel, $2, $i, 1)
    ;MsgBox(0, "$2",$2)
    IF not StringInStr($line, "COMPUTERNAME=") = 0 Then
    $result = StringTrimLeft($line, 13)
    _ExcelWriteCell($oExcel, $result, $i, 3)
    ;MsgBox(0, "Hostname", $result)
    EndIf
    IF not StringInStr($line, "Betriebssystemname:", 1, 1) = 0 Then
    ;$array = StringSplit($line, ':')
    ;_ArrayDisplay($array)
    ;MsgBox(0, "Betriebssystemname", $array[2])
    $result = StringTrimLeft($line, 47)
    _ExcelWriteCell($oExcel, $result, $i,5)
    ;MsgBox(0, "Betriebssystemname:", "#" & $result & "#")
    EndIf
    IF not StringInStr($line, "Ursprngliches Installationsdatum:", 1, 1) = 0 Then
    ;$array = StringSplit($line, ':')
    ;_ArrayDisplay($array)
    $result = StringTrimLeft($line, 47)
    _ExcelWriteCell($oExcel, $result, $i, 7)
    ;MsgBox(0, "Ursprngliches Installationsdatum:", "#" & $result & "#")
    EndIf
    IF not StringInStr($line, "Systemhersteller:", 1, 1) = 0 Then
    ;$array = StringSplit($line, ':')
    ;_ArrayDisplay($array)
    $result = StringTrimLeft($line, 47)
    _ExcelWriteCell($oExcel, $result, $i, 9)
    ;MsgBox(0, "Systemhersteller:", "#" & $result & "#")
    EndIf
    IF not StringInStr($line, "Systemmodell:", 1, 1) = 0 Then
    ;$array = StringSplit($line, ':')
    ;_ArrayDisplay($array)
    $result = StringTrimLeft($line, 47)
    _ExcelWriteCell($oExcel, $result, $i, 11)
    ;MsgBox(0, "Systemmodell:", "#" & $result & "#")
    EndIf

    Wend
    $i = $i - 1
    FileClose($file)

    [/autoit] [autoit][/autoit] [autoit]

    WEnd
    _ExcelBookClose($oExcel, 1, 0)
    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Vorgehen: durchsuche jede Datei nach den Infos und übergebe sie an Excel in einer schönen Tabelle.
    Läuft aber nicht so ganz, wie ich es möchte. Und ich glaube, meine Schleifen sind auch nicht so toll.
    Hilfe! :D

    Danke im Voraus.

  • Pro Zeile ein Gerät.

    SpalteA1
    Computername

    SpalteB1
    Betriebssystemname

    SpalteC1
    Ursprüngliches Installationsdatum

    SpalteD1
    Systemhersteller

    SpalteE1
    Systemmodell

    Nachdem alle Dateien abgearbeitet sind, kann die Exceldatei geschlossen werden.

    Vielen Dank für deine Mühe.

    • Offizieller Beitrag

    War ich schon so lange nicht mehr da? Die Hilfe war auch mal besser.


    He he ;) nur nicht zu Sachen hinreißen lassen, die du später bereust. :P
    Du hast doch sicher schon bemerkt, dass 90% der Excel-Fragen von mir beantwortet werden, anscheinend verlassen sich da auch die andren drauf. :D
    Und ich habe deinen Thread erst heute auf dem Schirm (manchmal hat man auch noch andere Dinge zu tun :whistling: ).
    Ich werde es mir jetzt mal anschauen. Ich hoffe du kannst solange noch aushalten...


    So, habs dir mal zusammengeschossen ;)

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Excel.au3>
    Local $pathTXT = "PFAD_TXT_DATEI"
    Local $a
    _FileReadToArray($pathTXT, $a)

    [/autoit] [autoit][/autoit] [autoit]

    Local $pathXLS = "PFAD_EXCEL_DATEI"
    Local $oExcel = _ExcelBookNew(0) ; oder _ExcelBookOpen(), falls vorhanden

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $a[0]
    Select
    Case StringInStr($a[$i], 'Hostname:', 1)
    $ret = StringRegExp($a[$i], '(?:: )(\w+)', 1)
    $oExcel.Range("A1").Value = $ret[0]
    Case StringInStr($a[$i], 'Betriebssystemname:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w ]+)', 1)
    $oExcel.Range("B1").Value = $ret[0]
    Case StringInStr($a[$i], 'Ursprüngliches Installationsdatum:', 1)
    $ret = StringRegExp($a[$i], '(?:: )(\d{2}\.\d{2}\.\d{4}, \d{2}:\d{2}:\d{2})', 1)
    $oExcel.Range("C1").Value = $ret[0]
    Case StringInStr($a[$i], 'Systemhersteller:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w .-]+)', 1)
    $oExcel.Range("D1").Value = $ret[0]
    Case StringInStr($a[$i], 'Systemmodell:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w .-]+)', 1)
    $oExcel.Range("E1").Value = $ret[0]
    ExitLoop
    Case Else
    ContinueLoop
    EndSelect
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ExcelBookSaveAs($oExcel, $pathXLS) ; oder _ExcelBookSave($oExcel), falls Datei vorhanden
    _ExcelBookClose($oExcel)

    [/autoit]
  • Super. Toller Ansatz! Vielen Dank BugFix.

    Aber noch nicht für mich fertig.
    Ich habe es angepasst. Denn ich habe viele TXT-Dateien, die abgearbeitet werden. Daher habe ich das, was super von dir ist, in eine Funktion gepackt und eine While-Schleife eingebaut. Somit werden alle TXT im Ordner abgearbeitet.
    Aber nun scheiter es wieder bei Excel. Soll ja geöffnet werden und jede neue Zeile ist ein neuer Client/TXT-Datei. Kannst du mir da bitte helfen, dass die Infos nicht überschrieben werden und in neue Zeilen geschrieben werden?

    Vielen Dank im Voraus!

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>
    #include <Excel.au3>
    Local $b

    [/autoit] [autoit][/autoit] [autoit]

    $FileList = _FileListToArray("S:\Test\")
    $b = $FileList[0]

    [/autoit] [autoit][/autoit] [autoit]

    While $b > 0

    Local $pathTXT = "S:\Test\" & $FileList[$b]
    Local $a

    [/autoit] [autoit][/autoit] [autoit]

    _FileReadToArray($pathTXT, $a)

    [/autoit] [autoit][/autoit] [autoit]

    Local $pathXLS = "S:\"
    Local $oExcel = _ExcelBookOpen("S:\test.xls")

    [/autoit] [autoit][/autoit] [autoit]

    EXCEL()

    [/autoit] [autoit][/autoit] [autoit]

    $b = $b - 1
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    Func EXCEL()
    For $i = 1 To $a[0]
    Select
    Case StringInStr($a[$i], 'Hostname:', 1)
    $ret = StringRegExp($a[$i], '(?:: )(\w+)', 1)
    $oExcel.Range("A1").Value = $ret[0]
    Case StringInStr($a[$i], 'Betriebssystemname:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w ]+)', 1)
    $oExcel.Range("B1").Value = $ret[0]
    Case StringInStr($a[$i], 'Ursprüngliches Installationsdatum:', 1)
    $ret = StringRegExp($a[$i], '(?:: )(\d{2}\.\d{2}\.\d{4}, \d{2}:\d{2}:\d{2})', 1)
    $oExcel.Range("C1").Value = $ret[0]
    Case StringInStr($a[$i], 'Systemhersteller:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w .-]+)', 1)
    $oExcel.Range("D1").Value = $ret[0]
    Case StringInStr($a[$i], 'Systemmodell:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w .-]+)', 1)
    $oExcel.Range("E1").Value = $ret[0]
    ExitLoop
    Case Else
    ContinueLoop
    EndSelect
    Next
    _ExcelBookSave($oExcel)
    _ExcelBookClose($oExcel)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]
    • Offizieller Beitrag

    Kannst du mir da bitte helfen, dass die Infos nicht überschrieben werden und in neue Zeilen geschrieben werden?


    Na klar. ;)
    Zum Arbeiten in Schleifen gibt es die geniale Möglichkeit mit Offset zu arbeiten. Somit erspart man sich das mühselige Addressieren anhand Spalte/Zeile mit evtl. Umrechnen etc.
    Mit Offset erreicht man eine relative Addressieung vom Startrange aus. Die Startrange selber wäre Offset(0,0). Es wird adressiert: Offset(+/- Zeilen, +/- Spalten).
    So läufts:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    #include <Excel.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $FileList = _FileListToArray("S:\Test\")
    If @error Then Exit MsgBox(0, 'Fehler', 'Dateiliste konnte nicht gelesen werden!')
    Local $a, $pathTXT, $oExcel = _ExcelBookOpen("S:\test.xls")
    Local $lastLine = $oExcel.Worksheets(1).UsedRange.Rows.Count
    If $lastLine = 1 And $oExcel.Range("A1").Value = '' Then $lastLine = 0 ; Tabelle noch leer

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $FileList[0]
    $pathTXT = "S:\Test\" & $FileList[$i]
    _FileReadToArray($pathTXT, $a)
    If @error Then ContinueLoop
    EXCEL($a, $lastLine +$i)
    Next
    _ExcelBookSave($oExcel)
    _ExcelBookClose($oExcel)
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func EXCEL(ByRef $a, $iLine)
    For $i = 1 To $a[0]
    Select
    Case StringInStr($a[$i], 'Hostname:', 1)
    $ret = StringRegExp($a[$i], '(?:: )(\w+)', 1)
    $oExcel.Range("A1").Offset($iLine -1, 0).Value = $ret[0]
    Case StringInStr($a[$i], 'Betriebssystemname:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w ]+)', 1)
    $oExcel.Range("B1").Offset($iLine -1, 0).Value = $ret[0]
    Case StringInStr($a[$i], 'Ursprüngliches Installationsdatum:', 1)
    $ret = StringRegExp($a[$i], '(?:: )(\d{2}\.\d{2}\.\d{4}, \d{2}:\d{2}:\d{2})', 1)
    $oExcel.Range("C1").Offset($iLine -1, 0).Value = $ret[0]
    Case StringInStr($a[$i], 'Systemhersteller:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w .-]+)', 1)
    $oExcel.Range("D1").Offset($iLine -1, 0).Value = $ret[0]
    Case StringInStr($a[$i], 'Systemmodell:', 1)
    $ret = StringRegExp($a[$i], '(?:: )([\w .-]+)', 1)
    $oExcel.Range("E1").Offset($iLine -1, 0).Value = $ret[0]
    ExitLoop
    Case Else
    ContinueLoop
    EndSelect
    Next
    EndFunc

    [/autoit]
  • Hallo BugFix,

    vielen Dank aber irgendwie stimmt was nicht. Ich versteh den Fehler nicht ganz.
    Bei deinem Script erhalte ich die Meldung:

    (26) : ==> Subscript used with non-Array variable.:
    $oExcel.Range("A1").Offset($iLine -1, 0).Value = $ret[0]
    $oExcel.Range("A1").Offset($iLine -1, 0).Value = $ret^ ERROR

    Wenn ich [0] bei $ret entferne, werden alle Spalten gefüllt, jedoch die erste und die dritte hat als Ergebnis 0.

    Vielen Dank für deine Mühe.

    • Offizieller Beitrag

    Fehler betrifft Zeile 26, dort wird 'Hostname:' abgefragt. Es kann nun sein, dass deine Hostnamen aus anderen als die in der Gruppe "\w" enthaltenen Zeichen bestehen.
    Ich bin von deiner Vorlage ausgegangen.
    Ändere mal die Zeile 25 zu

    [autoit]

    $ret = StringRegExp($a[$i], '(?:: )(.+)', 1)

    [/autoit]

    Damit sollten auch die abenteuerlichsten Hostnamen erkannt werden.