Flaches Datenformat in Tabelle Konvertieren

  • Ich bin ans herumprobieren mit Schleifen aber kriege es einfach nicht geschafft, grrr X(
    Ich habe viele Messwerte die in einen "flaches" TXT-Datenformat vorliegen aber ich möchte diese mit AutoIT in ein mehr Tabellen-änliches Format Konvertieren. Kann mir jemand einen Ansatz geben wie ich das hinkriege ? Ich brauche jetzt nicht ein Komplettes programm, nur wie mann das macht mit Arrays/Schleifen in AutoIT.

    Also zum Beispiel das Ausgangsformat für zwei Messungen "S73" und "A89", jeder mit Parameter KWS, NFA, GHR, PST:

    SQL
    KWS	S73	4.674NFA	S73	9.433GHR	S73	8.445PST	S73	6.321KWS	A89	4.984PST	A89	7.332GHR	A89	9.023NFA	A89	8.562


    Und das Zielformat sollte so aussehen wie diese Tabelle:

    SQL
    KWS	NFA	PST	GHRS73	4.674	9.433	6.321	8.445A89	4.984	8.562	7.332	9.023


    Also jede der Parameter in einer Spalte. Im Ausgangsformat sind die Anzahl de Parameter Konstant nur ihre Reihenfolge nicht.

    Programmieren ist ein bisschen Wissenschaft und viel Spass! :)

    • Offizieller Beitrag

    - 2D Array ( $array[2][4] ) deklarieren mit 4 Spalten (KWS, NFA, GHR, PST)
    - Zeilen-Index 0 und 1 entsprechen deinen "S73" und "A89"
    - Datei einlesen mit _FileReadToArray
    - in einer Schleife durchgehen ( For $i = 1 To $aRead[0] )
    - Spalte = StringLeft( $aRead[$i], 3) (KWS=0, NFA=1...)
    - wenn in $aRead[$i] "S73" enthalten (StringInStr) dann Index 0 sonst Index 1
    - in Array an [Index][Spalte] eintragen: die letzten 5 Zeichen (StringRight) von $aRead[$i]

  • So?

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    Dim $zeilen
    _FileReadToArray("messwerte.txt", $zeilen)
    ;_ArrayDisplay($zeilen)

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

    ;Tabellenkopf mit 5 spalten erstellen durch tabs getrennt
    $tabelle = @TAB
    For $i = 1 To 4 ;4 zeilen einlesen
    $tabellenkopf = StringSplit($zeilen[$i], @TAB, 3) ;ggf delimiter anpassen
    ;_arraydisplay($tabellenkopf)
    $tabelle &= $tabellenkopf[0] & @TAB
    Next
    $tabelle &= @CRLF ;neue zeile

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

    ;Tabelle ausfüllen
    For $i = 1 To $zeilen[0] Step 4
    $messwert = StringSplit($zeilen[$i], @TAB, 3) ;ggf delimiter anpassen
    ; _ArrayDisplay($messwert)
    $tabelle &= $messwert[1] & @TAB ;zeilenanfang
    For $t = $i To $i + 3 ; alle 4 Messwerte eintragen
    $messwert = StringSplit($zeilen[$t], @TAB, 3) ;ggf delimiter anpassen
    $tabelle &= $messwert[2] & @TAB ;zahlen eintragen
    Next
    $tabelle &= @CRLF ;neue zeile
    Next

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

    FileWrite("auswertung_messwerte.txt", $tabelle)
    ShellExecute("auswertung_messwerte.txt")

    [/autoit]
  • Also jede der Parameter in einer Spalte. Im Ausgangsformat sind die Anzahl de Parameter Konstant nur ihre Reihenfolge nicht.


    ... dann vielleicht so?

    Spoiler anzeigen
    [autoit]

    Global Enum $KWS = 1, $NFA, $PST, $GHR
    Global Const $Delim = @TAB
    Global Const $Filename = "Testdaten.csv"
    ; TEST >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    $Input = "KWS S73 4.674" & @CRLF & _
    "NFA S73 9.433" & @CRLF & _
    "GHR S73 8.445" & @CRLF & _
    "PST S73 6.321" & @CRLF & _
    "KWS A89 4.984" & @CRLF & _
    "PST A89 7.332" & @CRLF & _
    "GHR A89 9.023" & @CRLF & _
    "NFA A89 8.562"
    $hFile = FileOpen($Filename, 10)
    FileWrite($hFile, $Input)
    FileClose($hFile)
    ; TEST <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    $Input = FileRead($Filename)
    $aZeilen = StringSplit($Input, @CRLF, 1)
    Dim $aOutput[Ceiling($aZeilen[0] / 4) + 1][5] = [["", "KWS", "NFA", "PST", "GHR"]]
    For $I = 1 To $aZeilen[0]
    $aWerte = StringSplit($aZeilen[$I], $Delim, 2)
    $OK = False
    For $J = 1 To UBound($aOutput) - 1
    If Not $aOutput[$J][0] Then
    $aOutput[$J][0] = $aWerte[1]
    $OK = True
    ExitLoop
    ElseIf $aOutput[$J][0] = $aWerte[1] Then
    $OK = True
    ExitLoop
    EndIf
    Next
    If $OK Then
    $aOutput[$J][Eval($aWerte[0])] = $aWerte[2]
    Else
    MsgBox(16, "Fehler!", "Mit dieser Zeile" & @CRLF & @TAB & $aZeilen[$I] & @CRLF & "stimmt etwas nicht!")
    EndIf
    Next
    MsgBox(0, "Ergebnis", _MyArrayToString($aOutput))
    Exit

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

    Func _MyArrayToString($Array, $Feldtrenner = @TAB, $Zeilentrenner = @CRLF)
    Local $String
    Local $D1 = UBound($Array) - 1
    Local $D2 = UBound($Array, 2) - 1
    For $I = 0 To $D1
    For $J = 0 To $D2
    $String &= $Array[$I][$J]
    If $J < $D2 Then $String &= $Feldtrenner
    Next
    If $I < $D1 Then $String &= $Zeilentrenner
    Next
    Return $String
    EndFunc

    [/autoit]
  • ... dann vielleicht so?


    .. Ja ich begreife jetzt wie Sie es machen wollen, aber ich bekomme noch dieser Fehler:

    [autoit]

    test3.au3 (25 : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $aOutput[$J][0] = $aWerte[1]
    $aOutput[$J][0] = ^ ERROR
    -> AutoIT3.exe ended.rc:1

    [/autoit]


    Macht nichts, ich habe genug Anregungen um weiter zu kommen... denn manchmal hat mann wirklich ein "Writersblock" (wie sagt mann das auf Deutsch?) Die Lösung des Problems fällt dir dann erst sehr viel später ein...

    Programmieren ist ein bisschen Wissenschaft und viel Spass! :)