Werte aus csv in Programm eintragen

  • Hallo,

    möchte Werte aus einer csv Datei nacheinader in ein Windows-Programm eintragen.
    Diese Werte sollen nacheinander in das geöffnete Programmfenster eingetragen werden und dort je Wert in ein Textfeld.
    Ein Wert muss dabei eine Auswahl in einem Combo-Feld machen, also ist der Wert in der csv 1 soll der erste Wert im Combo-Feld genommen werden, bei dem Wert 2 in der csv der zweite Wert im Combo-Feld.
    Welche Befehle brauche ich hier alle? Gibts vielleicht bereits fertige Scripts hierfür?
    Bin für jeden Tip dankbar.

    Gruß
    mactoni

  • erstell dir selber nen plan, wie du vorgehst...

    zb


    auslesen
    auswerten
    setzen


    und dann denkst du "wie könnnnnt ich das auslesen"...GIbst vll mal Read bei der helpfile ein und du schaffst es ;)

    achja:

    um mehr hif ezu bekommen, immer eine beispiel .csv datei posten!

    mfg

  • Wie ich die Datei einlese ist klar. Es stellt sich die Frage wie ich die Daten nacheinander auf die Textfelder verteile. Die csv hat 4 Spalten und 120 Zeilen.
    Mit einer Schleife die erste Zeile auslesen und die 4 Spalten nacheinander in die Textfelder Schreiben oder erst alles in ein Array und von da "verteilen"?

    • Offizieller Beitrag

    Du kannst zeilenweise oder spaltenweise vorgehen. Die Entscheidung können wir dir nicht abnehmen.;-)
    Auch ob du jeden Wert sofort nach dem Lesen in die Combo einfügst oder erst alles in ein Array liest hängt davon ab, ob du evtl. wiederholt auf diese Daten zugreifen mußt. Dann wäre die Arrayvariante zu bevorzugen.

    Befehle? - Steht sehr schön in der Hilfe ;)
    Aber ich bin mal nicht so.

    csv-Datei einlesen: _FileReadToArray()
    aufsplitten: StringSplit()
    Combo befüllen: _GUICtrlComboAddString()

  • Hallo,

    habe meine Datei aus der csv in ein Array eingelsen.
    Versuche über eine For Schleife die Daten nacheinander in ein Programmfenster zu schreiben.

    Code
    For $i=1 to $daten
         $inhalt=StringSplit($daten[$i], ",")
    Next

    Wie kann ich jetzt in der ersten Zeile den ersten, zweiten, dritten usw. Wert ansprechen, also die jeweiligen Werte die durch ein Komma getrennt sind?

    • Offizieller Beitrag

    Edit: Du liest sicher mit _FileReadToArray ein. Also muß es nicht $daten sondern $daten[0] heißen.

    [autoit]

    $Str = ''
    For $i=1 to $daten[0]
    $inhalt=StringSplit($daten[$i], ",") ; liefert ein Array zurück
    If IsArray($inhalt) Then
    For $k = 1 To UBound($inhalt) -1
    $Str &= 'Wert ' $i & '/' & $k & ': ' & $inhalt[$k] & @LF ; $i ist Zeil/ $k ist Spalte
    Next
    EndIf
    Next
    MsgBox(0, '', $Str)

    [/autoit]
  • Mit [0] hast du natürlich recht.
    Kannst du mir diese Zeile erklären?

    Code
    $Str &= 'Wert ' $i & '/' & $k & ': ' & $inhalt[$k] & @LF ; $i ist Zeil/ $k ist Spalte


    Habe auch das Problem das vor jedem Wert eine Zahl steht, z.B anstatt Hans einzufügen wird 21Hans eingefügt. Was kann hier der Fehler sein?

    Einmal editiert, zuletzt von mactoni (10. Oktober 2007 um 14:50)

    • Offizieller Beitrag

    Es laufen zwei Schleifen. Die äußere liest die Zeile aus, ZeilenIndex $i.
    Die innere splittet die Zeile auf in Spalten, SpaltenIndex $k.
    Beim Auslesen jeder einzelnen Spalte wird der Inhalt zu einem String hinzugefügt. Für Zeile 1, Spalte 1 würde das so aussehen:
    Wert 1/1: "Spalteninhalt" & @LF

  • Danke, soweit funzt es jetzt gut.

    Leider ist das zu steuerende Programm sehr tückenreich.

    Möchte jetzt nach der abgearbeiteten Zeile, also nach jeden 4. Wert ein
    WinWait einfügen damit ich von Hand auf das nächste Fenster umschalten kann wo dann die nächsten 4 Werte eingefügt werden sollen, ist nötig da sich leider die Unterfenster nicht ansprechen lassen über autoit.
    Wie kann ich dies realisieren?

    Frage 2:
    Gibt es eine Möglichkeit bei WinActivate("Fenstername 1") für das 1 eine Variable einzusetzten und diese je Schleifendurchlauf hoch zu zählen?
    Habe es mit
    $x =1
    For...
    WinActivate("Fenstername " & $x)
    ....
    $x =$x +1
    Next
    versucht, ging aber nicht.

    Gruß
    mactoni

    Einmal editiert, zuletzt von mactoni (10. Oktober 2007 um 17:39)

    • Offizieller Beitrag

    zu 1.
    Habe jetzt einfach eine MsgBox eingefügt zum Warten.

    Spoiler anzeigen
    [autoit]

    For $i = 1 To $daten[0]
    $inhalt = StringSplit($daten[$i], ",")
    If IsArray($inhalt) Then
    For $k = 1 to UBound($inhalt) -1
    $Str = $inhalt[$k] & @LF
    send($Str)
    send("{TAB}")
    Next
    MsgBox(0,'','Weiter ?')
    EndIf
    Next

    [/autoit]

    zu 2.
    Schau dir mal Eval() an. Damit läßt sich das realisieren.
    Oder benenne deine Fenster einfach um ( WinSetTitle() ), das geht auch bei Fremdanwendungen (meist).

  • Zu 2: Das sollte doch auch ohne eval() funktionieren? Damit hab ich getestet:

    Spoiler anzeigen
    [autoit]

    $teil1 = "Windows"
    $teil2 = " Task-Manager"
    If NOT WinExists("Windows" & $teil2) Then $pid = Run("taskmgr.exe")
    WinWait($teil1 & $teil2)
    WinActivate($teil1 & " Task-Manager")
    Sleep(1000)
    If NOT IsDeclared($pid) Then WinClose("Windows" & " Task-Manager")

    [/autoit]
  • Erstmal vielen Dank für die Hilfe bis hierher.

    Es funktioniert jetzt fast alles so wie es soll, leider ist jetzt wieder eine Tücke zum Vorschein gekommen.

    Problem:
    der Zweite Wert ist eine Zahl und steht für den Monat, kann einstellig oder zweistellig sein.
    Wenn der Zweite Wert mehr als eine Stelle hat wird automatisch ein TAB verursacht der wiederum alles durcheinanderbringt.
    Gibts hier auch eine Lösung in autoit?

    Gruß
    mactoni

    • Offizieller Beitrag

    So kannst du alle WhiteSpaces (dazu gehören auch Tabs) löschen:

    Spoiler anzeigen
    [autoit]

    For $i = 1 To $daten[0]
    $inhalt = StringSplit($daten[$i], ",")
    If IsArray($inhalt) Then
    For $k = 1 to UBound($inhalt) -1
    If $k = 2 Then
    $Str = StringStripWS ( $inhalt[$k], 8 ) & @LF
    Else
    $Str = $inhalt[$k] & @LF
    EndIf
    send($Str)
    send("{TAB}")
    Next
    MsgBox(0,'','Weiter ?')
    EndIf
    Next

    [/autoit]
  • Geht leider nicht, es wird immer noch ein TAB gemacht wenn die Zahl zweistellig ist.
    Hab die Gegenprobe gemacht und in der csv noch mal einstellig gemacht und dann gings.
    Das bringt mich zur Verzweiflung

  • name1, 07, 80, 1

    Geht nicht da Wert zwei zweistellig, wäre es nur ne 7 dann funzt es weil kein autom. TAB erzeugt wird

  • Das Programmfenster in das die Werte eingetragen werden sollen. Das Feld wo der 2. Wert hineinkommt erlaubt nur 2 Stellen. Werden sofort 2 Stellen übergeben springt das Prgramm sofort zum nächsten Feld, erzeugt also einen TAB. Da in meinem Code ein TAB nach jedem EIntrag vorgegeben ist habe ich dann natürlich einen zuviel und alle Daten geraten durcheinander

    • Offizieller Beitrag

    Dann prüf die Länge des Eintrags und sende den Tab nur bei Bedarf:

    [autoit]

    For $i = 1 To $daten[0]
    $inhalt = StringSplit($daten[$i], ",")
    If IsArray($inhalt) Then
    For $k = 1 to UBound($inhalt) -1
    send($inhalt[$k])
    If StringLen($inhalt[$k]) < 2 Then
    send("{TAB}")
    EndIf
    Next
    EndIf
    Next

    [/autoit]