Array "Umstrukutieren"

  • Hey,

    folgendes Problem:

    aus einer Textdatei erhalte ich ein 1D Array in folgendem Format:

    beispiel;100
    beispiel2; 200
    beispiel3; 300

    usw.

    Bestimmte Daten (die hinterm ;) wollte ich jetzt in ein neues 1D Array schicken, welches dann so aussehen soll:

    100
    200
    300

    usw.

    Ich dachte es funktioniert ganz simpel mit Stringsplit und _Arrayadd, allerdings hab ichs irgendwie doch nicht hinbekommen :( .
    Bei Bedarf poste ich noch meinen Versuch, bin allerdings gerade in der Mittagspause und komme erst heute nachmittag wieder ran.

    Gruß Nuts

    • Offizieller Beitrag

    z.B. so:

    [autoit]

    Local $array[4] = ['beispiel;100','beispiel2; 200','beispiel3; 300','beispiel4; 400']

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

    For $i = 0 To UBound($array) -1 ; aufpassen auf deinen Startindex
    $array[$i] = StringRegExpReplace($array[$i], '(?:.*;\s?)(\d*)', '$1')
    ConsoleWrite('$array[' & $i & ']: ' & $array[$i] & @CRLF)
    Next

    [/autoit]
  • Danke, funktioniert so weit.

    Ich hätte wohl gleich richtig beschreiben sollen was ich eigentlich vor habe.

    Die Text-Datei kommt aus einer Excel-Tabelle (als .csv gespeichert) und beinhaltet ein bestimmtes Thema mit einem zugehörigen Datum.

    Code
    Thema; 25.01.2009
    Thema2; 26.02.2009
    Thema3; 15.12.2008
    Thema4; 03.01.2009


    Diese Themen will ich jetzt mit hilfe von Auto-it nach dem Datum sortieren.

    Ist aber gar nicht so einfach.

    • Offizieller Beitrag

    OK, gründliche Problemschilderung hilft meist.. :whistling:

    Da ein Datum enthalten ist, schlage ich eine Lösung mit Datenbank-basierter Sortierfunktion vor.
    Da hatte ich nicht bedacht, dass SQLite keinen Datentyp DATE kennt.
    Also hier eine Array-Variante:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    $file = 'muster_1.csv'

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

    ; 2D-Array erzeugen und Datum sortierfähig einfügen (JJJJ-MM-TT)
    Global $arCSV[_FileCountLines($file)][2], $line, $split, $fh = FileOpen($file, 0), $i = 0
    While 1
    $line = FileReadLine($fh)
    If @error = -1 Then ExitLoop
    If Not StringInStr($line, ';') Then ContinueLoop
    $split = StringSplit($line, ';')
    $arCSV[$i][0] = $split[1]
    $arCSV[$i][1] = StringStripWS($split[2], 3) ; führende und folgende Leerzeichen entfernen
    $arCSV[$i][1] = StringRight($arCSV[$i][1], 4) & StringMid($arCSV[$i][1], 4, 2) & StringLeft($arCSV[$i][1], 2)
    $i += 1
    Wend
    FileClose($fh)

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

    ; Sortieren nach Datum
    _ArraySort($arCSV, 0, 0, 0, 1)

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

    ; Datum zurück konvertieren
    For $i = 0 To UBound($arCSV) -1
    $arCSV[$i][1] = StringRight($arCSV[$i][1], 2) & '.' & StringMid($arCSV[$i][1], 3, 2) & '.' & StringLeft($arCSV[$i][1], 4)
    Next

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

    ; Anzeigen
    _ArrayDisplay($arCSV)

    [/autoit]
  • Hey,

    heute mittag hab ichs dringend gebraucht und hab mir einen Umweg übers Listview gebaut

    Spoiler anzeigen
    [autoit]


    #include<WindowsConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<Guilistview.au3>
    #include <File.au3>
    #include <EditConstants.au3>
    #include <Misc.au3>
    #NoTrayIcon

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

    Opt("GUIDataSeparatorChar", ";")
    global $path
    global $array
    global $titel = "Semniarunterlagen"

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

    if _Singleton($titel,1) = 0 then
    MsgBox(0, "Achtung", "Anwendung läuft bereits!", 3)
    exit
    endif

    Global $sHeader = "Bezeichnung;Datum" ; Die Überschriften für das Listview und für das "Neuer Eintrag"-Fenster
    Global $HA = 750
    Global $VA = 1100

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

    HotKeySet("!+S" ,"Save")

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

    #Region Hauptfenster
    Global $bfarbe = 0xeeeeee
    $LVStyle = BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS )
    $ExStyle = BitOR($LVS_EX_FULLROWSELECT, $WS_EX_DLGMODALFRAME, $LVS_EX_DOUBLEBUFFER)
    Global $hGui = GUICreate($titel ,$VA, $HA) ; Hauptfenster erstellen
    GUISetBkColor ($bfarbe)

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

    ;;;;;Listview erstellen
    Global $hListView = GUICtrlCreateListView($sheader, 0, 0, 1100, 750, $LVStyle, $ExStyle) ; Listview erstellen
    Global $hLVHandle = GUICtrlGetHandle($hListView) ; das Handle vom Listview wird für die UDF-Listview-Funktionen benötigt
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Bezeichnung", 970, 0) ; 1. Spalte = 360 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Datum", 120, 0)
    GUICtrlSetFont($hlistview, 12, 800, 0)

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

    ;;;;;;;;Hauptmenü
    Global $hMenu = GUICtrlCreateMenu("Menü") ;Erstellt das Menü für die HauptGUI
    Global $hcopen = GUICtrlCreateMenuItem("Öffnen", $hmenu)
    Global $hcspeichern = GUICtrlCreateMenuItem("Speichern", $hmenu)
    Global $hcExit = GUICtrlCreateMenuItem("Exit", $hmenu)

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

    #EndRegion Hauptfenster

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

    #Region Fenster für Dateiauswahl
    Global $hGUIdatei = GUICreate("Datei auswählen", 600, 200, 193, 125)
    GUISetBkColor(0xeeeeee)
    Global $bweiter = GUICtrlCreateButton("Weiter", 210, 100, 180, 50, 0)

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

    GUICtrlCreateGroup("Verzeichnis eingeben", 25, 30, 550, 51)
    Global $hInput = GUICtrlCreateInput("" , 35, 50, 500, 21, BitOR($ES_READONLY, $ES_AUTOHSCROLL))
    Global $bopen = GUICtrlCreateButton("...", 535, 49, 30, 23)
    #EndRegion Fenster für Dateiauswahl

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

    _GUICtrlListView_RegisterSortCallBack($hLVHandle) ; damit man das Listview (mit Klick auf die Spaltenüberschrift) sortieren kann

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

    GUISetState(@SW_SHOW, $hguidatei) ; Hauptfenster sichtbar machen

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    case $bweiter
    Date()
    Load()
    GUISetState(@SW_HIDE, $hguidatei)
    GUISetState(@SW_Show, $hgui)
    Case $hListView
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($hListView))
    case $bopen
    $path = FileOpenDialog("Bitte auswählen", @DesktopDir , "Text (*.csv)")
    GUICtrlSetData($hInput, $path)
    Case $hcopen
    $path = FileOpenDialog("Bitte auswählen", @DesktopDir , "Text (*.csv)")
    Date()
    Load()
    Case $hcspeichern
    Save()
    Case $GUI_EVENT_CLOSE, $hcExit
    Switch $nMsg[1]
    case $hgui
    End()
    case $hGUIdatei
    End()
    EndSwitch
    EndSwitch
    WEnd

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

    Func End()
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle) ; Sortierroutine wieder de-registrieren
    Exit
    EndFunc

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

    Func Load() ; Datenbank-Datei laden
    _GUICtrlListView_DeleteAllItems($hLVHandle)
    Local $sItem
    Local $hFile = FileOpen($path, 0)
    _GUICtrlListView_BeginUpdate($hLVHandle) ; Listview sperren
    While True ; Endlosschleife
    $sItem = FileReadLine($hFile) ; Zeile aus der Datei lesen
    If @error Then ExitLoop ; wenn das Ende der Datei erreicht ist, dann Endlosschleife verlassen
    GUICtrlCreateListViewItem($sItem, $hListView) ; mit den eingelesenen Daten einen neuen Listview-Eintrag erstellen
    WEnd
    _GUICtrlListView_EndUpdate($hLVHandle) ; Listview wieder freigeben
    FileClose($hFile) ; Datei schließen
    EndFunc ;==>Load

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

    Func Save() ; Datenbank-Datei speichern
    Local $sItem

    Local $iCount = _GUICtrlListView_GetItemCount($hLVHandle) - 1 ; Anzahl der Listview-Einträge holen
    Local $hFile = FileOpen($path, 2) ; Datei zum speichern (überschreiben) öffnen
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    For $i = 0 To $iCount ; Schleife, um alle Listview-Einträge durchzugehen
    $sItem = _GUICtrlListView_GetItemTextString($hLVHandle, $i) ; die Werte aus dem Listview-Eintrag holen
    FileWriteLine($hFile, $sItem) ; und in die Datei schreiben
    Next
    FileClose($hFile) ; Datei schließen
    EndIf
    msgbox(0, "Speichern", "Gesichert")
    EndFunc ;==>Save

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

    Func Date()
    _FilereadToArray($path, $array)
    fileopen($path,2)
    for $i = 1 to UBound($array) -1
    local $string = Stringsplit($array[$i], ";")
    local $stringdate = stringsplit($string[2],".")
    local $date = $stringdate[3] & "." & $stringdate[2] & "." & $stringdate[1]
    local $write = $string[1] & ";" & $date
    FileWriteLine($path, $write)
    next
    FileClose($path)
    EndFunc

    [/autoit]


    Gefällt mir ganz gut, scheint zu funktionieren und man kann sich vor dem Überschreiben das Ergebnis im Listview ansehen.

    Deine Variante probier ich aber auch gleich aus, danke für deine Mühen :thumbup:

    edit \ Deine Variante ändert aber irgendwie die "Datums" - muss ich jetzt nochmal genauer testen.

    Einmal editiert, zuletzt von nuts (26. März 2009 um 21:50)

    • Offizieller Beitrag

    Deine Variante ändert aber irgendwie die "Datums"


    Sorry, sehe gerade, ich habmich verzählt LOL. Korrektur kommt gleich.

    Hierdrin war der Fehler, jetzt stimmts:

    [autoit]

    ; Datum zurück konvertieren
    For $i = 0 To UBound($arCSV) -1
    $arCSV[$i][1] = StringRight($arCSV[$i][1], 2) & '.' & StringMid($arCSV[$i][1], 5, 2) & '.' & StringLeft($arCSV[$i][1], 4)
    Next

    [/autoit]