.txt file 2 werte auslesen

  • Hallo
    Mein prorgamm soll 2 werte auslesen, der erste ist die 237000.01 und der anderre die 91646.21. Den ersten wert findet man ja immer recht leicht raus(erste zeile) doch wie erkläre ich den programm den 2ten wert, er ist nicht fest vorgeschrieben zeilen mäßig, also es kann sein das er erst 100 zeilen später mal kommt. Aber er ist immer niedrieger als die 252000.05, keine ahnung wie ich da ran gehen soll.
    Achja ich hab keine ahnung von auto it, bin froh das ich es grade geschaft hab die neuste txt file auszulesen. :rock:
    mfg Roaand

    Die txt file ist so formatiert:

    237000.01
    248000.02
    249000.03
    250000.04
    252000.05
    91646.21
    90509.32
    90416.54
    90300.12

    • Offizieller Beitrag

    Wird schwirig werden wenn du die Zeile nicht weißt und auch sonst keine Anhaltspunkte liefern kannst.
    Einige Werte sind niedriger als237000.01 .

    Edit: Oder meinst du die 1. Zahl die niedriger als 237000.01 ist?

  • 100
    200
    300
    400
    500
    99 <---- brauch ich
    89
    79
    69

    mh oder ganz einfach er checkt einfach den ersten wert unter 100 ... ja so ist es am besten :D

    4 Mal editiert, zuletzt von Roaand (23. Oktober 2010 um 00:07)

  • Findet den ersten Wert der aus < 5Ziffern> . <2 Ziffern> besteht.

    [autoit]

    #include <array.au3>
    $string = '237000.01' & @crlf & _
    '248000.02' & @crlf & _
    '249000.03' & @crlf & _
    '250000.04' & @crlf & _
    '252000.05' & @crlf & _
    '91646.21' & @crlf & _
    '90509.32' & @crlf & _
    '90416.54' & @crlf & _
    '90300.12'

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

    $aResult = StringRegExp($string, "(\b\d{5}\.\d{2})", 1, 1)
    _ArrayDisplay($aResult)

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

    #cs ### Output ###
    [0] 91646.21[1] 91646.21
    #ce

    [/autoit]

    edit: In etwa so könnte man es machen, wenn man die genaue Länge der Werte nicht kennt. Ich geh hier davon aus, das es immer 2 Stellen nach dem Punkt gibt und immer der erste Wert mit der nächstkleineren Anzahl an "Vorkommastellen" gesucht wird.

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    $string = '237000.01' & @crlf & _
    '248000.02' & @crlf & _
    '249000.03' & @crlf & _
    '250000.04' & @crlf & _
    '252000.05' & @crlf & _
    '91646.21' & @crlf & _
    '90509.32' & @crlf & _
    '90416.54' & @crlf & _
    '90300.12'

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

    ;$firstLineFileReadLine($hFile, 1)
    $firstLine=StringSplit($string, @CRLF, 1)
    $firstLine = $firstLine[1]

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

    $tmp = StringSplit($firstLine, ".", 1)
    $firstGroupLen = StringLen($tmp[1])

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

    For $i = $firstGroupLen To 1 Step -1
    $aResult = StringRegExp($string, "(\b\d{" & $i & "}\.\d{2})", 1, 1)
    If IsArray($aResult) Then
    ConsoleWrite($aResult[0] & @CRLF)
    EndIf
    Next

    [/autoit]
  • ah ok danke ... wie kann ich nur ein teil einer zeile reinladen , bei mir grade bis zum ersten komma?

  • Hallo ich bin es nochmal ... mein programm nimmt auch schon langsam form an... nach viel rumgefluche und so .... das prob ... mit konvertierung klappt zwar ... aber nicht richtig also so sieht die txt file aus:

    price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps,
    250997.0,258.0,1549,32767,1518523977,689,1,False,2010-10-25 00:12:27.000,90,60003760,10000002,30000142,0,

    ich brauch nur den wert price der rest ist mir egal ... wie kann ich den geziehlt auslesen ... und in eine variable reinladen .... wichtig ist auch das er die dezimal stelle mit nimmt.

    vielen vielen dank für eure hilfe
    mfg Roaand

  • [autoit]

    $string = '250997.0,258.0,1549,32767,1518523977,689,1,False,2010-10-25 00:12:27.000,90,60003760,10000002,30000142,0,'
    $aResult = StringSplit($string, ",", 1)
    MsgBox(0, "", "Price: " & $aResult[1])

    [/autoit]

    Natürlich nur unter der Bedingung, das der Wert immer an erster Position in der Zeile steht. Ansonsten müsste man beide Zeilen am Komma splitten und im ersten Array den Index von price suchen.

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    $string1 = 'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,'
    $string2 = '250997.0,258.0,1549,32767,1518523977,689,1,False,2010-10-25 00:12:27.000,90,60003760,10000002,30000142,0,'
    $aResult1 = StringSplit($string1, ",", 1)
    $aResult2 = StringSplit($string2, ",", 1)
    $index = _ArraySearch($aResult1, "price")
    MsgBox(0, "", "Price: " & $aResult2[$index])

    [/autoit]
  • [autoit][/autoit]
    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>

    $aFilelist = _FileListToArray("path")
    Dim $aFiledate[$aFilelist[0]+1]
    For $i = 1 To $aFilelist[0]
    $aFiledate[$i] = FileGetTime("path" & '\' & $aFilelist[$i], 0, 1)
    Next

    $line2=FileReadLine("path" & '\' & $aFilelist[_ArrayMaxIndex($aFiledate, 1)],2)
    $buysplit=stringsplit($line2,",",1)
    $buy=StringFormat("%d",$buysplit)
    MsgBox(0,"",$buy)


    for $a = 3 to 1000 step 1
    $linea=FileReadLine("path" & '\' & $aFilelist[_ArrayMaxIndex($aFiledate, 1)],$a)
    $sellsplit=Stringsplit($linea,",", 1)
    $sell=StringFormat("%d",$sellsplit)
    if $sell < $buy Then
    ConsoleWrite($sell)
    $a = 1000
    EndIf
    Next

    [/autoit]
    [autoit][/autoit]

    keine ahnung bin am ende bekomme nur noch eine 0 raus ... mit stringformat("%D") mach ich doch wieder dezimalzahlen draus oder? ... das ich damit wieder rechnen kann ... naja wie auch immer ... funkt nicht .... vll könnt ihr mir nochmal helfen ...
    vielen dank für eure hilfe ...

  • Guten Morgen,

    $buysplit und $sellsplit sind Arrays, man kann sie in StringFormat nicht ohne Index verwenden:

    Spoiler anzeigen
    [autoit]

    #Include <Array.au3>
    $Path = "C:\AU3\"
    $aFilelist = _FileListToArray($Path)
    Dim $aFiledate[$aFilelist[0]+1]
    For $i = 1 To $aFilelist[0]
    $aFiledate[$i] = FileGetTime($Path & $aFilelist[$i], 0, 1)
    Next

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

    $line2=FileReadLine($Path & $aFilelist[_ArrayMaxIndex($aFiledate, 1)],2)
    $buysplit=stringsplit($line2,",",1)
    $buy=$buysplit[1]
    MsgBox(0,"",$buy)

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

    for $a = 3 to 1000 step 1
    $linea=FileReadLine("path" & '\' & $aFilelist[_ArrayMaxIndex($aFiledate, 1)],$a)
    $sellsplit=Stringsplit($linea,",", 1)
    $sell=$sellsplit[1]
    if Number($sell) < Number($buy) Then
    ConsoleWrite($sell)
    $a = 1000
    EndIf
    Next

    [/autoit]


    Ich würde es aber "händisch" machen:

    Spoiler anzeigen
    [autoit]

    $Path = "C:\AU3\" ; Ordner, man beachte das abschließende "\"
    $FilePattern = "*.*" ; Suchpattern
    $FileDate = "" ; Zeitstempel
    $FilePath = "" ; Gefundener Dateipfad
    $Wert1 = "" ; Wert aus zweiter Zeile
    $Wert2 = "" ; erster niedrigerer Wert
    ; Neueste Datei suchen ==================================================================
    $FileHandle = FileFindFirstFile($Path & $FilePattern)
    If $FileHandle = -1 Then
    MsgBox(0, "Da war nix!", "Die Suche nach " & $Path & $FilePattern & " war erfolglos!")
    Exit
    EndIf
    $NextFile = FileFindNextFile($FileHandle)
    While Not @error
    If Not @extended Then
    $Modyfied = FileGetTime($Path & $NextFile, 0, 1)
    If $Modyfied > $FileDate Then
    $FilePath = $Path & $NextFile
    $FileDate = $Modyfied
    EndIf
    EndIf
    $NextFile = FileFindNextFile($FileHandle)
    WEnd
    FileClose($FileHandle)
    If $FilePath = "" Then
    MsgBox(0, "Da war nix!", "Die Suche nach " & $Path & $FilePattern & " war erfolglos!")
    Exit
    EndIf
    ; Werte suchen ==========================================================================
    $FileHandle = FileOpen($FilePath)
    If $FileHandle = -1 Then
    MsgBox(0, "Fehler!", "Konnte " & $FilePath & " nicht öffnen!")
    Exit
    EndIf
    FileReadLine($FileHandle) ; erste Zeile überlesen
    If @error Then
    MsgBox(0, "Fehler!", "Die Datei" & $FilePath & " ist leer!")
    FileClose($FileHandle)
    Exit
    EndIf
    $Zeile = FileReadLine($FileHandle) ; zweite Zeile einlesen
    If @error Then
    MsgBox(0, "Fehler!", "Die Datei" & $FilePath & " ist leer!")
    FileClose($FileHandle)
    Exit
    EndIf
    $Wert1 = StringStripWS(StringLeft($Zeile, StringInStr($Zeile, ",") - 1), 8)
    $Zeile = FileReadLine($FileHandle) ; weitere Zeilen einlesen
    While Not @error
    $Wert = StringStripWS(StringLeft($Zeile, StringInStr($Zeile, ",") - 1), 8)
    If Number($Wert) < Number($Wert1) Then
    $Wert2 = $Wert
    ExitLoop
    EndIf
    $Zeile = FileReadLine($FileHandle)
    WEnd
    If $Wert2 = "" Then
    MsgBox(0, "Fehler!", "Wert2 konnte nicht ermittelt werden!")
    Else
    MsgBox(0, "Ergebnis:", "Datei: " & $FilePath & @CRLF & _
    "Zeitstempel: " & $FileDate & @CRLF & _
    "Wert1: " & $Wert1 & " - " & "Wert2: " & $Wert2)
    EndIf
    FileClose($FileHandle)
    Exit

    [/autoit]


    Das übt! ;)

  • Hallo, ich mal wieder ^^
    also das programm macht endlich das was es soll :rock: ... vielen vielen dank nochmal an euch ... nun würde ich gerne eine txt datei durchsuchen nach bestimmten werten ... die ähnlich aufgebaut ist wie die alte ... ich hab mal was gelesen ... von den befehl readtoend ... weis aber nicht mehr ob das c# war oder autoit halt ...
    mfg Roaand