String Verarbeitung

  • Hey,

    habe folgendes Problem mit dieser Datei:
    Inhalt vom Anhang:
    CI;CI-ID;Materialnr;Beschreibung;ServiceKlasse;Staus;xx;xx;xx;xx;xx;xx;xx;xx;xx:xx;Hostname;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;
    ;00001;d000002;IBM T41;Workstaion Mobile;Aktiv;xx;xx;xx;xx;xx;xx;xx;xx;xx:xx;PC010xxxx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;
    ;00002;d000011;Dell;Workstaion;Deaktiviert;xx;xx;xx;xx;xx;xx;xx;xx;xx:xx;MPC010xxxx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;
    ;00011;d00033;HP;Workstaion Mobile;Aktiv;xx;xx;xx;xx;xx;xx;xx;xx;xx:xx;PC010xxxx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;
    ;00031;d00066;Lenovo;Workstaion Mobile;Aktiv;xx;xx;xx;xx;xx;xx;xx;xx;xx:xx;PC010xxxx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;
    ;00041;d00077777;ASUS;Workstaion Mobile;Aktiv;xx;xx;xx;xx;xx;xx;xx;xx;xx:xx;PC010xxxx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;xx;

    Ich möchte in dieser datei Alle Hostnamen Suchen die mit "PC010" beginnen und den Status Aktiv haben.
    Und anschliessend Alle gleichen Typen zäheln
    Also ungefähr so sollte das ergebniss sein;

    IBM T41 Ative Clients Anzahl 300
    Dell Ative Clients Anzahl 100
    HP Ative Clients Anzahl 1351

    Hat jemand eine idee oder vorschlag wie ich das machen kann?

    Dateien

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    Einmal editiert, zuletzt von subzero007 (6. Dezember 2010 um 11:14)

  • Bevor man damit arbeiten kann, musst du erstmal die Rechtschreibung in deiner Datei durchsetzen, das ist ja grauenhaft.
    Staus, Workstaion, Ative .... oder soll das so sein?

  • Sorry,
    Das ist ja grauenhaft ;(
    war wohl noch zu früh und hatte keinen kaffe und stand im stau ;)
    Staus = Status
    Workstaion = Workstation
    Aktiv = Aktiv

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    Einmal editiert, zuletzt von subzero007 (6. Dezember 2010 um 11:40)

  • ich habe schonmal angefangen aber komme nicht weiter,
    Ich meine sogar das mein ansatz sogar falsch ist.
    Hat jemand eine idee wie man das lösen kann,
    komme absolut nicht weiter.........


    [autoit]

    Func _suchestring($string, $suche)
    Local $file = 'beispiel.csv'
    _FileReadToArray($file, $arfile)
    For $i = 1 To UBound($arfile) - 1
    $temp = StringSplit($arfile[$i], ";")
    ; _ArrayDisplay($temp)
    ;consolewrite($temp[18]&" "&$listviewtext&@CRLF)
    If $temp[17] = $ListViewText Then
    $besitzer = $temp[8]
    $hostincsveingetragen = 1
    EndIf

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

    Next
    EndFunc

    [/autoit]

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <File.au3>
    Dim $aResult[1][2]
    $sFile = @ScriptDir & "\test.txt"

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

    For $i = 2 To _FileCountLines($sFile)
    $sLine = FileReadLine($sFile, $i)
    ConsoleWrite($sLine & @CRLF)
    If StringInStr($sLine, "PC010", 1) And StringInStr($sLine, "Aktiv", 1) Then
    $aTmp = StringSplit($sLine, ";", 1)
    If IsArray($aTmp) And $aTmp[0] = 30 Then
    $iIndex = _ArraySearch($aResult, $aTmp[4], 0, 0, 1, 0, 1, 0)
    If $iIndex = -1 Then
    _Array2DAdd($aResult, $aTmp[4] & "|1")
    ElseIf $iIndex >= 0 Then
    $aResult[$iIndex][1] += 1
    EndIf
    EndIf
    EndIf
    Next

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

    _ArrayDisplay($aResult)

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

    ;------------------------------------------------------------------------------------------------------------
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='')
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element, parts must be seperate with '|'
    ;
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    Func _Array2DAdd(ByRef $avArray, $sValue = '')
    If (Not IsArray($avArray)) Then
    SetError(1)
    Return 0
    EndIf
    Local $i
    Local $UBound2nd = UBound($avArray, 2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray) + 1]
    $avArray[UBound($avArray) - 1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray) + 1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd - 2
    $sValue &= '|'
    Next
    EndIf
    $arValue = StringSplit($sValue, '|')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd - 1
    $avArray[UBound($avArray) - 1][$i] = $arValue[$i + 1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

    [/autoit]
  • Hier mal ohne 2D Array

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    $sFile = @ScriptDir & "\test.txt"
    $sSeparator = " Clients Anzahl "

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

    $sRead = FileRead($sFile)

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

    $aRead = StringRegExp($sRead, '.*;(.*);(.*);(.*);(.*);(Aktiv*);.*;(PC010.*);.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*', 3)

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

    Dim $aResult[1]

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

    For $i = 0 to UBound($aRead) - 1 Step 6
    $iFound = _ArraySearch($aResult, $aRead[$i + 2], 0, 0, 0, 1)
    If $iFound < 0 Then
    _ArrayAdd($aResult, $aRead[$i + 2] & " " & $aRead[$i + 4] & $sSeparator)
    $iFound = UBound($aResult)-1
    EndIf

    $iAnzahl = StringTrimLeft($aResult[$iFound],StringInStr($aResult[$iFound], $sSeparator) + 15)
    $aResult[$iFound] = StringLeft($aResult[$iFound],StringInStr($aResult[$iFound], $sSeparator) + 15) & $iAnzahl+1

    Next
    $aResult[0] = UBound($aResult) - 1
    _ArrayDisplay($aResult)

    [/autoit]

    EDIT:
    Hier mal mit Variablen um es besser zu Filtern:
    man kann es natürlich noch weiter verbessern aber hier haste mal nen Ansatz

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    $sFile = @ScriptDir & "\test.txt"
    $sSeparator = " Clients Anzahl "

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

    ;Ab hier sind die Filter zu setzen:
    $sStatus = "Aktiv"
    $sHost = "PC010"
    $CI = ""
    $CIID = ""
    $Materialnr = ""
    $Beschreibung = ""
    $ServiceKlasse = ""
    ;Ende der Filter

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

    $sRead = FileRead($sFile)

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

    $aRead = StringRegExp($sRead, $CI & '.*;('& $CIID &'.*);('& $Materialnr &'.*);('& $Beschreibung &'.*);('& $ServiceKlasse & '.*);('& $sStatus &');.*;('& $sHost &'.*);.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*', 3)

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

    Dim $aResult[1]

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

    For $i = 0 to UBound($aRead) - 1 Step 6
    $iFound = _ArraySearch($aResult, $aRead[$i + 2], 0, 0, 0, 1)
    If $iFound < 0 Then
    _ArrayAdd($aResult, $aRead[$i + 2] & " " & $aRead[$i + 4] & $sSeparator)
    $iFound = UBound($aResult)-1
    EndIf

    $iAnzahl = StringTrimLeft($aResult[$iFound],StringInStr($aResult[$iFound], $sSeparator) + 15)
    $aResult[$iFound] = StringLeft($aResult[$iFound],StringInStr($aResult[$iFound], $sSeparator) + 15) & $iAnzahl+1

    Next
    $aResult[0] = UBound($aResult) - 1
    _ArrayDisplay($aResult)

    [/autoit]

    2 Mal editiert, zuletzt von Kijan (6. Dezember 2010 um 13:45)

  • Danke für die Unterstützung:
    habe noch eine oder zwei fragen ;)

    so sieht mein Array aus:
    [0]||
    [1]|IGEL THINCLIENT 3210 LX, LINUX, 533MHZ,|14
    [2]|HP COMPAQ 2510P/ULTRALIGHT/1,2GHZ/1GB/80GB/12,1"|68
    [3]|FSC ESPRIMO P5625 HE-TOWER ATH.64 X2/2GB/80GB/DVD|229
    [4]|LENOVO M58 HE-TOWER/E8400/4GB/160GB/DVD-BRENNER|35
    [5]|IBM THINKPAD T61/T7500-2,2GHZ/2GB/160/DVD-RW/15,4"|150
    [6]|FTS ESPRIMO P5731 TOWER/E5500/4GB/250GB/DVD-LW|49
    [7]|FSC SCENIC W600 PWR TOWER PIV 2.8GHZ/512MB/40GB|579
    [8]|LENOVO TP T500/P8600-2,4GHZ/4GB/160/DVD-RW/15,4"|56
    [9]|VMWARE PC (VIRTUELL)|6
    [10]|IBM THINKPAD T41,P-M 1,6GHZ/512MB/40GB/14"/BLUETOO|1
    [11]|FSC ESPRIMO E5915 DESKTOP C3,3GHZ/1GB/80GB/DVD|26
    [12]|FSC CELSIUS W340 TOWER PIV 3.0GHZ/1GB/40GB/DVD|10
    [13]|HP XW8600 WORKSTATION/XEON 3,0GHZ/8GB/146GB/FX1700|10
    [14]|FSC ESPRIMO P5915 TOWER D820 2X2,8GHZ/1GB/80GB/DVD|55
    [15]|HP XW8400 WORKSTATION/XEON 3,0GHZ/8GB/146GB|84
    [16]|IBM THINKPAD T43,P-M2,0GHZ/1GB/80GB/14"/DVD-WRITER|18
    [17]|COMPAQ D510CMT TOWER/DESKT,C 1,7GHZ/256MB/40GB/DVD|5
    [18]|IBM THINKPAD T41,P-M 1,6GHZ/512MB/40GB/14"/|5
    [19]|IBM THINKPAD T42,P-M1,7GHZ/512MB/60GB/15"/CDRW/DVD|2
    [20]|IGEL THINCLIENT 332, 400MHZ CPU, 64MB RAM, LINUX|15
    [21]|DELL PRECISION T5500 WS/2X-E5530/12GB/600GB/FX5800|7
    [22]|SNI SCENIC XB PIII 800, DESKTOP, 256/10GB,SOUND,CD|2
    [23]|DELL PRECISION T5500 WS/1X-E5630/12GB/300GB/FX3800|1
    [24]|FSC SCENIC N300 DESKTOP C 2.6GHZ/512MB/40GB/DVD|13
    [25]|IBM THINKPAD T40|1
    [26]|FSC ESPRIMO P5616 HE-TOWER ATH.64 X2/2GB/80GB/DVD|11
    [27]|FSC ESPRIMO P5905 TOWER C2.93GHZ/1GB/160GB/DVD|13
    [28]|SNI SCENIC L PIV 1,5GHZ, TOWER, 256/40GB,SOUND,DVD|2
    [29]|COMPAQ N610C NOTEBOOK,P IV 1,8GHZ/256MB/20GB/14,1"|6
    [30]|IGEL THINCLIENT 3200 LCX COMPACT, LINUX, 533MHZ,|5
    [31]|HP 8510W/NB-WS/T7700/4GB/120GB/COMBO-DVD/CD-RW|5
    [32]|HP DIGITAL SENDER MODELL 9100C, 10 BASE-T|1
    [33]|LENOVO TP T500/P8400-2,2GHZ/4GB/160/DVD-RW/15,4"|2
    [34]|FSC SCENIC L TOWER PIV 2GHZ, 1GB/40GB, DVD-R|2


    Jetzt wollte ich das 2D Array durchsuchen und falls vorhanden die werte wie folgt anhand der Beipiel ini in einem Ordner Schreiben.
    GUID sollte die Datei genannt werden und in der Datei sollte dann die Anzahl.
    Ich wollte das Ganze Variabel Gestalten anhand der folgender INI.

    Beispiel ini:
    [Reports]
    Ordner=c:\test\reports
    [HWTyp-GUID]
    HP COMPAQ 2510P/ULTRALIGHT/1,2GHZ/1GB/80GB/12,1=B89BD56C-102C-4659-A172-4E00EC2D80F4
    FSC SCENIC W600 PWR TOWER PIV 2.8GHZ/512MB/40GB=2EF17A45-9DB2-4871-8AB8-BBEA55C2DBE2
    IBM THINKPAD T40=A7A8E459-F128-4F40-848A-87EB9CE4E634


    es sollten dann folgende dateien erstellt werden Unter "c:\test\reports":
    B89BD56C-102C-4659-A172-4E00EC2D80F4.log mit folgendem inhalt 68
    2EF17A45-9DB2-4871-8AB8-BBEA55C2DBE2.log mit folgendem inhalt 579
    A7A8E459-F128-4F40-848A-87EB9CE4E634.log mit folgendem inhalt 1

    Viellen Dank im Vorraus....

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <File.au3>
    Dim $aResult[1][2]
    $sFile = @ScriptDir & "\Alle-CI-Topcon.csv"

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

    For $i = 2 To _FileCountLines($sFile)
    $sLine = FileReadLine($sFile, $i)
    ;ConsoleWrite($sLine & @CRLF)
    If StringInStr($sLine, "PC010", 1) And StringInStr($sLine, "Aktiv", 1) Then
    $aTmp = StringSplit($sLine, ";", 1)
    If IsArray($aTmp) And $aTmp[0] = 30 Then
    $iIndex = _ArraySearch($aResult, $aTmp[4], 0, 0, 1, 0, 1, 0)
    If $iIndex = -1 Then
    _Array2DAdd($aResult, $aTmp[4] & "|1")
    ElseIf $iIndex >= 0 Then
    $aResult[$iIndex][1] += 1
    EndIf
    EndIf
    EndIf
    Next

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

    _ArrayDisplay($aResult)

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

    ;------------------------------------------------------------------------------------------------------------
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='')
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element, parts must be seperate with '|'
    ;
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    Func _Array2DAdd(ByRef $avArray, $sValue = '')
    If (Not IsArray($avArray)) Then
    SetError(1)
    Return 0
    EndIf
    Local $i
    Local $UBound2nd = UBound($avArray, 2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray) + 1]
    $avArray[UBound($avArray) - 1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray) + 1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd - 2
    $sValue &= '|'
    Next
    EndIf
    $arValue = StringSplit($sValue, '|')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd - 1
    $avArray[UBound($avArray) - 1][$i] = $arValue[$i + 1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

    [/autoit]

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Hey,
    diese value`s holle ich aus einem anderen system die ich mit meinen Zahlen füttern möchte.
    SQLite würde ich ja gerne nehmen weiss aber nicht wie ....
    Könnt ihr mir helfen?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    Einmal editiert, zuletzt von subzero007 (7. Dezember 2010 um 14:40)

  • Bin Gerade Dabei es mit

    [autoit]

    _ArrayFindAll

    [/autoit]

    zu lösen aber komme ich nicht weiter.
    hat jemand eine idee oder einen vorschlag?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <array.au3>
    #include <File.au3>
    #include <SQLite.au3>
    Global $sIni = @ScriptDir & "\data.ini"
    Global $sFile = @ScriptDir & "\test.txt"
    If Not FileExists($sIni) Then IniWrite($sIni, "Reports", "Ordner", @ScriptDir & "\reports")
    Global $sReports = IniRead($sIni, "Reports", "Ordner",@ScriptDir & "\reports")
    If Not FileExists($sReports) Then DirCreate($sReports)
    Dim $aResult[1][2]
    Dim $aGUID[5][2] = [["IBM T41","B89BD56C-102C-4659-A172-4E00EC2D80F4"], _
    ["Dell","2EF17A45-9DB2-4871-8AB8-BBEA55C2DBE2"], _
    ["HP","A7A8E459-F128-4F40-848A-87EB9CE4E634"], _
    ["Lenovo","8DE17A45-9DB2-4871-8AB8-BBEA55C2DBE2"], _
    ["ASUS","599BD56C-102C-4659-A172-4E00EC2D80F4"]]

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

    For $i = 2 To _FileCountLines($sFile)
    $sLine = FileReadLine($sFile, $i)
    ;ConsoleWrite($sLine & @CRLF)
    If StringInStr($sLine, "PC010", 1) And StringInStr($sLine, "Aktiv", 1) Then
    $aTmp = StringSplit($sLine, ";", 1)
    If IsArray($aTmp) And $aTmp[0] = 30 Then
    $iIndex = _ArraySearch($aResult, $aTmp[4], 0, 0, 1, 0, 1, 0)
    If $iIndex = -1 Then
    _Array2DAdd($aResult, $aTmp[4] & "|1")
    ElseIf $iIndex >= 0 Then
    $aResult[$iIndex][1] += 1
    EndIf
    EndIf
    EndIf
    Next
    For $i = 1 To UBound($aResult)-1
    $index = _ArraySearch($aGUID, $aResult[$i][0])
    If Not @error Then
    IniWrite($sIni, "HWTyp-GUID", $aResult[$i][0], $aGUID[$index][1])
    $tmp = FileOpen($sReports & "\" & $aGUID[$index][1],2)
    FileWrite($tmp,$aResult[$i][1])
    FileClose($tmp)
    Else
    MsgBox(0,0,"Keine GUID für " & $aResult[$i][0] & " gefunden")
    EndIf
    Next
    _ArrayDisplay($aResult)
    _ArrayDisplay($aResult)

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

    ;------------------------------------------------------------------------------------------------------------
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='')
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element, parts must be seperate with '|'
    ;
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    Func _Array2DAdd(ByRef $avArray, $sValue = '')
    If (Not IsArray($avArray)) Then
    SetError(1)
    Return 0
    EndIf
    Local $i
    Local $UBound2nd = UBound($avArray, 2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray) + 1]
    $avArray[UBound($avArray) - 1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray) + 1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd - 2
    $sValue &= '|'
    Next
    EndIf
    $arValue = StringSplit($sValue, '|')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd - 1
    $avArray[UBound($avArray) - 1][$i] = $arValue[$i + 1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

    [/autoit]
    &quot;Quelle&quot;


    Das wäre eine mögliche Umsetzung deiner ini Variante. Die GUIDs werden aus $aGUID[] gelesen, das musst du dann möglicherweise anpassen. Ab Zeile 36 wird die Menge in die Datei geschrieben. Der alte Inhalt wird gelöscht. Wenn du mehrere Dateien nacheinder verarbeitest, musst du dort evtl. den alten Dateiinhalt mit der neu ermittelten Menge adieren.

  • Ich würde vorschlagen, dass du eine komplette Liste lieferst, da ansonsten die Hilfe sehr schwer wird.

    Wenn da vertrauliche Daten stehen, dann die durch irgend etwas ersetzen.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯