Textdatei erste Zeile entfernen

  • Guten Morgen liebe Autoit-Gemeinde!

    Ich habe eine Frage, die mir schon seit 2 Tagen Kopfzerbrechen bereitet...

    Unzwar versuche ich vom Exchange per Powershell Skript die aktuellen Gesamtpostfachverbräuche herauszulesen.
    Das klappt auch eigentlich soweit prima. es kommt zumindest was heraus... (siehe Anhang1 PG.txt)
    Dann habe ich ein Autoit Script das mir diese Datei wiederum in eine andere Datei konvertiert und es kommt folgendes heraus (siehe Anhang2 PG_konv.txt) Diese ganze prozedur mache ich auch nur, damit ich die Werte per Array in Variablen schreibe um diese dann mit einem FileWrite als INSERT für mysql bereitzustellen.

    [autoit]


    #include <array.au3>
    #include <date.au3>
    #include <String.au3>
    #include <File.au3>
    Dim $hash

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

    $file = FileOpen("C:\PG.txt", 0)
    $file_2 = FileOpen("C:\PG_konv.txt", 2)

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

    while 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $text = StringStripWS($line, 4)
    $text = StringReplace($text, " ", "^")
    $text = StringReplace($text, "B^", "^")
    FileWriteLine($file_2, $text)
    WEnd
    FileClose($file_2)

    FileClose($file)

    [/autoit]

    um das ganze etwas zu verkürzen im ersten Scriptschnipsel das konvertieren
    und im zweiten Scriptschnipsel wie das mit dem INSERT aussieht

    [autoit]


    While 1
    $line = FileReadLine($openEingabe)
    If @error = -1 Then ExitLoop

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

    $hash = StringSplit($line, '^')
    $diskspaceused = $hash[1]
    $dslimit = $hash[2]
    FileWrite($openAusgabe, "INSERT INTO quotas (datum, zeit, domain, user, computer, q_volume, disk_space_used, disk_space_limit, status, warning_limit) ")
    Filewrite($openAusgabe, "VALUES ('" & $datum & "',")
    Filewrite($openAusgabe, "'" & $zeit & "',")
    Filewrite($openAusgabe, "'" & $domain & "',")
    Filewrite($openAusgabe, "'" & $user & "',")
    Filewrite($openAusgabe, "'" & $computer & "',")
    Filewrite($openAusgabe, "'" & $volume & "',")
    Filewrite($openAusgabe, $diskspaceused & ",")
    Filewrite($openAusgabe, $dslimit & ",")
    Filewrite($openAusgabe, $status & ",")
    Filewrite($openAusgabe, $warninglimit & ");" & @CRLF)
    Wend

    [/autoit]


    Natürlich kommen dazwischen noch weitere Werte aber die sind ja nicht wichtig, da diese Code-Schnipsel aus einem Script herüren wo es funktioniert... aber da werden auch keine Leerzeilen am Anfang geschrieben...

    Wie man sieht ist ja in BEIDEN Textdateien direkt in der erste Zeile eine (für mich siehts so aus) Leerzeile.
    Jetzt soll die aber garnicht erst da sein, mit anderen Worten (ja endlich kommt meine Frage) WIE bekomme ich die erste Zeile da weg?

    Grüße Volumeman

    Einmal editiert, zuletzt von Volumeman (18. November 2008 um 12:47)

  • Hi Xeno!

    auf dich ist wenigstens verlass... wie du im Anhang sehen kannst, steht in der ersten Zeil nichts drin...
    die Datei an sich kommt ja aus Powershell

    im Grundgenommen würde oben drüber, über der Leerzeile noch Spalteüberschriften stehen, die ich aber ausblende...
    also müsste es eigentlich eine Leerzeile sein...

    hast du nen Rat parat?

    • Offizieller Beitrag

    Hi,

    du erstellst 2 Dateien in denen jeweils die erste Zeile leer ist. Diese möchtest du löschen, richtig? Vermeiden geht nicht?

    Folgende Möglichkeiten:

    _FileReadToArray und dann _FileWriteFromArray ab Postion X
    oder
    dein while 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    ändern in For $i = DEINE erste ZEILE bis _FileCountLines() und dann FileReadLine( ..., $i)
    oder mit _ReplaceStringInFile den ersten @CRLF löschen
    oder mit dieser alten Funktion von mir mal gucken ob du die Zeile löschen kannst.

    Spoiler anzeigen
    [autoit]

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

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

    _removeLineInFile(@ScriptDir & "\x.txt", "X", 3, 1, 0, 0, "", 0)
    ConsoleWrite('Error: ' & @error & ' || ' & 'Extended: ' & @extended & @CRLF)

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

    ;===============================================================================
    ;
    ; Function Name: _removeLineInFile
    ; Description:: _removeLineInFile
    ; Parameter(s):
    ; 1. $h_path = Path to file
    ; 2. $s_search = string pattern
    ; 3. Opt = 1 Delete/keep line if matches $s_search
    ; Opt = 2 Delete/keep line if starts with $s_search
    ; Opt = 3 Delete/keep line if ends with $s_search
    ; Opt = 4 Delete/keep line if contains $s_search
    ; 4. 0 = not case sensitive (default)
    ; 1 = case sensitive
    ; 5. $i_count = How many occurrances should be deleted
    ; 6. $i_TopDown = 0 (default) search --> 1-end
    ; $i_TopDown = 1 search bottumUp --> end-1
    ; 7. $h_pathNew = "" file will be overwritten
    ; $h_pathNew = ... the result is saved in new path
    ; 8. $i_inEx = 0 delete
    ; $i_inEx = 1 keep
    ;
    ; Requirement(s): #include <File.au3> and #include <Array.au3>
    ; Return Value(s): 1 success
    ; -1 file not found
    ; -2 invalid $opt
    ; -3 invalid path to write
    ; Extented = Number of lines matched
    ; Author(s): th.meger
    ;
    ;===============================================================================
    ;

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

    Func _removeLineInFile($h_path, $s_search, $i_opt = 1, $i_caseSensitive = 0, $i_count = 0, $i_topDown = 0, $h_pathNew = "", $i_inEx = 0)
    Local $i_countFound = 0
    Local $a_FileOne
    Local $a_FileTwo[1]
    Local $a_FileThree[1]

    If $h_pathNew = "" Then $h_pathNew = $h_path
    If $i_count = 0 Then $i_count = -1

    If Not _FileReadToArray($h_path, $a_FileOne) Then Return -1

    _ArrayDelete($a_FileOne, 0) ; do not need the number

    If $i_topDown = 1 Then _ArrayReverse($a_FileOne)

    For $i = 0 To UBound($a_FileOne) - 1
    If $i_countFound <> $i_count Then
    Switch $i_opt
    Case 1
    If $i_caseSensitive = 1 Then
    If $a_FileOne[$i] == $s_search Then
    $i_countFound += 1
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    Else
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    EndIf
    Else
    If $a_FileOne[$i] = $s_search Then
    $i_countFound += 1
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    Else
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    EndIf
    EndIf
    Case 2
    If $i_caseSensitive = 1 Then
    If StringLeft($a_FileOne[$i], StringLen($s_search)) == $s_search Then
    $i_countFound += 1
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    Else
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    EndIf
    Else
    If StringLeft($a_FileOne[$i], StringLen($s_search)) = $s_search Then
    $i_countFound += 1
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    Else
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    EndIf
    EndIf
    Case 3
    If $i_caseSensitive = 1 Then
    If StringRight($a_FileOne[$i], StringLen($s_search)) == $s_search Then
    $i_countFound += 1
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    Else
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    EndIf
    Else
    If StringRight($a_FileOne[$i], StringLen($s_search)) = $s_search Then
    $i_countFound += 1
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    Else
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    EndIf
    EndIf
    Case 4
    If StringInStr($a_FileOne[$i], $s_search, $i_caseSensitive) = 0 Then
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    Else
    $i_countFound += 1
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    EndIf
    Case Else
    Return -2
    EndSwitch
    Else
    If $i_inEx = 0 Then
    _ArrayAdd($a_FileTwo, $a_FileOne[$i])
    _ArrayAdd($a_FileThree, $a_FileOne[$i])
    EndIf
    EndIf
    Next
    _ArrayDelete($a_FileTwo, 0)
    _ArrayDelete($a_FileThree, 0)

    If $i_topDown = 1 Then
    _ArrayReverse($a_FileTwo)
    _ArrayReverse($a_FileThree)
    EndIf

    If $i_inEx = 0 Then
    _FileWriteFromArray($h_pathNew, $a_FileTwo)
    Else
    _FileWriteFromArray($h_pathNew, $a_FileThree)
    EndIf
    SetExtended($i_countFound)
    If @error = 0 Then Return 1
    Return -3
    EndFunc ;==>_removeLineInFile

    [/autoit]

    Mega

  • Hallo

    habe es gerade mit meinem "Replace Parser" getestet

    da Funktioniert es so

    Chr(10) entspricht der "Entertaste"

    Auszug:

    [autoit]

    $FileContent = StringReplace(FileRead($path & $FileList[$i]), Chr(10), '')

    [/autoit]
    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • Hi Volumeman nicht hauen wenn ich falsch liege aber ich glaube mit deiner Funktion entfernst du alle @CRLF aus deiner Datei. Aber schau mal in der Hilfe vieleicht kannst du start und ende Festlegen (start = 0, ende =1) weis es aber net, da ich die Funktion net kenne.

    MfG
    Der_Doc

  • Meine Variante läuft bei mir (löscht halt alle Leerzeilen) ...

    bastel es halt um mit filereadline - musst ja dann nichtmal die ganze Datei durchlaufen, die erste Zeile reicht doch

    anderseits weiß ich ja nicht ob sonst noch Leerzeilen enthalten sind, welche wichtig sind

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • Ich muss diese Thema leider nochmal neu aufrollen, da ich ein Problem mit dem Array habe...

    das Script was ich habe ändert die Textdatei deren Inhalt so aussieht schonmal um...

    Jedoch aus der zweiten Datei wo die oben stehenden "Datensätze" in der Textdatei stehen, ließt er das Array dann nicht ein...

    Eigentlich sollte das Script auch die 1. Zeile, die ja eine Leerzeile ist löschen, aber das funzt auch nicht...

    Zudem habe ich ein Problem, dass der die oben Deklarierten Dateien $file und $file_2 nicht unten im Script "nimmt", deswegen musste ich den statischen Pfad angeben, und das ist Pfui Bah...

    ich komme einfach nicht dahinter WARUM er das so macht...


    [autoit]


    #include <array.au3>
    #include <date.au3>
    #include <String.au3>
    #include <File.au3>
    Dim $hash

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

    $file = FileOpen("c:\PG.txt", 0)
    $file_2 = FileOpen("c:\PG_konv.txt", 2)

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

    ;~ $file_3 = FileOpen("C:\PG_konv.txt", 0)
    ;$yeah = FileReadLine($file)
    ;If @error = -1 Then ExitLoop

    ;~ $result = StringTrimLeft($yeah, 59)
    ;~ MsgBox(0, "String without leftmost 3 characters is:", $result)

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

    while 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $text = StringStripWS($line, 4)
    $text = StringReplace($text, " ", "^")
    $text = StringReplace($text, "B^", "")
    FileWriteLine($file_2, $text)
    WEnd

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

    $fh = FileOpen('c:\PW_konv.txt', 0)
    $content = FileRead($fh)
    FileClose($fh)

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

    FileWrite(FileOpen('c:\PG_konv.txt', 2), StringRegExpReplace($content, @CRLF, '', 1))

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

    FileClose('c:\PG_konv.txt')
    $line_2 = FileReadLine('c:\PG_konv.txt')
    ;~ If @error = -1 Then ExitLoop
    $hash = StringSplit($line_2, '^')
    $user = $hash[1]
    ;~ $bytes = $hash[2]

    FileClose($file)
    FileClose($file_2)

    [/autoit]

    Angehängt habe ich die grunddatei.txt, wie Powershell sie schreibt...
    dann die Datei, wie sie aussieht, wenn das oben stehenden Script durchgelaufen ist.
    und eine Datei wie sie aussehen soll, damit dann das Array was ja auch noch laufen soll, die werte ausspucken sollte... (was ja auch nicht funzt)

    Also eine riesengroße Großraumbaustelle

    EDIT: $bytes = $hash[2] ist natürlich sonst nicht auskommentiert...
    autoit.de/wcf/attachment/3103/

    objDictonary.au3

    Einmal editiert, zuletzt von Volumeman (16. Oktober 2008 um 09:43)

    • Offizieller Beitrag
    [autoit]

    ;FileConvert Volumeman

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

    $fh = FileOpen(@TempDir & '\grunddatei.txt', 0)
    If $fh = -1 Then ConsoleWrite('! ERROR 1' & @CRLF)
    $content = FileRead($fh)
    $re = StringRegExp($content, '\w+', 3)
    FileClose($fh)

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

    $fh = FileOpen(@TempDir & '\grunddatei2.txt', 2)
    If $fh = -1 Then ConsoleWrite('! ERROR 2' & @CRLF)

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

    For $i = 0 To UBound($re)-1 Step 2
    FileWrite($fh, $re[$i] & '^' & StringTrimRight($re[$i + 1], 1) & @CRLF)
    ConsoleWrite($re[$i] & '^' & StringTrimRight($re[$i + 1], 1) & @CRLF)
    Next
    FileClose($fh)

    [/autoit]
  • Woher wusste ich es nur, dass nur du antwortest... (ist aber auch gut so)

    War so dreist dann einfach den Befehl fürs Array dahinter zu klatschen

    [autoit]


    $line_2 = FileReadLine($fh)
    ;~ If @error = -1 Then ExitLoop
    $hash = StringSplit($line_2, '^')
    $user = $hash[1]
    $bytes = $hash[2]

    MsgBox(0,"",$user)

    [/autoit]

    Leider zeigt die Messagebox, nix... :(

    Füge ich $bytes hinzu sagt er einfach nur, Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    außerdem ist mir gerade aufgefallen, wenn jetzt hinter einem Namen kein Wert steht, zieht er die Zeilen zusammen...

    Ungefähr so...

    Code
    mmimi                                                   29390569B                                                  
    versand                                                                                                                
    rweit                                                    15742B
    Code
    mmimi^29390569
    versand^rwelt
    15742B^jfill

    Einmal editiert, zuletzt von Volumeman (16. Oktober 2008 um 10:38)

  • Um es nochmal zu verdeutlichen... es geht sich darum, den verwendeten Speicherplatz eines Exchange in einer Active Directory Domäne auszulesen, dieses geschieht über ein Powershell script, dass dann die Grunddatei.txt erstellt wie sie im Anhang zu sehen ist. Es kann aber auch vorkommen, dass zwar ein "Username" existiert, dieser aber niemals angemeldet war, also daher auch kein Wert für die benutzte Größe existiert, dann bleibt das "Feld" bzw. der Eintrag für B leer... (siehe Grunddatei.txt)

    Um diese Werte jetzt mit dem aktuellen Datum, dem Usernamen, dem verbrauchten Plattenspeicher in eine Mysql zu klatschen brauche ich halt dieses Array und muss aber vorher die Datei in ein "einfachereres" Format bringen, daher halt >>>Username^byteB<<<. dann mit Stringsplit halt ins Array und schon haben die Werte gleich eine Variable, die ich dann wiederum in die mysql übertragen kann...

    Nur es funzt halt nicht...

    Mal hier das Script für das Array wie es für einen Fileserver aussieht, viele Sachen habe ich weggelassen, da es sich eigentlich ja ums Array geht ;)

    [autoit]


    #include <File.au3>
    #include <date.au3>
    #include <String.au3>
    $filenameEingabe = $scriptdir & "\" & $file_eingabe

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

    $openEingabe = FileOpen($filenameEingabe, 0)
    $openAusgabe = FileOpen($scriptdir & "\" & $sql_file, 2)

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

    ; Read in lines of text until the EOF is reached

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

    FileWrite($openAusgabe, "USE kontigente;" & @CRLF)

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

    $datum = _GetTagesDatum(0)
    $zeit = _GetTagesZeit(1)

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

    While 1
    $line = FileReadLine($openEingabe)
    If @error = -1 Then ExitLoop

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

    $hash = StringSplit($line, '^')
    $diskspaceused = $hash[1]
    $dslimit = $hash[2]
    $volume = $hash[3]
    $volume = stringreplace($volume, 'Win32_LogicalDisk.DeviceID="', "")
    $volume = stringreplace($volume, '"', "")
    $status = $hash[4]
    $dummy = stringSplit($hash[5],",")
    $domain = $dummy[1]
    $domain = stringreplace($domain, 'Win32_Account.Domain="', "")
    $domain = stringreplace($domain, '"', "")
    $user = $dummy[2]
    $user = stringreplace($user, 'Name="', "")
    $user = stringreplace($user, '"', "")
    $warninglimit = $hash[6]

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

    FileWrite($openAusgabe, "INSERT INTO quotas (datum, zeit, domain, user, computer, q_volume, disk_space_used, disk_space_limit, status, warning_limit) ")
    Filewrite($openAusgabe, "VALUES ('" & $datum & "',")
    Filewrite($openAusgabe, "'" & $zeit & "',")
    Filewrite($openAusgabe, "'" & $domain & "',")
    Filewrite($openAusgabe, "'" & $user & "',")
    Filewrite($openAusgabe, "'" & $computer & "',")
    Filewrite($openAusgabe, "'" & $volume & "',")
    Filewrite($openAusgabe, $diskspaceused & ",")
    Filewrite($openAusgabe, $dslimit & ",")
    Filewrite($openAusgabe, $status & ",")
    Filewrite($openAusgabe, $warninglimit & ");" & @CRLF)
    Wend
    ; Filewrite($openAusgabe, "quit" & @CRLF)

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

    FileClose($openAusgabe)
    FileClose($filenameEingabe)

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

    sleep(2000)

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

    $fileopen_cmd = FileOpen($scriptdir & "\" & $sql_importfile, 2)

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

    FileWriteLine($fileopen_cmd, $scriptdir & "\" & $mysql_exe & " " & "-h" & " " & $mysql_machine & " " & "-u" & " " & $regread_4 & " " & "-p" & $pass & " " & "<" & " " & $scriptdir & "\" & $sql_file & " " & @CRLF & "Exit" & @CRLF)
    FileClose($fileopen_cmd)

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

    $mysql = $mysql_dir & "\" & $sql_importfile
    If Not FileExists($mysql) Then
    (MsgBox(48, "Achtung", "Die Datei" & " " & $mysql & " " & "existiert nicht!"))
    Exit
    EndIf

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

    runwait($mysql)
    FileDelete($scriptdir & "\" & $sql_importfile)

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

    So schaut die eine Zeile aus in der Textdatei, wo der obere Teil des Scriptes dann das Ding "zerpflügt", also quasi in der While-Schleife

    0^18446744073709551615^Win32_LogicalDisk.DeviceID="C:"^0^Win32_Account.Domain="Server01",Name="Administratoren"^18446744073709551615


    So würde die "neue" Grunddatei.txt aussehen für das neue Script um die es ja eigentlich geht
    objDict_Set_abbrev_calltip.au3

    Einmal editiert, zuletzt von Volumeman (17. Oktober 2008 um 09:33)

  • Ich hoffe Mega schaut hier nochmal rein...

    habe immer noch ein kleines Problem mit dem Programm... bin aber schon ein Stück weiter...

    jetzt habe ich nur noch das Problem, dass wenn das Array auf einen "Leerwert" stößt (also kein Wert herausgelesen werden kann) bricht es ab...
    Nun meine Frage, wie kann ich es machen, dass wenn das Array einen "Leerwert" feststellt, diesen Leerwert einfach durch einen anderen Wert ersetzt, damit dann das Array nicht abbricht sondern weiter läuft...