Arraywert als Dateinmaen verwenden

  • Hallo erst mal zusammen ;)
    Aus einer .csv Datei werden über _Stringsplit die Werte in ein Array gelesen. Eines dieser Arrayfelder soll nun als Dateiname verwendet werden und einige andere Werte in diese geschrieben werden.

    Alles primitiv denke ich, aber die Datei wird nicht erstellt. Wenn ich die Datei mit einem statischen Namen öffne werden die Felder schon gschrieben, aber eben die Dateierstellung hängt??:-(

    Hoffe ich unterforder euch nicht mit dem DIng...

    Quelltext:

    dim $complete
    dim $felder

    #include<array.au3>
    #include<String.au3>
    FileOpen("input.csv",1)
    $complete=FileRead("input.csv")
    $felder = _StringSplit($complete,";")
    FileOpen($felder[62],2)
    FileWrite($felder[62],$felder[61])

    Einmal editiert, zuletzt von Skytandem (15. Juni 2009 um 15:54)

  • Hallo skytandem,

    das Skript müsste eigentlich so ausschauen:

    Spoiler anzeigen
    [autoit]

    dim $complete
    dim $felder

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

    #include<array.au3>
    #include<String.au3>
    $hFileIn = FileOpen("input.csv",1)
    $complete=FileRead($hFileIn)
    $felder = _StringSplit($complete,";")
    ConsoleWrite($felder[62] & @CRLF) ;zum überprüfen ob alle Zeichen gültig sind, Ausgabe in die Console von Scite
    FileClose($hFileIn)
    $hFileOut=FileOpen($hFileOut,2)
    FileWrite($hFileOut,$felder[61])
    FileClose($hFileOut)

    [/autoit]


    die einzig wirklich wichtige Änderung ist das Close nach dem Einlesen und vor dem erneuten Öffnen zum Schreiben. Wenn das auch nicht funktioniert enthält $felder[62] ein ungüliges Zeichen, poste dann bitte die Consolenausgabe bis zum Abbruch und den Auszug aus der Textdatei,

    mfg (Auto)Bert

  • mmhh jetzt kommt der Arrayfehler

    "Array variable has incorrect number of subscripts or subscript dimension range "

    die CSV Datei schaut so aus:
    (Der Wert 60 ist "test.pdf")

    "File";"Destination";"TimeStamp";"Ordnerwahl";"dateiname";"Belegart";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";""
    "test.pdf";"C:\scanziele\Buchhaltung\2009-05-17";"2009-05-17 20:10:07";"C:\scanziele\Buchhaltung";"test";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";""

  • Bitte poste mal das Script so wie Du es getestet hast.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Hallo SkyTandem,

    häng die Datei (ruhig auch 2-5 Datensätze) als Anhang an, bin mir nicht sicher ob die Formatierung noch stimmt,

    Edit: wenn ich noch 60 +2 abzählen kann dann soll dieser Feldinhalt "2009-05-17 20:10:07" den Dateinamen ergeben Doppelpunkte sind aber nicht gültig!
    1. Hast du eine eigene _StringSplit-Funktion da die normale StringSplit heist, die normale gibt ohne zusätzlichen Parameter in $felder[0] die Anzahl der Felder aus?
    2. nächste Frage ist Zeile 1 die Beschreibung der Daten und Zeile 2 eine Datenzeile.

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (15. Juni 2009 um 13:16)

  • Hallo Skytandem,

    beantworte bitte meine Frage aus meinem letzten Post,

    Alina Skript hatte definitiv mind. 1 Fehler

    [autoit]

    dim $complete
    dim $felder

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

    #include<array.au3>
    #include<String.au3>
    $hFileIn = FileOpen("input.csv",1)
    $complete=FileRead($hFileIn)
    $felder = StringSplit($complete,";") ;vor Stringsplit war ein _
    ConsoleWrite($felder[62] & @CRLF) ;zum überprüfen ob alle Zeichen gültig sind, Ausgabe in die Console von Scite
    FileClose($hFileIn)
    $hFileOut=FileOpen($felder[62],2) ;hier war meiner
    FileWrite($hFileOut,$felder[61])
    FileClose($hFileOut)

    [/autoit]

    das Schema pass aber von vorne bis hinten nicht zur Datei weil entweder ein ; oder SkyTandem hat die Überschrift die ja wenn es eine ist nicht eingelesen werden soll als Felder mitgezählt,

    Edit: da folgendes Skript für beide Zeilen 60 ausgibt ist davon auszugehen, das die 1 Zeile überschrift ist,

    [autoit]

    $1='"File";"Destination";"TimeStamp";"Ordnerwahl";"dateiname";"Belegart";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";""'
    $n= Stringreplace($1,'"','')
    msgbox(0,"Anzahl Felder Zeile1 =",@extended/2) ;2 " begrenzen ein Feld
    $2='"test.pdf";"C:\scanziele\Buchhaltung\2009-05-17";"2009-05-17 20:10:07";"C:\scanziele\Buchhaltung";"test";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";""'
    $i = Stringreplace($2,'"','')
    msgbox(0,"Anzahl Felder Zeile2: =",@extended/2) ;2 " begrenzen ein Feld

    [/autoit]

    @Skytandem welches Feld namemtlich oder per Wert (kein Abzählreim bitte) soll den Dateinamen ergeben? Sollen die Anführungszeichen mit in die Datei oder dürfen, können, müssen sie enternt werden?

    links Inhalt der 1. Zeile = Überschrift rechts 1. Datenzeile (und einzigste)

    autoit.de/wcf/attachment/5161/


    mfg (Auto)Bert

    3 Mal editiert, zuletzt von AutoBert (15. Juni 2009 um 14:30)

  • Ahhh,

    du hast recht, der Inhalt ist einfach nur "1". Wenn man $felder[0] nimmt, dann wird eine Datei erstellt.

    Wenn ich die Variable $complete ausgeben lasse ist die leer. Scheint also eher ein Problem mit dem FileRead zu sein. Fileopen mit Parameter 0 ist doch lesen und bei fileread ist der default Wert komplette Datei...

    Die _StringSplit Funktion habe ich aus der Dokumentation :huh:

    dim $complete
    dim $felder
    dim $hFileIn
    dim $hFileOut

    #include<array.au3>
    #include<String.au3>
    $hFileIn = FileOpen("input.csv",0)
    $complete = FileRead($hFileIn)
    $felder = _StringSplit($complete,";")
    ConsoleWrite("TEST" & $complete & @CRLF) ;zum überprüfen ob alle Zeichen gültig sind, Ausgabe in die Console von Scite
    FileClose($hFileIn)
    $hFileOut=FileOpen($felder[2],2)
    FileWrite($hFileOut,$felder[1])
    FileClose($hFileOut)

  • Hi Bert,

    kann es sein, dass die csv bei öffenne mit Parameter 1 geleert wurde?
    Ich schau mir das mal an und melde mich gleich nochmal ;)

    merci erst mal

    Alex

  • Hi Bert,

    der Wert felder[1]kommt in die Consolenausgabe, aber ein file mit diesem Dateiname wird nicht erstellt...

  • Hallo SkyTandem,

    neuer Stand (nicht erschrecken sieht etwas anders aus, macht aber meines Erachtens nach das was du willst. Für jede Datenzeile in der CSV soll eine Datei erstellt werden. Die Ueberschriftenzeile hab ich in $aUeber als Array aufgehoben. Die Feld-Nr. beginnen jeweils bei 1 und enden bei 60.

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    #include<array.au3>
    #include<String.au3>
    $hFileIn = FileOpen("input.csv",0)
    $complete = FileRead($hFileIn)
    ;ganze Datei einlesen
    FileClose($hFileIn)
    $aLines = StringSplit(StringReplace($complete,@crlf,"|"),"|")
    ;in Zeilen aufsplitten und in Array speichern
    _arrayDisplay($aLines) ;nur zur kontrolle auskommentieren
    for $i = 1 to $aLines[0]-1
    $aFelder = StringSplit($alines[$i],";")
    ;in Felder aufsplitten und in Array
    if $i =1 then
    $aUeber = $afelder
    ;ueberschrift aufheben (wer weiss wozu sie noch gebraucht wird)
    _arrayDisplay($aUeber) ;nur zur kontrolle auskommentieren
    Else
    _arrayDisplay($aFelder);nur zur kontrolle auskommentieren
    $sFile= _gueltigerDateiname($afelder[2])
    $hFileOut=FileOpen($sFile,2)
    FileWrite($hFileOut,$afelder[1])
    FileClose($hFileOut)
    EndIf
    Next

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

    Func _gueltigerDateiname($sFN)
    ;hier müssen alle Zeichen entweder ganz entfernt oder mit gültigen z.b.Leerstellen ersetzt werden
    Return StringReplace($sFN,":","")
    EndFunc

    [/autoit]

    Der größte Fehler war der falsche Open Parameter (den ich auch übersehen habe). Die Zeilen mit _ArrayDisplay kannst du auskommentieren wenn du fertig bist, sie dienten mir nur zur Kontrolle, das Grundgerüst steht andere nevtl. noch anzuhängende Daten must du mit dem Verkettenoperator & hinzufügen.

    mfg (Auto)Bert

  • Servus Bert,

    der Wert, der aus dem Array kommt ist in "". EIn StringReplace ($file,"""","") und der Inhalt der Variable kann auch in FileOpen verwendet werden... :rofl:


    Danke für die Unterstützung!! 8)

  • Hallo Skytandem,

    haben eure CSV-Files wirklich nur 2 Zeilen, die Lösung die ich in #11 gepostet (im Spoiler) habe geht auch für große Dateien, aber Hauptsache du hast es geschafft,

    mfg (Auto)Bert