csv Datei generieren

  • Hallo zusammen,

    folgendes Problem:
    Ich muß sehr oft gleiche Daten in eine Tabelle schreiben.
    Jetzt wage ich mich mal ganz vorsichtig an autoit
    Ich hoffe daß man das Problem damit lösen kann.
    z.B. 10 Boxer Welpen, alle ohne Papiere, nicht geimpft...= 10 Einträge u.s.w.
    Hier mal meine Grundidee:

    • Ich öffne eine leere csv Datei
    • Ich wähle die Hunde z.B. Collies
    • Dann fülle ich eine einzige Zeile der Listview aus
    • Dann wähle ich meine Anzahl

    Wenn ich nun auf eintragen klicke, dann sollte die Liste.csv
    z.B. 10xBoxer Welpen, Papiere keine...haben
    Die Rasse wäre quasie die erste Spalte.


    Hier ist mein Rohbau:

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <ListViewConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $Form2 = GUICreate("Form1", 629, 487, 297, 172)
    $List1 = GUICtrlCreateList("", 36, 120, 173, 84, BitOR($GUI_SS_DEFAULT_LIST,$LBS_MULTIPLESEL))
    GUICtrlSetData(-1, "Boxer|Collie|Dackel|Schäferhund")
    $Label1 = GUICtrlCreateLabel("Bitte auswählen", 36, 92, 79, 17)
    $Katalog = GUICtrlCreateButton("Katalog Auswahl", 36, 20, 107, 25)
    $KatPfad = GUICtrlCreateInput("", 36, 56, 389, 21)
    $ListView1 = GUICtrlCreateListView("Hundename|Papiere|Bild|Kinderlieb|geimpft|Gesundheit|Bemerkung", 36, 248, 574, 186)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 4, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 5, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 6, 50)
    $Alle = GUICtrlCreateButton("Alle", 212, 120, 75, 25)
    $Keine = GUICtrlCreateButton("Keine", 212, 152, 75, 25)
    $KatNeu = GUICtrlCreateButton("Neuer Katalog anlegen", 192, 20, 131, 25)
    $Eintragen = GUICtrlCreateButton("Eintragen", 212, 184, 75, 57)
    $Anzeige = GUICtrlCreateButton("Katalog anzeigen", 492, 216, 115, 25)
    $Anzahl = GUICtrlCreateInput("1", 292, 204, 29, 21)
    $Label2 = GUICtrlCreateLabel("leere csv Datei", 332, 28, 75, 17)
    $Label3 = GUICtrlCreateLabel("x", 324, 208, 9, 17)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Katalog
    $Kat = FileOpenDialog("", @WindowsDir & "\", "Kataloge (*.csv;*.txt)", 1 + 4 )
    GUICtrlSetData($KatPfad, $Kat)
    Case $ListView1
    Case $Alle
    Case $Keine
    Case $KatNeu
    Case $Eintragen
    Case $Anzeige
    EndSwitch
    WEnd

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

    Wenn man die Daten auch irgendwie in die Listview einlesen und editieren kann,
    das wäre natürlich super. Ich bin noch mit der Listview am lesen, probieren...

    Freue mich über jeden Tipp

    Liebe Grüße
    Ilse ;)

  • ...zum editieren prima
    vielleicht hat ja jemand noch Tipps
    zum anfügen größerer Datenmengen :(

    Das würde die Arbeit wirklich erleichtern.

    Liebe Grüße
    Ilse ;)

  • Hallo Ilse,

    hier 2 Skriptauszüge aus meinem MP3-Player,

    1 abpeichern der Litview in Textdatei:

    [autoit]

    Func _saveLVs()
    Local $sFile, $aItem, $hFileOut
    $hFileOut = FileOpen(@ScriptDir & "\" & $sLVdat, 2)
    For $j = 0 To _GUICtrlListView_GetItemCount($idLV_Player) - 1
    $aItem = _GUICtrlListView_GetItemTextString($idLV_Player, $j)
    FileWriteLine($hFileOut, $aItem)
    Next
    FileClose($hFileOut)
    EndFunc ;==>_saveLVs

    [/autoit]

    2: einlesen der Textdatei in die Listview:

    [autoit]

    Func _LoadLVs()
    Local $aItems
    If FileExists($sLVdat) Then
    $aItems = ""
    _FileReadToArray($sLVdat, $aItems)
    If IsArray($aItems) Then
    _GUICtrlListView_DeleteAllItems($idLV_Player)
    ;;;_ArrayDisplay($aItems)
    For $j = 1 To $aItems[0]
    GUICtrlCreateListViewItem($aItems[$j], $idLV_Player)
    Next
    EndIf
    EndIf
    EndFunc ;==>_LoadLVs

    [/autoit]

    Mit der UDF in Anhang von [ gelöst ] Perle für alle LV-Benutzer gefunden, muss aber noch poliert werden kannst du Daten direkt im Listview editieren, auch ComboBoxen und andere Controls laen sich bei Bedarf einbinden,

    P(r)ost: 3333

    Frohes gutes neues Jahr autoBert

  • Guten Morgen zusammen,
    mußte gestern leider wieder los.

    Danke für die Tipps.

    Hier mal mein fehlerhafter Versuch mit _FileWriteFromArray
    (Habt erbarmen...Arrays machen mir noch das Leben schwer)

    [autoit]


    dim $aRasse[4]
    $aRasse[0]="Boxer"
    $aRasse[1]="Collie"
    $aRasse[2]="Schäferhund"
    $aRasse[3]="Spitz"

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

    $sFile = @ScriptDir & "\Test.txt"

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

    For $i =1 to UBound ($aRasse,1)-1
    _FileWriteFromArray($sFile, $aRasse[$i], 1)
    next

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

    Run("notepad.exe " & $sFile)

    [/autoit]

    Wenn ich ehrlich bin, ich habe diesen Loop nicht verstanden!

    [autoit]


    For $i =1 to UBound ($aRasse,1)-1 ; also ich starte mit 1, ermittle mit UBound die Anzahl der Variable $aRasse und dann ????????1,-1
    _FileWriteFromArray($sFile, $aRasse[$i], 1) ; ich schreibe in das File $sFile, $aRasse??????
    next

    [/autoit]

    @ autoBert

    Ich habe mir die beiden Dateien heruntergeladen (dein Link)

    Zitat

    ListViewEIP.au3
    _EIPListView.au3


    im gleichen Ordner abgespeichert...
    erhalte aber eine Fehermeldung.
    ERROR: $HDN_FIRST previously declared as a 'Const'

    Ich kann das Script nicht starten.

    Jetzt brauch ich einen starken Kaffee ?(

    Liebe Grüße
    Ilse ;)

  • Morgen BugFix,

    merci für den Link. Zum editieren prima Lösung.
    Eine Frage:
    Jetzt muß da nur noch meine.csv da rein!

    Spoiler anzeigen


    #include<StaticConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<ListViewConstants.au3>
    #include<StructureConstants.au3>
    #include<WindowsConstants.au3>
    #include <GUIListView.au3>

    Global $currentItem[2], $title, $currentOpt[2] = ["none"]

    $GUI = GUICreate('test')
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 10, 10, 300, 200, $LVS_REPORT)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 70)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 60)
    _GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
    For $i = 1 To 9
    GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
    Next

    $EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
    $dummy = GUICtrlCreateDummy()
    $hEdit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
    HotKeySet('{ESC}', '_EscEdit')
    Global $AccelKeys[1][2]=[["{ENTER}", $dummy]]
    GUICtrlSetOnEvent($dummy, "_EditEnter")
    GUISetAccelerators($AccelKeys)

    GUISetState(@SW_SHOW, $GUI)
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    While True
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    WEnd

    Func _LeftDblClick($Info)
    If $Info[3] = -1 Then Return
    If $currentOpt[0] = "none" Then
    $currentOpt[0] = Opt('GUICoordMode', 1)
    $currentOpt[1] = Opt("GUIOnEventMode", 1)
    EndIf
    GUICtrlSetOnEvent($hEdit, '_EditEnter')
    _GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
    $title = WinGetTitle($GUI)
    Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
    Local $posGUI = WinGetPos($GUI), $posLV = ControlGetPos($GUI, '', $hListView)
    Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
    WinSetTitle($GUI, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
    For $i = 0 To $Info[4]
    $tmp = _GUICtrlListView_GetColumn($Info[1], $i)
    $sumWidth += $tmp[4]
    Next
    $sumWidth -= $colInfo[4]
    Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
    If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
    If $xPos < 0 Then $xPos = 0
    WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
    GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
    $currentItem[0] = $Info[3]
    $currentItem[1] = $Info[4]
    GUISetState(@SW_SHOW, $EditBox)
    EndFunc

    Func _EscEdit()
    WinSetTitle($GUI, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

    Func _EditEnter()
    WinSetTitle($GUI, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    _GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView ; ID des LV
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem")]
    _LeftDblClick($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY


    Muß ich das mit der autoBert-Funktion
    einlesen der Textdatei in die Listview:
    kombinieren?

    Ich bin immer noch mit _FileWriteFromArray am kämpfen.
    Kannst du da mal drübersehen?

    [autoit]


    #include<File.au3>

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

    dim $aRasse[4]
    $aRasse[0]="Boxer"
    $aRasse[1]="Collie"
    $aRasse[2]="Schäferhund"
    $aRasse[3]="Spitz"

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

    $sFile = @ScriptDir & "\Test.txt"

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

    ;For $i =1 to UBound ($aRasse,1)-1
    _FileWriteFromArray($sFile, $aRasse, -1)
    ;next

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

    Run("notepad.exe " & $sFile)

    [/autoit]

    noch eine Frage hierzu:
    wie kann ich einen einzelnen Wert schreiben?

    [autoit]


    _FileWriteFromArray($sFile, $aRasse[3], -1)

    [/autoit]

    das geht leider nicht!
    Viele Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (4. Januar 2011 um 16:36)