Mehrere Files im Array auslesen und in eine neue CSV Datei schreiben (Hilfe)

  • Hallo liebe Forumnutzer,

    bin neu und musste mich doch noch anmelden, da ich als stiller Beobachter doch nicht alle meine Fragen mithilfe des durchstöbern des Forums lösen konnte.
    Ich hoffe ich werde hier Hilfe finden. :)

    Also zu meinem derzeitigen "Projekt":
    Ich schreibe derzeit ein Skript das mir in einem Order Dateien in ein Array liest. Dann möchte ich jede einzelne Datei die in diesem Ordner ist auslesen und suche nach den Wert zwischen den Tags, siehe Beispiel: <number>Wert1</number> und <wert>wert2</wert>
    Die Werte Wert1 und Wert2 habe ich zugewiesen und möchte diese nun in eine Neue Datei schreiben, trennzeichengetrennt durch ein Semikolon.
    Das wärs auch eigentlich schon^^.
    Mein Code sieht derzeit etwas durcheinander aus, da ich noch ziemlich in den Anfängen von AutoIt bin und mehrere Foren Posts mit in meinen Code geworfen habe, also kann es gut sein, dass ich etwas zu viel mit #include reingeschmissen habe.

    Achja das wichtigste ganz vergessen. Beim ausführen bekomme ich die Fehlermeldung: Fehler: Not Found (Kann die Datei nicht finden obwohl eine da ist.) Benutze ich jetzt den Code für 1 Datei funktioniert es an sich ja aber der Ordner wird im Normalfall viele Dateien haben.

    PS: die Datei aus der ich die Werte lese ist eine .XML und soll später einige werte in eine .csv schreiben bzw. diese erstellen.


    Würde mich über Hilfestellung Freuen.
    Danke und nochmal Danke an die tollen Forumbeiträge die mir auf dem bisherigen Weg geholfen haben. :thumbup:

    Lg Drecunion

    2 Mal editiert, zuletzt von Drecunion (22. Januar 2016 um 16:29)

  • Habs mal umgeschrieben. Das Problem war, dass _FileListToArray ein Array mit Dateien zurückgibt. Du hast so getan, als würde dort eine Datei zurückgegeben werden. Datei und Liste mit Dateien ist halt was anderes :D


    Bei dieser Liste greift man mit $array[NUMMER] auf die Inhalte zu, mit UBound($array) bekommt man die Anzahl der Einträge
    (Einträge fangen bei 0 an, nicht bei 1).

    MfG Kanashius

    EDIT: String include hinzugefügt, $arFiles[$i] korrigiert

  • Danke für deine Schnelle Antwort habe grade kaum zeit das ausgiebig zu testen aber bekomme noch eine Fehlermeldung rein bei deiner Version: bei Zeile 46 error: _StringBetween(): undefined function.
    Bei Zeile 46 und 47 habe ich außerdem $file durch $arFiles ausgetauscht, bekam da nämlich auch eine Fehlermeldung die dann weg ging.
    Ansonsten sieht das ja schon viel besser aus als mein Kauderwelsch :S
    Ach und danke für die Aufklärung mit dem Array. ^^

  • Morgen,

    danke für die Hilfreichen Tipps!
    Leider funktioniert es noch nicht 100%ig.
    Ich kriege folgende Fehlermeldung:

    Code
    Failed Files:
    
    
    20162013_P-Slip.xml
    20162014_P-Slip.xml
    20162015_P-Slip.xml

    Habt Ihr eine Idee woran das liegen könnte?
    Der Dateiname der XML Dateien baut sich wie folgt auf: [Jahr][Bestellnummer]_P-Slip.xml also z.b. 20162013_P-Slip.xml , wobei _P-Slip.xml der Suffix ist
    Folgend ein kleiner Ausschnitt aus der auszulesenden XML Datei

    Spoiler anzeigen


    <Shipments>
    <Shipment>
    <ShipmentNumber>152457</ShipmentNumber>
    <PurchaseOrderNumber>123456789012345</PurchaseOrderNumber>
    <OrderDate>2013-08-01</OrderDate>
    <DeliveryDate>2013-08-02</DeliveryDate>
    <PDF_Attachment>false</PDF_Attachment>
    <CustomerText>Freie Text für Lieferschein und Rechnung</CustomerText>
    <ShipToAddress>
    <Name1></Name1>
    <Name2></Name2>
    <AddressLine1></AddressLine1>
    <AddressLine2><Adresszeile2></AddressLine2>
    <Postcode></Postcode>
    <Place></Place>
    <CountryCode>DE</CountryCode>
    <Phone></Phone>
    <Email>max.mustermann@abc.de</Email>
    </ShipToAddress>
    <NrOfParcels>1</NrOfParcels>
    <Parcels>
    <Parcel>
    <Forwarder>DPD</Forwarder>
    <TrackingID>7001848493</TrackingID>
    </Parcel>
    </Parcels>


    Mein jetziger Code:

    Spoiler anzeigen


    #include <Array.au3>
    #include <File.au3>
    #include <String.au3>
    $arFiles=_getFiles("C:\Users\michel.stober\Desktop\Dropshipping\Skripte\lieferscheine\")
    if @error then
    MsgBox(16,"Error","Folder not found!")
    exit
    endif
    if @extended=1 then
    MsgBox(16,"Error","No Files found!")
    exit
    endif
    $sFailed=_saveDataToFiles($arFiles,"C:\Users\michel.stober\Desktop\Dropshipping\Skripte\lieferscheindörns\")
    if $sFailed<>"" then
    MsgBox(16,"Error","Failed Files: "&@crlf&@crlf&$sFailed)
    endif
    Func _getFiles($path,$rec=false)
    local $arFiles[0]
    if $rec then
    $arFiles=_FileListToArrayRec($path,"*",1,1)
    else
    $arFiles=_FileListToArrayRec($path,"*",1,0)
    endif
    ;wrong path -> setError to 1
    If @error = 1 Then
    SetError(1,0,$arFiles)
    EndIf
    ;no files found -> setExtended to 1
    If @error = 4 Then
    SetError(0,1,$arFiles)
    EndIf
    local $arOnlyFiles[UBound($arFiles)-1]
    for $i=0 to UBound($arOnlyFiles)-1 step 1
    $arOnlyFiles[$i]=$arFiles[$i+1]
    next
    return $arOnlyFiles
    EndFunc
    Func _saveDataToFiles($arFiles,$folder)
    local $sFailedFiles=""
    for $i=0 to UBound($arFiles)-1 step 1
    If FileExists($arFiles[$i]) Then
    local $sBestellNummer="?",$sTrackingNummer="?"
    $sData=FileRead($arFiles[$i])
    $arBestellNummer = _StringBetween($arFiles[$i],'<PurchaseOrderNumber>' , '</PurchaseOrderNumber>')
    $arTrackingNummer = _StringBetween($arFiles[$i],'<TrackingID>','</TrackingID>')
    if UBound($arBestellNummer)<1 then
    $sBestellNummer=$arBestellNummer[0]
    endif
    if UBound($arTrackingNummer)<1 then
    $sTrackingNummer=$arTrackingNummer[0]
    endif
    FileWrite($folder& $sBestellNummer & ".csv", "Bestellnummer" & ";" & "TrackingID" & @CRLF & $sBestellNummer & ";" & $sTrackingNummer)
    Else
    $sFailedFiles&=($sFailedFiles<>""?@crlf:"")&$arFiles[$i]
    EndIf
    next
    return $sFailedFiles
    EndFunc

    Ich hoffe jemand kennt eine Lösung, ich lese schon mehrmals drüber und komme einfach nicht drauf.

    6 Mal editiert, zuletzt von Drecunion (27. Januar 2016 um 11:45)

  • Benütze den Parameter $bReturnPath von _FileListToArray, damit im Array der komplette Pfad & Dateiname enthalten ist. Oder füge bei jedem Zugriff auf eine der Dateinamen noch den Pfad zur Datei mitein.

  • Super Danke autoBert, der Fehler ist weg aber ein neuer wieder da.
    Bin schon den ganzen Mittag am um und rumstellen und komme grade nicht weiter.

    Der Fehler liegt in der Zeile 32 und gibt mir folgende Fehlermeldung

    "C:\Users\michel.stober\Desktop\Dropshipping\Skripte\neuer test mit ds lieferschein.au3" (32) : ==> Variable subscript badly formatted.:
    local $arOnlyFiles[UBound($arFiles)-1]
    local $arOnlyFiles[^ ERROR

    Ich hatte jetzt mehrere Sachen probiert und mit Ubound rumgebastelt aber kam nur zu weiteren Fehlermeldungen. Mit Arrays habe ich noch so meine Probleme und wüsste grad nicht weiter.
    Hat Hier jemand einen Tipp?

    Code wie folgt:

  • Teste einmal:

  • Nochmals Danke das Ihr euch die Zeit nimmt.
    Mittlerweile durchläuft das Programm und erstellt mir meine Datei.
    Nur bin ich jetzt etwas verwirrt.
    Die Erstellte Datei trägt den Namen Lieferscheindörns0 eigentlich soll diese ja aus dem Jahr dann die Bestellnummer und dann dem Suffix bestehen.
    Es werden in die CSV auch nur 0 Werte geschrieben aber genau für 3 Testaufträge wie ich Sie im Ordner hab.
    Woran kann es liegen, dass die Werte nicht korrekt übermittelt werden?
    Ich glaube ich werde hier langsam zum hoffnungslosen Fall :S

    Anbei der jetzige Code:

    • Offizieller Beitrag

    Dein gesamter Code ist total verwirrend!

    Hier mal eine aufgeräumtere und übersichtlichere Variante:

  • Oscar du rettest meinen Tag!
    Besten Dank dafür.
    Musste nur den Mode für FileOpen auf $FO_APPEND ändern und es funktioniert jetzt wie gewünscht besten Dank!

    Es ist interessant zu sehen, wie kurz der Code für mein eigentliches Vorhaben sein kann und werde versuchen meinen Code demnächst aufgeräumter zu gestalten.
    Bin wie gesagt noch ein Neuling in Sachen Autoit. :D

    Also an der Stelle nochmal danke an alle die sich die Haare hier ausgerissen haben.
    Zum Abschluss noch mein Funktionierender Code für alle die sich hierhin verlaufen:

    Einmal editiert, zuletzt von Drecunion (28. Januar 2016 um 09:33)