CSV anhand eines Feldwertes sortieren

  • Hallo Leute,

    Mein erster Post, leider nicht mein erstes (letztes) Problem ;o)

    Ich hab ein CSV-File, in dem semikolon-getrennt zeilenweise folgende Daten stehen:
    ID;Artikelnummer;Datum;Eingang;Ausgang;Saldo;.......

    Dieses File lese ich per _FileReadToArray($file, $array) in $array ein

    mit For $x = 1 To $array[0] gehe ich dann die einzelnen Zeilen durch und möchte diese nun nach dem Datum sortieren.

    Also angenommen $tmp=StringSplit($zeile, ';') -> steht das Datum der Zeile $array[x] in $tmp[3]

    Gibt es eine <strike>einfache</strike> möglichkeit, dies in Autoit zu realisieren ?

    Hoffe, ich habe das jetzt akkurat genug beschrieben, Bin *NEU* hier ;)

    Gruße und vielen Dank für die Hilfe,

    Zippel

    Einmal editiert, zuletzt von Zippelmitz (8. Februar 2008 um 13:50)

  • Mir war grade langweilig :) man kann es sich ja an seine Gegebenheiten anpassen.

    Quell-Datei (testdaten.txt)


    ID;Artikelnummer;Datum;Eingang;Ausgang;Saldo
    1;0125531;23.12.2010;BLA;BLUB;0,74
    2;1531541;05.03.2010;BLA;BLUB;0,74
    3;215812F;05.05.2010;BLA;BLUB;0,74
    4;F135323;06.09.2010;BLA;BLUB;0,74
    5;BGB2322;13.11.2010;BLA;BLUB;0,74
    6;VB01253;04.10.2014;BLA;BLUB;0,74
    7;BCV2123;23.01.2010;BLA;BLUB;0,74
    8;2CV1B2C;21.08.2010;BLA;BLUB;0,74
    9;23C1VB2;15.12.2019;BLA;BLUB;0,74
    10;2C1V21C;14.11.2010;BLA;BLUB;0,74
    11;C2V1B2C;15.02.2010;BLA;BLUB;0,74
    12;DFG5153;19.10.2012;BLA;BLUB;0,74
    13;2DFG313;09.09.2010;BLA;ALUB;0,74
    14;2D1F3G2;10.07.2010;ALA;BLUB;0,74

    Script zum sorteiren nach Datum
    [autoit]


    #include <file.au3>
    #include <array.au3>
    Dim $aRecords
    Dim $Feldanzahl = 6

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

    If Not _FileReadToArray("testdaten.txt",$aRecords) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf
    Dim $arr[$aRecords[0]-1] [$Feldanzahl]

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

    For $x = 2 to $aRecords[0]
    $i = $x - 2
    $splittxt = StringSplit($aRecords[$x],";")

    $arr[$i][0] = $splittxt[1];ID
    $arr[$i][1] = $splittxt[2];Artikelnummer
    $datum = StringSplit($splittxt[3],".");Datum
    $arr[$i][2] = $datum[3]&$datum[2]&$datum[1]
    $arr[$i][3] = $splittxt[4];Eingang
    $arr[$i][4] = $splittxt[5];Ausgang
    $arr[$i][5] = $splittxt[6];Saldo
    Next

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

    _ArraySort($arr,0,0,0,6,2)

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

    $fso = FileOpen("output.txt",2)

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

    FileWriteLine($fso,$aRecords[1])

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

    For $x = 0 To UBound($arr) -1
    $i = 2
    $datum = $arr[$x][2]
    $datum = StringMid($datum,7,2) & "." & StringMid($datum,5,2) & "." & StringMid($datum,1,4)
    $result = $arr[$x][0] & ";" & $arr[$x][1] & ";" & $datum & ";" & $arr[$x][3] & ";" & $arr[$x][4] & ";" & $arr[$x][5]
    FileWriteLine($fso,$result)
    Next

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

    FileClose($fso)

    [/autoit]
    Ausgabe-Datei (output.txt)


    ID;Artikelnummer;Datum;Eingang;Ausgang;Saldo
    7;BCV2123;23.01.2010;BLA;BLUB;0,74
    11;C2V1B2C;15.02.2010;BLA;BLUB;0,74
    2;1531541;05.03.2010;BLA;BLUB;0,74
    3;215812F;05.05.2010;BLA;BLUB;0,74
    14;2D1F3G2;10.07.2010;ALA;BLUB;0,74
    8;2CV1B2C;21.08.2010;BLA;BLUB;0,74
    4;F135323;06.09.2010;BLA;BLUB;0,74
    13;2DFG313;09.09.2010;BLA;ALUB;0,74
    5;BGB2322;13.11.2010;BLA;BLUB;0,74
    10;2C1V21C;14.11.2010;BLA;BLUB;0,74
    1;0125531;23.12.2010;BLA;BLUB;0,74
    12;DFG5153;19.10.2012;BLA;BLUB;0,74
    6;VB01253;04.10.2014;BLA;BLUB;0,74
    9;23C1VB2;15.12.2019;BLA;BLUB;0,74

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

    • Offizieller Beitrag

    Hi,
    ich hab dir mal 'ne Lösung erstellt. Ich bin davon ausgegangen, dass das Datum in der Form "TT.MM.JJJJ" vorliegt.
    Die Funktion ist so ausgelegt, dass Tag und Monat auch einstellig eingegeben sein können (also '9.' statt '09.').

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <file.au3>

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

    Dim $file = 'test.csv'
    Dim $fileOut = 'test_1.csv'
    Dim $arRaw
    _FileReadToArray($file, $arRaw)
    Dim $arOut[$arRaw[0]][2]

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

    For $i = 1 To UBound($arRaw) -1
    $tmp = StringSplit($arRaw[$i], ';')
    $arOut[$i-1][0] = $i
    $arOut[$i-1][1] = _konvert2sortDat($tmp[3])
    Next

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

    Func _konvert2sortDat($STR)
    $var = StringSplit($STR, '.')
    Return $var[3] & '-' & StringRight(0 & $var[2], 2) & '-' & StringRight(0 & $var[1], 2)
    EndFunc

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

    _ArraySort($arOut, 0, 0, 0, 2, 1)

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

    $fh = FileOpen($fileOut, 1)
    For $i = 0 To UBound($arOut) -1
    FileWriteLine($fh, $arRaw[$arOut[$i][0]])
    Next
    FileClose($fh)

    [/autoit]
  • Danke an alle, die mir so prompt Hilfestellung gegeben haben.
    Ich wollte das CSV eigntlich bei der Ausgabe in einem listview sortieren, aber die Sortierung vorab ist eindeutig die bessere alternative.

    special Thx BugFix 4 konvert2sortDat, darauf muss man auch erstmal kommen, wenn man nachts übermüdet nach 9 Std. Arbeit, Hausarbeit und Sohnemann endlich am Rechner sitzt und ein wenig bastelt ;)

    Gruß bis demnächst,

    Zippel