UDF _FileFindChar

  • moin moin,
    ich habe hier mal meine 1. selbstgebaute UDF xD kann sein dass es sowas schon gibt bzw. dass man das ganze vieeeeel einfacher hätte machen können aber es funktioniert auf jeden fall und ich kanns gut gebrauchen :D

    Spoiler anzeigen
    [autoit]

    #include
    #include
    Func _FileCountDefCharacters($file, $character)
    Dim $array
    _FileReadToArray( $file, $array)
    $result = 0
    For $i = 1 To $array[0]
    $start = 1
    While 1
    $littlestring = StringMid($array[$i], $start)
    $stringsearch = StringInStr ( $littlestring, $character)
    If $stringsearch <> 0 Then
    $result = $result + 1
    $start = $stringsearch + $start
    Else
    ExitLoop
    EndIf
    WEnd
    Next
    Return $result
    EndFunc

    [/autoit]


    ja ich weiß sehr klein und so aber es erspart ne menge tamtam :P
    einfach die file includen und dann kann man die Funktion
    _FileCountDefCharacters($file, $character)
    benutzen man erhält dann ein eine Zahl (gefundene Zeichen/Zeichenketten) als ergebnis :)
    Muss da noch was zwingend dazu oder reicht das so, oder ist es einfach nur totaler quatsch? ^^

    • Offizieller Beitrag

    Es ist sehr umständlich und langsam.
    Du hattest doch danach schonmal in der Shoutbox gefragt, oder?
    Zumindest kann ich mich an den Tipp von Xeno erinnern, ich habe es hier mal umgesetzt:

    [autoit]

    Func _CountChar($FILE, $CHAR=' ')
    If Not FileExists($FILE) Then Return MsgBox(0, '', 'keine gültige Datei')
    Local $fh = FileOpen($FILE, 0)
    Local $var = StringReplace(FileRead($fh), $CHAR, $CHAR)
    Local $count = @extended
    FileClose($fh)
    Return $count
    EndFunc

    [/autoit]
  • ok; das habe ich schonmal gefragt???? ... lol naja kann mich nicht erinnern :P
    also ich habe das grade mal mit einer server.log (4MB) ausprobiert hat eig. net lang gedauert 2,31 sec ^^
    und mit deinem 1,2 sec GUUUT DU HAST GEWONNEN :D
    ich habe aber trotzdem (schon vorher) eine weitere Funtkion gemacht, diese sucht auch nach einer zeichenkette und gibt diese zusätzlich zur Position (Zeile, Zeichen von - bis) in einem array zurück... kann man das auch noch vereinfachen?

    Spoiler anzeigen
    [autoit]

    #include
    #include
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _FileCountDefCharacters
    ; Description ...: Returns the number of defined characters.
    ; Syntax.........: _FileCountDefCharacters($file, $character)
    ; Parameters ....: $file - Path & Name of the File to Read.
    ; $character - Character or Characters you want to Count
    ; Return values .: Success - Returns the number of the defined characters
    ; Failure - Returns 0
    ; Author ........: FireFlyer
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......; No
    ; ===============================================================================================================================
    Func _FileCountDefCharacters($file, $character)
    Dim $array
    _FileReadToArray( $file, $array)
    $result = 0
    For $i = 1 To $array[0]
    $start = 1
    While 1
    $littlestring = StringMid($array[$i], $start)
    $stringsearch = StringInStr ( $littlestring, $character)
    If $stringsearch <> 0 Then
    $result = $result + 1
    $start = $stringsearch + $start
    Else
    ExitLoop
    EndIf
    WEnd
    Next
    Return $result
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _FileFindDefCharacters
    ; Description ...: Returns the Character/Position and Number of Results of defined characters.
    ; Syntax.........: _FileFindDefCharacters($file, $search[, $showcount][, $lineachar][, $text])
    ; Parameters ....: $file - Path & name of the file to read.
    ; $search - The word or characters to search.
    ; $showcount - 1 [The number of results will be shown at last] ; 0 (Default) [No number will be shown]
    ; $linechar - 1 [The position of the founded text will be shown] ; 0 (Default) [No position will be shown]
    ; $text - 1 [Additional text will be shown (Example: Line: 3)] ; 0 (Default) [No text will be shown (Example: 3)]
    ; Return values .: Success - Returns an Array with the $search and possible additional: Count; Position; Text
    ; Failure - Returns 0
    ; Author ........: FireFlyer
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......; No
    ; ===============================================================================================================================
    Func _FileFindDefCharacters($file, $search, $showcount = 0, $lineachar = 0, $text = 0)
    Dim $array2, $resarray
    $resarray = _ArrayCreate("Results:")
    $count = StringLen($search)
    _FileReadToArray( $file, $array2)
    $result = 0
    For $i = 1 To $array2[0]
    $start = 1
    While 1
    $littlestring = StringMid($array2[$i], $start)
    $stringsearch = StringInStr ( $littlestring, $search)
    If $stringsearch <> 0 Then
    If $lineachar = 1 Then
    If $text = 1 Then
    _ArrayAdd( $resarray, $search)
    _ArrayAdd( $resarray, "Line: "&$i)
    _ArrayAdd( $resarray, "From: "&$stringsearch&" To: "&$stringsearch + $count)
    Else
    _ArrayAdd( $resarray, $search)
    _ArrayAdd( $resarray, $i)
    _ArrayAdd( $resarray, $stringsearch&";"&$stringsearch + $count)
    Endif
    Else
    _ArrayAdd( $resarray, $search)
    EndIf
    $start = $stringsearch + $start + $count
    $result = $result + 1
    Else
    ExitLoop
    EndIf
    WEnd
    Next
    If $showcount = 1 Then
    If $text = 1 Then
    _ArrayAdd( $resarray, "Objects found: "&$result)
    Else
    _ArrayAdd( $resarray, $result)
    EndIf
    EndIf
    Return ($resarray)
    EndFunc

    [/autoit]

    Achso ja und eig. ist das ganze auch eher für meinen Biotechunterricht gedacht um .fasta dateien zu durchsuchen :) die haben meist nur eine Zeile genetischen Code :) , die machen das ganze mit PEARL *wäääh* ich durfte mir zum glück autoit aussuchen wo man wenigstens noch schöne GUI machen kann :D und net son komisches DOS-Fenster hat ^^ :P

    • Offizieller Beitrag

    Grundlegender Tipp für UDF: Versuche solche Funktionen zu verwenden, dass du keine Includes verwenden mußt.
    Bsp. Statt _ArrayAdd() das Array mit ReDim verändern.

    Hier mal meine Lösung (nur aus dem Kopf, ungetestet), Rückgabe Array. An Array[0] wird die Anzahl der Zeichen zurückgegeben. Jedes folgende Arrayelement enthält eine gefundene Position in der Schreibart: "Dateizeile,Spalte"

    Spoiler anzeigen
    [autoit]

    Func _GetPosOfChar($FILE, $CHAR=' ')
    If Not FileExists($FILE) Then Return MsgBox(0, '', 'keine gültige Datei')
    Local $arOut[1]=[0]
    Local $i = 1
    While 1
    $tmp = FileReadLine($FILE, $i)
    If @error Then ExitLoop
    $var = StringSplit($tmp, '')
    If Not @error Then
    For $k = 1 To UBound($var)-1
    If $var[$k] == $CHAR Then
    ReDim $arOut[UBound($arOut)+1]
    $arOut[UBound($arOut)-1] = $i & ',' & $k
    $arOut[0] += 1
    EndIf
    Next
    EndIf
    $i += 1
    WEnd
    Return $arOut
    EndFunc

    [/autoit]
  • krass seit wann machst du das????
    ich seit nem 4tel jahr... ^^ ... und auch nur eher selten wegen abi und so :)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • hmm ja ich wie gesagt seit 3-4 monaten und davor nur mal en paar websiten mit javascript gemacht ansonsten keine ahnung von programmieren :)

    aber weisst du vielleicht dazu was?: Nachprüfen wie viel Speicher (Arbeitsspeicher & Auslagerungsdatei) ein Prozess gerade verwendet
    Also wie man die physische Speicherauslastung eines Prozesses herausliest geht ja ohne Probleme mit der neuen Version...
    Aber wie lese ich die virtuelle Speicherauslastung aus??? *blub* ich brauche nämlich eine Summe von beidem ;)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    Einmal editiert, zuletzt von FireFlyer (12. Januar 2008 um 03:23)