knotenknut
Goto Top

Per BAT CSV bestimmte Spalten und Zeilen auslesen und übertragen

Hallo Community,

bei der Suche nach einer Antwort für mein Problem bin ich
auf dieses Forum gestoßen und hoffe hier Hilfe zu finden.
Leider glaube ich, um mein Problem zu erläutern. sehr weit ausholen
zu müssen also könnte diese Frage etwas länger formuliert sein.

Ich betreibe, nebenberuflich, einen kleinen Onlinehandel
auf bekannten großen Plattformen.

Ich muss momentan aus kostengründen auf die verwendung
von Warenwirtschaftssoftware etc. verzichten.

Daher lade ich mir gegen nachmittag von den Portalen
jeweils eine CSV Datei herunter in der unter anderem
die Adressen der Käufer zu finden sind. Aber eben auch ein paar
mehr Informationen die ich hier nicht weiter benötige.

Diese Adressen muss ich wiederum allerdings in einer anderen Anordnung in
eine weitere CSV kopieren um dann einen Onlinefrankierungsservice
mit dieser füttern zu können.

Das Endergebniss sind frankierte Etiketten mit Adressen mit denen ich
dann weiter arbeiten kann.
Klingt kompliziert. Ist es im täglich Ablauf aber eigentlich nicht.
Ich hoffe dass ich nicht der einzige bin der verstanden hat was ich
geschrieben habe.. face-smile

Ich verkaufe Waren im Niedrigpreisegment.
Die Verkaufszahlen steigen allmählich an und ich
muss so langsam zu sehen dass ich den Arbeitsaufwand
möglichst minimal halte..
Ich denke dass überall wo Arbeitsabläufe am PC immer
sehr ähnlich verlaufen kommt eine Automatisierung in Frage.

Jetzt die konkrete Frage:
Ist es möglich einer BAT Datei zu sagen:
- Lese SPALTE 1,3,5 und 6 Ab Zeile 2 aus Datei EB.csv
- Schreibe Spalte 1 aus EB.csv in Spalte 2 DPAG.csv beachte dabei in die erste freie Zeile zu schreiben (sprich: bestehende Zeilen bestehen lassen)
- Schreibe Spalte 3 aus EB.csv in Spalte 4 DPAG.csv beachte dabei in die erste freie Zeile zu schreiben (sprich: bestehende Zeilen bestehen lassen)
..usw.
DANN
- Lese SPALTE 1,3,5 und 6 Ab Zeile 2 aus Datei AM.csv
- Schreibe Spalte 6 aus AM.csv in Spalte 2 DPAG.csv beachte dabei in die erste freie Zeile zu schreiben (sprich: bestehende Zeilen bestehen lassen)
- Schreibe Spalte 8 aus AM.csv in Spalte 4 DPAG.csv beachte dabei in die erste freie Zeile zu schreiben (sprich: bestehende Zeilen bestehen lassen)
..usw.

In den Spalten befinden sich je nach Auftragslage natürlich immer mal mehr und mal weniger Zeilen.
Schön wäre wenn es der BAT völlig egal ist ib es 3 oder 50 Zeilen pro Spalte sind die er lesen muss.

Ich muss gestehen sogar beim Verfassen der Frage Probleme zu haben verständlich zu erklären
wie die Abläufe sind.

Ich bin aber für jeden Tipp dankbar und experimentierfreudig.

Ich hoffe das man verstehen konnte was ich meine.
Wenn es überhaupt nicht umsetzbar sein sollte oder
ein zu komplexes Unterfangen wäre, würde ich mich auch hier
über feedback freuen.

Ich bin jetzt schon dankbar face-smile

mfg
Knut

Content-Key: 228480

Url: https://administrator.de/contentid/228480

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: bastla
bastla 02.02.2014, aktualisiert am 01.05.2014 um 19:58:50 Uhr
Goto Top
Hallo knotenknut und willkommen im Forum!

Dein Vorhaben wäre leichter nachvollziehbar, wenn Du die Beschreibung durch Beispiel-Daten (natürlich gerne anonymisiert) ergänzt - dann wüssten wir etwa auch, welche Trennzeichen in den Dateien verwendet werden, ob tatsächlich jeweils 2 Zeilen in der DPAG.csv entstehen sollen und ob/wozu die Spalten 5 und 6 der Dateien EB.csv und AM.csv benötigt werden.

Poste daher bitte jeweils etwa 5 (möglichst charakteristische - Stichwort Sonderzeichen oder leere Spalten) Datensätze (unter Verwendung der "Code"-Formatierung) der einzelnen Dateien ...

Grüße
bastla

P.S.: Hättest Du Einwände gegen die Verwendung von zB VBScript?
Mitglied: Friemler
Friemler 03.02.2014 um 03:07:39 Uhr
Goto Top
Hallo Knut,

Batchscript hat Probleme beim Verarbeiten des Inhalts von Dateien, wenn darin bestimmte Sonderzeichen enthalten sind (z.B. &<>). Deshalb hier ein Vorschlag von mir in VBScript:

back-to-topDas Script

Const ForReading = 1
Const ForWriting = 2


'********** Konfiguration ****************  
'Eingabedatei #1  
strInFile1 = "EB.csv"  
'Spalten-Trennzeichen  
strInDelimiter1 = ";"  
'Startzeile  
intStartLine1 = 2
'Spalten-Mappings  
arrMappings1 = Array(_
                     Array(1,3,5,6),_
                     Array(2,4,6,8)_
                    )

'Eingabedatei #2  
strInFile2 = "AM.csv"  
'Spalten-Trennzeichen  
strInDelimiter2 = ";"  
'Startzeile  
intStartLine2 = 2
'Spalten-Mappings  
arrMappings2 = Array(_
                     Array(6,8,5,7),_
                     Array(2,4,6,8)_
                    )

'Ausgabedatei  
strOutFile = "DPAG.csv"  
'Spalten-Trennzeichen  
strOutDelimiter = ";"  
'Gesamtzahl der Spalten  
intOutCols = 10
'*****************************************  


Set objFSO = CreateObject("Scripting.FileSystemObject")  

'Ausgabedatei öffnen  
Set objOutStream = objFSO.OpenTextFile(strOutFile, ForWriting, true)

'Erste Eingabedatei verarbeiten  
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
                 strInFile1, strInDelimiter1, intStartLine1,_
                 arrMappings1)

'Zweite Eingabedatei verarbeiten  
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
                 strInFile2, strInDelimiter2, intStartLine2,_
                 arrMappings2)

'Ausgabedatei schließen  
objOutStream.Close



Sub ProcessFile(objOutStream, strOutDelim, intOutCols,_
                strInFile, strInDelim, intStartLine,_
                arrMappings)
  Dim intCnt, intMapCnt, intColCnt, arrLine, strOutLine, intSrcCol, intDstCol
  Dim objInStream
  
  If objFSO.FileExists(strInFile) Then
    Set objInStream = objFSO.OpenTextFile(strInFile, ForReading, false)
    
    For intCnt = 1 To intStartLine - 1
      objInStream.SkipLine
    Next

    Do While Not objInStream.AtEndOfStream
      arrLine    = Split(objInStream.ReadLine, strInDelim)
      strOutLine = ""  
      intColCnt  = 1
      
      For intMapCnt = 0 To UBound(arrMappings(0))
        intSrcCol = arrMappings(0)(intMapCnt) - 1
        intDstCol = arrMappings(1)(intMapCnt) - 1
        
        For intCnt = intColCnt To intDstCol
          strOutLine = strOutLine & strOutDelim
        Next
        
        strOutLine = strOutLine & arrLine(intSrcCol)
        intColCnt = intDstCol + 1
      Next
      
      For intCnt = intColCnt To intOutCols - 1
        strOutLine = strOutLine & strOutDelim
      Next
        
      objOutStream.WriteLine(strOutLine)
      Erase arrLine
    Loop
    
    objInStream.Close
  End If
End Sub

back-to-topAufruf

Das Script z.B. als GenAdressen.vbs speichern. Dann kannst Du ein Batchfile mit folgendem Inhalt erstellen und per Doppelklick starten:
cscript /nologo GenAdressen.vbs

back-to-topAnwendung

Die Parameter des Scripts werden in den Zeilen 6 bis 35 konfiguriert (siehe Kommentare). Erklärungsbedürftig sollten eigentlich nur die beiden Arrays arrMappings1 und arrMappings2 sein.

Die Zeilen 13 bis 16 bilden zusammen die Initialisierung des Arrays arrMappings1, entsprechend sind die Zeilen 25 bis 28 für das Array arrMappings2 zuständig. Syntaktisch handelt es sich bei jedem der genannten Blöcke um eine einzige Zeile. VBScript lässt die Aufteilung eines Befehls auf mehrere Zeilen zu, wenn man die einzelnen Zeilen mit dem Zeichen _ (Tiefstrich) abschließt.

In Zeile 14 werden die Nummern der Quellspalten für die erste Eingabedatei angegeben, in Zeile 15 die Nummern der Zielspalten. Die Reihenfolge der Spaltennummern muss miteinander korrespondieren. Im Beispiel wird also Spalte 6 der Quelldatei auf Spalte 8 der Zieldatei gemappt.

Wichtig ist dabei, das die zweite Zeile der Array-Initialisierung (also Zeile 15 bzw. Zeile 27) immer aufsteigend sortiert ist. Somit würde bei der zweiten Eingabedatei Spalte 8 in Spalte 4 der Ausgabedatei geschrieben.

Gruß
Friemler
Mitglied: knotenknut
knotenknut 03.02.2014 um 09:44:19 Uhr
Goto Top
Guten Morgen,

Wow! Also erstmal muss ich sagen dass ich es bewundere wenn jemand sowas beherrscht.
Ich habe immer geglaubt mich mit dem PC gut auszukennen aber DAS hier ist in meinen
Augen die höchste Kunst.
Bedauerlicherweise hab ich von dem was du schreibst so wenig verstanden,
dass ich mir nichteinmal zusammenreimen kann was du meinst face-smile

Ich habe nichts gegen die Verwendung irgendwelcher anderer Scripts und Sprachen
oder sonstiges
so lange dass Ergebniss am Ende eine 1 - Klick Lösung ist.

Ich habe zum besseren Verständniss einmal anonymisierte Beispiele für die
genannten CSV Dateien angefügt. Leider wüsste ich nicht, wie ich diese in den Thread hätte
einbinden können, von daher habe ich Sie im Paket bei einem Sharehoster hochgeladen:

http://www53.zippyshare.com/v/67932671/file.html


Desweiteren versuche ich im folgenden genau zu beschreiben was das Script tun muss.

Es gibt natürlich noch Extras, Ausnahmen und Sonderregelungen aber ich glaube
davon erzähle ich besser erst wenn die "Grundfunktion" anhand dieser "Normalfall Besipiele"
gegeben ist.

Die Anzahl der Spalten in den CSV Dateien ist nicht variabel.
Die Anzahl der Zeilen jedoch schon. Daher sollte es, wenn möglich dem Script völlig Schnuppe
sein wie viele Zeilen in den jeweiligen Dateien zu lesen sind.
Desweiteren beinhaltet die DPAG.CSV wie man sieht schon Informationen in Zeile 1 und 2
Die quasi die Vorlage darstellen und erhaloten bleiben müssen.
Die zusätzlich gelesenen Informationen sollten also immer an den bestehenden Inhalt angehängt werden.
Auch wenn das Script mit dem lesen der EB.CSV fertig ist, sollten die Informationen der
AM.CSV an die Informationen der EB.CSV angehängt werden. Ganz gleich wie viel hier schon steht.
Weil die Zahl der Zeilen immer variable ist, kann ich nicht sagen schreibe den Inhalt
der AM.CSV ab Zeile 4 in die DPAG oder so.

Aus EB.csv:

- Inhalt der Spalte "Name des Käufers" Ab Zeile 3 kopieren und in
DPAG.CSV Spalte "NAME" hinten dran hängen

- Wenn in Spalte "Adresse 2" etwas steht Inhalt der Spalte "Adresse 2" Ab Zeile 3 kopieren und in
DPAG.CSV Spalte "Zusatz" hinten dran hängen. Wenn nichts da steht, dann nichts schreiben und weiter.

- Inhalt der Zeile "Adresse 1" Ab Zeile 3 kopieren und in
DPAG.CSV Spalte "STRASSE" hinten dran hängen.

- Inhalt der Zeile "PLZ" Ab Zeile 3 kopieren und in
DPAG.CSV Spalte "PLZ" hinten dran hängen.

- Inhalt der Zeile "Ort" Ab Zeile 3 kopieren und in
DPAG.CSV Spalte "STADT" hinten dran hängen.

Aus AM.cSV:

- Inhalt der Zeile "recipient-name" Ab Zeile 2 kopieren und in
DPAG.CSV Spalte "NAME" hinten dran hängen.

- Wenn in Spalte "ship-adress-2" oder ship-adresse-3 etwas steht Inhalt der Spalten Ab Zeile 2 kopieren und in
DPAG.CSV Spalte "Zusatz" hinten dran hängen. Wenn nichts da steht, dann nichts schreiben.

- Inhalt der Zeile "ship-adress-1" Ab Zeile 2 kopieren und in
DPAG.CSV Spalte "STRASSE" hinten dran hängen.

- Inhalt der Zeile "ship-postal-code" Ab Zeile 2 kopieren und in
DPAG.CSV Spalte "PLZ" hinten dran hängen.

- Inhalt der Zeile "ship-city" Ab Zeile 2 kopieren und in
DPAG.CSV Spalte "STADT" hinten dran hängen.


Das sind also fürs erste die Schritte die das Script abarbeiten müsste.
Ich hoffe dass man verstehen kann was ich versuche zu beschreiben.
Ich gebe mir große Mühe, dennoch ist es für mich, wie bereits geschrieben,
wirklich kompliziert zu beschreiben.
Von dem was du/ihr da tut (tun könnt) ganz zu schweigen.
Ich habe selber für einfache Automatisierungen schon das
ein oder andere mal eine BAT Datei verwendet.
Aber die Ablaufe waren da bei weitem nicht so kompliziert.
Genauer ging es dort nie über die Abfrage der Uhrzeit und entsprechende Aktionen hinaus.. face-smile

Ich danke euch für die Teilnahme an diesem Thema.
Mitglied: Endoro
Endoro 03.02.2014 um 18:58:07 Uhr
Goto Top
Hey,
das kann gebatcht werden, aber leider artet das in Arbeit aus. Erschwerend kommt hinzu, dass colinardo scheints heut sein gewonnenes Surface feiert face-smile
Versteh mich nicht falsch, ich will mich nicht vorm Scripten drücken, aber warum nimmst du nicht ein Excel/OpenOffice her und erledigst das mit Makros? Das wär einfacher, effizienter und wartbarer als uns hier die Semi-Colons zählen zu lassen face-smile
Gruss!
Mitglied: knotenknut
knotenknut 03.02.2014 um 19:40:28 Uhr
Goto Top
Ich hab Excel und hätte nichts dagegen das da zu scripten.
Allerdings habe ich davon genau so viel Ahnung.
Aber ich seh es mir mal an.
Ich denke wenn ich dabei auf Probleme stoße, bin ich hier im Forum nicht mehr richtig?
oder doch?

lg
Mitglied: Endoro
Endoro 03.02.2014 um 19:45:21 Uhr
Goto Top
Hey,

na ja, nicht hier im Batch-Bereich sondern eher in der Office-Ecke. face-smile
Gruss.
Mitglied: knotenknut
knotenknut 03.02.2014 um 19:57:48 Uhr
Goto Top
Ich danke dir!
und den anderen für die Teilnahme.
Mitglied: Friemler
Friemler 03.02.2014, aktualisiert am 04.02.2014 um 00:30:49 Uhr
Goto Top
Hallo Knut,

Die Anzahl der Spalten in den CSV Dateien ist nicht variabel.
Mein Script kann mit einer beliebigen Anzahl von Spalten arbeiten, sowohl in der/den Quelldatei(en) als auch in der Zieldatei.

Die Anzahl der Zeilen jedoch schon. Daher sollte es, wenn möglich dem Script völlig Schnuppe
sein wie viele Zeilen in den jeweiligen Dateien zu lesen sind.
Meinem Script ist das auch schnuppe.

Desweiteren beinhaltet die DPAG.CSV wie man sieht schon Informationen in Zeile 1 und 2
Die quasi die Vorlage darstellen und erhaloten bleiben müssen.
Die zusätzlich gelesenen Informationen sollten also immer an den bestehenden Inhalt angehängt werden.
Davon hast Du in Deinem Eröffnungsposting nichts erwähnt, lässt sich aber leicht nachrüsten.

Auch wenn das Script mit dem lesen der EB.CSV fertig ist, sollten die Informationen der
AM.CSV an die Informationen der EB.CSV angehängt werden. Ganz gleich wie viel hier schon steht.
Genau das macht mein Script sowieso schon.

Weil die Zahl der Zeilen immer variable ist, kann ich nicht sagen schreibe den Inhalt
der AM.CSV ab Zeile 4 in die DPAG oder so.
Das ist auch nicht nötig.


Ich habe das Script aus meinem ersten Posting etwas erweitert, sodass folgende zusätzliche Anforderungen erfüllt werden:

  • Die DPAG.csv wird nicht mehr überschrieben wird. Stattdessen werden alle aus den Eingabedateien gelesenen Daten an die Datei angehängt.
  • Die Eingabedateien werden nur noch so lange eingelesen, bis eine leere Zeile auftaucht, dann wird abgebrochen. Dadurch werden die überflüssigen Zeilen in der EB.csv nicht verarbeitet.
  • Wenn in eine Spalte der Ausgabedatei mehrere Werte eingetragen werden, wird zwischen die beiden Werte ein Leerzeichen eingefügt. Dadurch können die Spalten ship-adresse-2 und ship-adresse-3 aus der AM.csv in eine Spalte der Ausgabedatei geschrieben werden.
  • Wenn die Spalte 3 der Ausgabedatei beschrieben wird, wird eine ggf. vorhandene Hausnummer extrahiert und in die Spalte 4 geschrieben. Die Hausnummer kann auch Buchstaben enthalten, also z.B. so etwas wie 46a oder 34 b.

Ich habe auch die Konfiguration so angepasst, dass die von Dir formulierten Anforderungen aus Deinem letzten Posting erfüllt werden.

BTW: Diese Konfigurationsänderungen hättest Du auch selbst vornehmen können, genau deshalb habe ich das Script so flexibel entworfen. Du musst nur die Nummern der von Dir genannten Spalten durch Abzählen ermitteln und die Arrays in den Zeilen 14 u. 15 bzw. 26 u. 27 damit füllen. Und nicht vergessen, die Gesamtanzahl der Spalten in der DPAG.csv in Zeile 39 und die Nummer der Spalte mit der Strasse in Zeile 35 eintragen.

Ich habe durch meinen Job wenig Zeit, hier im Forum aktiv zu sein, es kann deshalb sein, dass ich mich auch mal ein paar Tage nicht melde. Wenn jemand anderes übernehmen möchte, kann er das gerne tun.

Hier jetzt das aktualisierte Script:
Const ForReading   = 1
Const ForAppending = 8


'********** Konfiguration ****************  
'Eingabedatei #1  
strInFile1 = "EB.csv"  
'Spalten-Trennzeichen  
strInDelimiter1 = ";"  
'Startzeile  
intStartLine1 = 3
'Spalten-Mappings  
arrMappings1 = Array(_
                     Array(3,7,6,10,8),_
                     Array(1,2,3, 5,6)_
                    )

'Eingabedatei #2  
strInFile2 = "AM.csv"  
'Spalten-Trennzeichen  
strInDelimiter2 = ";"  
'Startzeile  
intStartLine2 = 2
'Spalten-Mappings  
arrMappings2 = Array(_
                     Array(17,19,20,18,23,21),_
                     Array( 1, 2, 2, 3, 5, 6)_
                    )

'Ausgabedatei  
strOutFile = "DPAG.csv"  
'Spalten-Trennzeichen  
strOutDelimiter = ";"  
'Nummer der Spalte mit der Strasse  
intOutStreetCol = 3
'Nummer der Spalte mit der PLZ  
intOutPLZCol = 5
'Gesamtzahl der Spalten  
intOutCols = 8
'*****************************************  


Set objFSO = CreateObject("Scripting.FileSystemObject")  

'Ausgabedatei öffnen  
Set objOutStream = objFSO.OpenTextFile(strOutFile, ForAppending, true)

'Erste Eingabedatei verarbeiten  
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
                 strInFile1, strInDelimiter1, intStartLine1,_
                 arrMappings1)

'Zweite Eingabedatei verarbeiten  
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
                 strInFile2, strInDelimiter2, intStartLine2,_
                 arrMappings2)

'Ausgabedatei schließen  
objOutStream.Close



Sub ProcessFile(objOutStream, strOutDelim, intOutCols,_
                strInFile, strInDelim, intStartLine,_
                arrMappings)
  Dim intCnt, intMapCnt, intColCnt, arrLine, strOutLine, strStreet, strHouseNumber
  Dim intSrcCol, intDstCol
  Dim objInStream
  
  If objFSO.FileExists(strInFile) Then
    Set objInStream = objFSO.OpenTextFile(strInFile, ForReading, false)
    
    For intCnt = 1 To intStartLine - 1
      objInStream.SkipLine
    Next

    Do While Not objInStream.AtEndOfStream
      arrLine    = Split(objInStream.ReadLine, strInDelim)
      strOutLine = ""  
      intColCnt  = 1
      
      If IsEmptyLine(arrLine) Then Exit Do
      
      For intMapCnt = 0 To UBound(arrMappings(0))
        intSrcCol = arrMappings(0)(intMapCnt) - 1
        intDstCol = arrMappings(1)(intMapCnt) - 1
        
        For intCnt = intColCnt To intDstCol
          strOutLine = strOutLine & strOutDelim
        Next
        
        If intColCnt             > intDstCol   And _
           arrLine(intSrcCol)   <> ""          And _  
           Len(strOutLine)       > 0           And _
           Right(strOutLine, 1) <> strOutDelim Then
          strOutLine = strOutLine & " "  
        End If
        
        If intDstCol + 1 = intOutPLZCol Then
          arrLine(intSrcCol) = Right("00000" & arrLine(intSrcCol), 5)  
        End If

        If intDstCol + 1 = intOutStreetCol Then
          strStreet = arrLine(intSrcCol)
          Call ExtractHouseNumber(strStreet, strHouseNumber)

          strOutLine = strOutLine & strStreet & strOutDelim & strHouseNumber
          intColCnt  = intDstCol + 2
        Else
          strOutLine = strOutLine & arrLine(intSrcCol)
          intColCnt  = intDstCol + 1
        End If
      Next
      
      For intCnt = intColCnt To intOutCols - 1
        strOutLine = strOutLine & strOutDelim
      Next
        
      objOutStream.WriteLine(strOutLine)
      Erase arrLine
    Loop
    
    objInStream.Close
  End If
End Sub


Function IsEmptyLine(arrLine)
  Dim intCnt
  
  For intCnt = 0 To UBound(arrLine)
    If arrLine(intCnt) <> "" Then Exit For  
  Next

  IsEmptyLine = (intCnt > UBound(arrLine))
End Function


Sub ExtractHouseNumber(ByRef strStreet, ByRef strHouseNumber)
  Dim objRegEx, colMatches
  
  strStreet      = Trim(strStreet)
  strHouseNumber = ""  
  
  Set objRegEx        = New RegExp
  objRegEx.IgnoreCase = True
  objRegEx.Pattern    = "([^0-9]*)([0-9]*[a-z ]*)"  

  Set colMatches = objRegEx.Execute(strStreet)
  
  If colMatches.Count > 0 Then
    If colMatches(0).SubMatches.Count > 1 Then
      strStreet      = Trim(colMatches(0).SubMatches(0))
      strHouseNumber = Trim(colMatches(0).SubMatches(1))
    End If
  End If
End Sub

Gestartet wird es, wie schon oben erwähnt, mit dem Befehl
cscript /nologo "PfadUndNameDesScripts.vbs"
Du musst es nur mit der Dateierweiterung VBS speichern, in das gleiche Verzeichnis, in dem die Dateien liegen, mit denen es arbeiten soll. Oder Du gibst in den Zeilen 7, 19 und 31 die absoluten Pfade zu den Dateien an.

Gruß
Friemler

[EDIT]
Kleine Fehlerkorrektur ergänzt
[/EDIT]

[EDIT2]
Anpassungen an Wünsche des TO
[/EDIT2]
Mitglied: knotenknut
knotenknut 03.02.2014 um 22:26:33 Uhr
Goto Top
Also die Sache mit den Makro scheint nicht der richtig Weg zu sein.
Es scheint mir nicht unbedingt flexible was Zeilenzahlen angeht.. etc.

@Friemler: WOW!
Ich danke dir, das Script ist jetzt schon genial!
Es gibt natürlich noch nen paar Probleme.
Das Heraustrennen der Hausnummer wäre nicht nötig gewesen, da es auch funktioniert wenn alles in der Spalte "Straße" steht.
Aber wenn das Script das tut, auch gut! face-smile

Das Script scheint Probleme mit Sonderzeichen zu haben.
Wenn einer meiner Kunden seine Adresse so angibt Musterstraße 3 funktioniert es perfekt.
Schreibt er aber Musterstr. 3 oder gar etwas wie Musterstr:3 kopiert das Script erstmal garnichts.

Dann gibt es den ersten kleinen Ausnahmefall.
Beinahe täglich gibt es Fälle in denen 1 Kunde 2 oder mehr Artikel bestellt.
Im Verkaufsbereicht EB.csv sieht das dann so aus:

Nutzername Vorname Name 000000 mail@mail.com Straße 1 Ort ... Artikel 1
Nutzername ... Artikel 2
Nutzername ... Artikel 3

Sprich der Nutzername wird zwar pro Artikel einmal geschrieben, die restlichen Angaben bleiben aber leer.
Natürlich meint dein Script hier wäre Ende.. weil Zeile leer. Kann man das ändern, oder müsste ich die EB.csv vorher bearbeiten?

Dann gibt es noch 1,2 Dinge bzgl. der Postleitzahlen und dem Land.
Generell neigen CSV Dateien Dazu eine 0 vor einer Zahlen Kombination einfach weg zu lassen.
Das ist Kontraproduktiv bei z.b. Ostdeutschen PLZ die gerne mit 0 beginnen.
Besteht die Möglichkeit dem Script zu sagen PLZ sind immer 5 stellig. Wenn mal eine 4 Stellig in der EB oder AM.csv ist, setzte eine 0 vorne dran.
Ich löse das im Arbeitsablauf so:
PLZ Spalte markieren Zellen formatieren und dann sage ich das der Inhalt dieser Zeilen "Text" ist und nicht "Zahl".
Klappt... nur öffnen darf ich die CSV dann nicht nochmal sonst wird das wieder überschrieben.

Und dann gibt es noch den Sonderfall Ausland.
und einen paar Kleinigkeiten die das betreffen aber ich glaube dazu komme ich besser später sonst ufert es wieder aus.

Ich bin jetzt schon sehr dankbar und begeistert für/über deine/eure Arbeit.
Es geht auf jeden Fall in die richtige Richtung.
beim Starten des Scripts und anschließendem öffnen der DPAG.csv habe ich mich richtig über
das Ergebnis gefreut.

Wünsche eine angenehme Nachtruhe.
Mitglied: Friemler
Friemler 04.02.2014 aktualisiert um 00:44:47 Uhr
Goto Top
Hallo Knut,

ich habe das Script aktualisiert.

Der Fehler btr. Sonderzeichen im Straßennamen ist behoben, auch die Postleitzahlen sollten jetzt immer 5-stellig sein.

Das von Dir geschilderte Fehlverhalten (Abbruch der Eingabedatei-Verarbeitung) bei der Ausnahme "Kunde hat mehr als einen Artikel bestellt" kann ich hier nicht nachvollziehen. Bei mir entsteht dann eine Zeile mit 7 Semikola (nach den Änderungen steht jetzt zwischen dem 4. und 5. Semikolon eine Kolonne von 5 Nullen wegen der nichtvorhandenen Postleitzahl). Das musst Du bitte nochmal genauer erläutern. Kann/Muss eine solche Zeile nicht ignoriert werden (zumindest für den Frankierservice)?

Verwende für das Posting von Daten und Code bitte die Codeformatierung, Deine obigen Angaben bzgl. des Ausnahmefalls sind nicht sehr informativ, da die Formatierung bei der Darstellung als normaler Text verloren geht.

Gruß
Friemler
Mitglied: knotenknut
knotenknut 04.02.2014 um 13:31:56 Uhr
Goto Top
Friemler du bist großartig.
Ohne schleimen zu wollen, muss ich sagen dass ich dein Können aufrichtig bewundere.
Die Korrektur der Adressen Sache funktioniert einwandfrei.

Bei der Hausnummernabtrennung gibt es ein Problem wenn der Straßenname bereits eine Zahl beeinhaltet.
Als Beispiel wäre die Anschrift:
Straße 189 24
zu nennen.
Leider gibt es solche Straßen tatsächlich..
Ist das änderbar?
Wenn nicht, genügt es die Hausnummernabtrennung zu entfernen und Straße inkl. Hausnummer in die Spalte "Straße" schreiben zu lassen.


Wenn ein Kunde mehrere Artikel bestellt sieht das in der EB.csv so aus:

"456";"User";"Vorname Name";"00000";"mail@mail.com";"Straße. 11";"";"Ort";"default";"PLZ";"Deutschland";"";"";"";"2";"EUR 2,00";"0%";"EUR 0,00";"EUR 0,00";"";"EUR 11,00";"PayPal";"31.01.14";"31.01.14";"31.01.14";"";"";"";"";"";"";"00000000";"Deutsche Post Brief";"";"";"0000000";""  
"456";"User";"";"";"";"";"";"";"";"";"";"00000";"Artikel1";"Stück";"1";"EUR 1,50";"";"";"";"";"";"";"30.01.14";"";"";"";"";"";"Ja";"";"";"";"";"";"000000";"000000";""  
"456";"User";"";"";"";"";"";"";"";"";"";"00000";"Artikel2";"Stück";"1";"EUR 1,50";"";"";"";"";"";"";"31.01.14";"";"";"";"";"";"Ja";"";"";"";"";"";"000000";"000000";""  

 
Insgesamt also 3 Zeilen mit jeweils der z.B. "456" davor, welche die Nummer das Datensatzes auf besagtem Portal darstellt.
Dein Script stoppt an dieser Stelle und schreibt garnichts mehr. Auch nicht den ersten.
Entferne ich via Excel die beiden zusätzlichen Zeilen, funktioniert das Script tadellos.
Was passieren sollte:
Für den Kunden muss, ganz gleich viele Artikel er bestellt hat, nur eine Eintragung in die DPAG.csv gemacht werden dann weiter zum nächsten Kunden.

3 weitere Dinge:
1. Ist es möglich per Script nach National und International zu sortieren, und in entsprechend unterschiedliche Dateien zu schreiben?. meinetwegen DPAG.csv und DPAG Ausland.CSV?
Die EB.csv enthält in der Spalte "Land" entsprechende Informationen.

In der AM.csv steht die Information zum Land auch.
Hier heißt es Allerdings ship-country und die Ländernamen werden anders als in der EB.csv nicht ausgeschrieben sondern abgekürzt.

2. Ist möglich hinter jedem Eintrag in den resultierenden CSV Dateienn der Spalte Land entsprechende Abkürzung Automatisch einzutragen.
Sprich in der DPAG.csv ist wäre es dann ja immer DE
und in der DPAG Ausland.csv wären momentan eigentlich nur AT und CH relevant.
Desweiteren wäre es großartig wenn das Script in die resultierenden CSV Dateien in jeder Zeile, in der Spalte ADRESS_TYP "HOUSE" schreiben würde. (ohne die "")

und 3. Ist es möglich dass das Script bevor es etwas schreibt den Kompletten Inhalt der DPAG und der DPAG Ausland.csv cleared (bis auf die ersten beiden Zeilen, die ja immer gleich sind) ?

Ich kann dir nicht genug danken.

mfg
Knut
Mitglied: Friemler
Friemler 04.02.2014 aktualisiert um 17:07:37 Uhr
Goto Top
Hallo Knut,

ich habe das Script Deinen Anforderungen entsprechend umgeschrieben:

  1. Die Abtrennung der Hausnummer vom Straßennamen habe ich entfernt, da ich keine Methode gefunden habe, die bei allen möglichen Adressen sauber funktioniert, auch wenn eine Adresse fehlerhaft angegeben wurde (z.B. kein Leerzeichen zwischen Straßenname und Hausnummer).
  2. Es werden jetzt zwei Ausgabedateien erstellt, eine für deutsche und eine für ausländische Kunden.
  3. Die alten Inhalte der Ausgabedateien werden unter Beibehaltung der ersten 2 Zeilen gelöscht.
  4. Der Adresstyp "HOUSE" wird in jede Zeile der Ausgabedateien eingetragen.
  5. Wenn in einer Zeile der Eingabedatei kein Kundenname angegeben ist, wird für diese Zeile kein Eintrag in der Ausgabedatei erzeugt. Somit sollte der Fall "Kunde bestellt mehr als einen Artikel" nur noch zu einem Eintrag in der Ausgabedatei führen. Zumindest für Einträge aus der EB.csv, für die AM.csv hast Du noch keine Angaben für diesen Fall gemacht. Ich konnte übrigens das von Dir geschilderte Fehlverhalten (Script stoppt und schreibt keine Einträge) auch mit den von Dir geposteten Testdaten nicht reproduzieren.
  6. In die Spalte "LAND" der Ausgabedateien wird ein Ländercode eingetragen. Der Inhalt des Arrays arrCountryMappings in Zeile 60 legt die Zuordnung der Länderbezeichnungen in den Eingabedateien zum Ländercode in der Ausgabedatei fest. Hier musst Du evtl. jetzt oder später weitere Zuordnungen ergänzen! Die Groß-/Kleinschreibung spielt dabei keine Rolle. Folgende Zuordnungen sind z.Z. gesetzt:

    • Länderspalte leer -> DE
    • Deutschland -> DE
    • DE -> DE
    • Österreich -> AT
    • AT -> AT
    • Schweiz -> CH
    • CH -> CH

Außerdem habe ich das Script mit Kommentaren versehen, was zum besseren Verständnis beitragen kann.

Hier der Code:
Option Explicit


Const ForReading = 1
Const ForWriting = 2


Dim strInFile1, strInDelimiter1, intStartLine1, arrMappings1
Dim strInFile2, strInDelimiter2, intStartLine2, arrMappings2

Dim strOutFileDE, strOutFileFC, strOutDelimiter
Dim intOutPLZCol, intOutCountryCodeCol, intOutAdrTypeCol, intOutTotalCols

Dim arrCountryMappings

Dim objFSO, objOutStreamDE, objOutStreamFC



'********** Konfiguration ****************  
'Eingabedatei #1  
strInFile1 = "EB.csv"  
'Spalten-Trennzeichen  
strInDelimiter1 = ";"  
'Startzeile  
intStartLine1 = 3
'Spalten-Mappings  
arrMappings1 = Array(_
                     Array(3,7,6,10,8,11,1),_
                     Array(1,2,3, 5,6, 7,8)_
                    )

'Eingabedatei #2  
strInFile2 = "AM.csv"  
'Spalten-Trennzeichen  
strInDelimiter2 = ";"  
'Startzeile  
intStartLine2 = 2
'Spalten-Mappings  
arrMappings2 = Array(_
                     Array(17,19,20,18,23,21,24,1),_
                     Array( 1, 2, 2, 3, 5, 6, 7,8)_
                    )

'Ausgabedateien  
strOutFileDE = "DPAG.csv"  
strOutFileFC = "DPAG Ausland.csv"  
'Spalten-Trennzeichen  
strOutDelimiter = ";"  
'Nummer der Spalte mit der PLZ  
intOutPLZCol = 5
'Nummer der Spalte mit dem Länderkürzel  
intOutCountryCodeCol = 7
'Nummer der Spalte mit dem Adresstyp  
intOutAdrTypeCol = 8
'Gesamtzahl der Spalten  
intOutTotalCols = 8

'Länderkürzel  
arrCountryMappings = Array(_
                           Array(""  ,"Deutschland","DE","Österreich","AT","Schweiz","CH"),_  
                           Array("DE","DE"         ,"DE","AT"        ,"AT","CH"     ,"CH")_  
                          )
'*****************************************  


Set objFSO = CreateObject("Scripting.FileSystemObject")  

If Not FileExists(strOutFileDE) Then WScript.Quit
If Not FileExists(strOutFileFC) Then WScript.Quit

'Ausgabedateien initialisieren  
Set objOutStreamDE = InitOutFile(strOutFileDE)
Set objOutStreamFC = InitOutFile(strOutFileFC)

'Erste Eingabedatei verarbeiten  
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
                 strInFile1, strInDelimiter1, intStartLine1,_
                 arrMappings1)

'Zweite Eingabedatei verarbeiten  
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
                 strInFile2, strInDelimiter2, intStartLine2,_
                 arrMappings2)

'Ausgabedateien schließen  
objOutStreamDE.Close
objOutStreamFC.Close



Sub ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelim, intOutTotalCols,_
                strInFile, strInDelim, intStartLine,_
                arrMappings)
  Dim intCnt, intMapCnt, intColCnt
  Dim arrLine, strOutLine, strCountryCode
  Dim intSrcCol, intDstCol
  Dim bolIsGermanCustomer
  Dim objInStream
  
  'Prüfen ob die Eingabedatei existiert  
  If objFSO.FileExists(strInFile) Then
    'Flag initialisieren  
    bolIsGermanCustomer = True
    
    'Eingabedatei zum Lesen öffnen  
    Set objInStream  = objFSO.OpenTextFile(strInFile, ForReading, false)
    
    'Soviele Zeilen überspringen, bis die gewünschte Startzeile erreicht ist   
    For intCnt = 1 To intStartLine - 1
      objInStream.SkipLine
    Next

    'Eingabedatei einlesen bis das Dateiende erreicht ist  
    Do While Not objInStream.AtEndOfStream
      'Eine Zeile einlesen, anhand des Trennzeichens zerteilen  
      'und in Array speichern  
      arrLine = Split(objInStream.ReadLine, strInDelim)
      
      'Zeilenpuffer für die Ausgabe löschen  
      strOutLine = ""  
      
      'Spaltenzähler für jede Eingabezeile neu initialisieren  
      intColCnt = 1
      
      'Wenn die eingelesene Zeile leer ist, das Einlesen der Datei beenden  
      If IsEmptyLine(arrLine) Then Exit Do
      
      'Alle Spalten-Mappings verarbeiten  
      For intMapCnt = 0 To UBound(arrMappings(0))
        'Quell- und Zielspalte ermitteln  
        intSrcCol = arrMappings(0)(intMapCnt) - 1
        intDstCol = arrMappings(1)(intMapCnt) - 1
        
        'Falls notwendig, den Zeilenpuffer bis zur  
        'ermittelten Zielspalte mit Leerzellen auffüllen  
        For intCnt = intColCnt To intDstCol
          strOutLine = strOutLine & strOutDelim
        Next
        
        'Falls in die Zielspalte bereits etwas eingetragen wurde,  
        'ein Leerzeichen an den Zeilenpuffer anhängen  
        If intColCnt             > intDstCol   And _
           arrLine(intSrcCol)   <> ""          And _  
           Len(strOutLine)       > 0           And _
           Right(strOutLine, 1) <> strOutDelim Then
          strOutLine = strOutLine & " "  
        End If
        
        'Dafür sorgen, dass in der Spalte für Postleitzahlen  
        'immer 5 Ziffern stehen  
        If intDstCol + 1 = intOutPLZCol Then
          arrLine(intSrcCol) = Right("00000" & arrLine(intSrcCol), 5)  
        End If

        'Aus dem Inhalt der Quellspalte mit dem Land der Versandadresse  
        'einen Ländercode erzeugen und ein Flag setzen, ob es sich um  
        'einen deutschen oder ausländischen Kunden handelt  
        If intDstCol + 1 = intOutCountryCodeCol Then
          strCountryCode     = CountryCode(arrLine(intSrcCol))
          arrLine(intSrcCol) = strCountryCode
          
          If StrComp(strCountryCode, "DE", vbTextCompare) = 0 Then  
            bolIsGermanCustomer = True
          Else
            bolIsGermanCustomer = False
          End If
        End If

        'In die Spalte mit dem Adresstyp den Wert "HOUSE" schreiben  
        If intDstCol + 1 = intOutAdrTypeCol Then
          arrLine(intSrcCol) = "HOUSE"  
        End If

        'Jetzt den Spaltenwert in den Zeilenpuffer übertragen  
        strOutLine = strOutLine & arrLine(intSrcCol)
        
        'Spaltenzähler auf die Nummer der Spalte setzen,  
        'die nach der gerade beschriebenen Spalte kommt  
        intColCnt  = intDstCol + 1
      Next
      
      'Falls notwendig, den Zeilenpuffer bis zur  
      'vorgegebenen Endspalte mit Leerzellen auffüllen  
      For intCnt = intColCnt To intOutTotalCols - 1
        strOutLine = strOutLine & strOutDelim
      Next
        
      'Den Zeilenpuffer nur in die Ausgabedatei schreiben,  
      'wenn die Namensspalte nicht leer ist  
      If Left(strOutLine, 1) <> strOutDelim Then
        'Jetzt anhand des oben gesetzten Flags entscheiden, in welche  
        'der beiden Ausgabedateien der Zeilenpuffer geschrieben wird  
        If bolIsGermanCustomer Then
          objOutStreamDE.WriteLine(strOutLine)
        Else
          objOutStreamFC.WriteLine(strOutLine)
        End If
      End If
      
      'Speicher des Arrays mit der Eingabezeile freigeben  
      Erase arrLine
    Loop
    
    'Eingabedatei schließen  
    objInStream.Close
  End If
End Sub


Function FileExists(strFile)
  If objFSO.FileExists(strFile) Then
    FileExists = True
  Else
    MsgBox "Die Datei" & vbNewLine & _  
           strFile & vbNewLine & _
           "existiert nicht!", _  
           vbCritical + vbOKOnly + vbDefaultButton1, _
           WScript.ScriptName

    FileExists = False
  End If
End Function


Function InitOutFile(strOutFile)
  Dim objInStream, objOutStream, strFirstTwoLines
  
  'Ausgabedatei zum Lesen öffnen und die ersten zwei Zeilen auslesen  
  Set objInStream  = objFSO.OpenTextFile(strOutFile, ForReading, false)
  strFirstTwoLines = objInStream.ReadLine & vbNewLine & _
                     objInStream.ReadLine & vbNewLine
  objInStream.Close

  'Ausgabedatei zum Schreiben öffnen und die ersten zwei Zeilen schreiben  
  Set objOutStream = objFSO.OpenTextFile(strOutFile, ForWriting, true)
  objOutStream.Write(strFirstTwoLines)
  
  Set InitOutFile = objOutStream
End Function


Function IsEmptyLine(arrLine)
  Dim intCnt
  
  For intCnt = 0 To UBound(arrLine)
    If arrLine(intCnt) <> "" Then Exit For  
  Next

  IsEmptyLine = (intCnt > UBound(arrLine))
End Function


Function CountryCode(strCountryName)
  Dim intCnt
  
  CountryCode = ""  
  
  For intCnt = 0 To UBound(arrCountryMappings(0))
    If StrComp(arrCountryMappings(0)(intCnt), strCountryName, vbTextCompare) = 0 Then
      CountryCode = arrCountryMappings(1)(intCnt)
      Exit For
    End If
  Next
End Function

Gruß
Friemler
Mitglied: knotenknut
knotenknut 04.02.2014 um 17:46:26 Uhr
Goto Top
Danke Friemler.


Wie es sich bei mehreren Artikeln für einen Kunden in der AM.csv verhalt hab ich nicht
erwähnt weil ich es selbst noch nicht erlebt habe und daher nicht darüber sagen kann.

Das Script schreibt nun garnichts aus der EB.csv.
Hier mal die komplette, anonymisierte EB.csv die die entsprechenden Probleme enthält:

"	Verkaufsprotokollnummer";Mitgliedsname;Name des Käufers;Telefonnummer;E-Mail-Adresse;Adresse 1;Adresse 2;Ort;Region;PLZ;Land;Artikelnummer;Artikelbezeichnung;Bestandseinheit;Stückzahl;Preis;MwSt.-Satz;Verpackung und Versand;Versicherung;Nachnahmekosten;Gesamtpreis;Zahlungsmethode;Verkauft am;Datum der Kaufabwicklung;Zahlungsdatum;Versanddatum;Rechnungsdatum;Rechnungsnummer;Abgegebene Bewertung;Erhaltene Bewertung;Notizzettel;PayPal-Transaktions-ID;Versandservice;Option ?Nachnahme?;Transaktions-ID;Bestellnummer;Variantendetails  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
421;1;Name 1;0;mail@mail.com;Straße 1;;Stadt 1;default;11111;Deutschland;0;Artikel 1;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;Überweisung;28.01.2014;28.01.2014;03.02.2014;;;;Ja;;;;Deutsche Post Brief;;0;;
443;2;Name 2;;mail@mail.com;Straße 2;;Stadt 2;default;11111;Deutschland;0;Artikel 2;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;Überweisung;30.01.2014;30.01.2014;03.02.2014;;;;Ja;;;;Deutsche Post Brief;;0;;
444;3;Name 3;0;mail@mail.com;Straße 3;;Stadt 3;default;11111;Deutschland;0;Artikel 3;Stück;1;EUR 9,89;19%;EUR 0,00;EUR 0,00;;EUR 9,89;Überweisung;30.01.2014;30.01.2014;03.02.2014;;;;Ja;;;;Deutsche Post Brief;;0;;
454;4;Name 4;0;mail@mail.com;Straße 4;;Stadt 4;default;11111;Deutschland;0;Artikel 4;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;31.01.2014;31.01.2014;31.01.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
455;5;Name 5;0;mail@mail.com;Straße 5;;Stadt 5;default;2222;Deutschland;0;Artikel 5;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;31.01.2014;31.01.2014;31.01.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
456;6;Name 6;0;mail@mail.com;Straße 6;;Stadt 6;default;11111;Deutschland;;;;2;EUR 11,00;0%;EUR 0,00;EUR 0,00;;EUR 11,00;PayPal;31.01.2014;31.01.2014;31.01.2014;;;;;;;0;Deutsche Post Brief;;;0;
456;7;;;;;;;;;;0;Artikel 6;Stück;1;EUR 5,50;;;;;;;30.01.2014;;;;;;Ja;;;;;;0;0;
456;8;;;;;;;;;;0;Artikel 7;Stück;1;EUR 5,50;;;;;;;31.01.2014;;;;;;Ja;;;;;;0;0;
457;9;Name 7;0;mail@mail.com;Straße 7;;Stadt 7;default;11111;Deutschland;0;Artikel 8;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;01.02.2014;01.02.2014;01.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
458;10;Name 8;;mail@mail.com;Straße 8;;Stadt 8;NotProvided;11111;Deutschland;0;Artikel 9;Stück;1;EUR 9,89;19%;EUR 0,00;EUR 0,00;;EUR 9,89;PayPal;01.02.2014;01.02.2014;01.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
459;11;Name 9;0;mail@mail.com;Straße 9;;Stadt 9;default;11111;Deutschland;0;Artikel 10;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;01.02.2014;01.02.2014;01.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
460;12;Name 10;0;mail@mail.com;Straße 10;;Stadt 10;default;11111;Deutschland;0;Artikel 11;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;01.02.2014;01.02.2014;01.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
461;13;Name 11;0;mail@mail.com;Straße 11;;Stadt 11;default;11111;Deutschland;0;Artikel 12;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;01.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
462;14;Name 12;;mail@mail.com;Straße 12;;Stadt 12;default;11111;Deutschland;0;Artikel 13;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;01.02.2014;01.02.2014;01.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
463;15;Name 13;;mail@mail.com;Straße 13;;Stadt 13;NOTPROVIDED;11111;Deutschland;0;Artikel 14;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;01.02.2014;01.02.2014;01.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
464;16;Name 14;;mail@mail.com;Straße 14;;Stadt 14;default;11111;Deutschland;0;Artikel 15;Stück;1;EUR 9,89;19%;EUR 0,00;EUR 0,00;;EUR 9,89;PayPal;01.02.2014;01.02.2014;01.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
467;17;Name 15;0;mail@mail.com;Straße 15;;Stadt 15;default;11111;Deutschland;0;Artikel 16;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;02.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
468;18;Name 16;0;mail@mail.com;Straße 16;;Stadt 16;default;11111;Deutschland;0;Artikel 17;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;02.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
472;19;Name 17;0;mail@mail.com;Straße 17;;Stadt 17;default;11111;Deutschland;0;Artikel 18;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;Überweisung;02.02.2014;02.02.2014;03.02.2014;;;;Ja;;;;Deutsche Post Brief;;0;;
473;20;Name 18;0;mail@mail.com;Straße 18;;Stadt 18;default;11111;Deutschland;0;Artikel 19;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;02.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
474;21;Name 19;0;mail@mail.com;Straße 19;;Stadt 19;default;11111;Deutschland;0;Artikel 20;Stück;1;EUR 7,89;19%;EUR 0,00;EUR 0,00;;EUR 7,89;PayPal;02.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
477;22;Name 20;0;mail@mail.com;Straße 20;;Stadt 20;default;2222;Deutschland;0;Artikel 21;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;02.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
478;23;Name 21;0;mail@mail.com;Straße 21;;Stadt 21;default;11111;Deutschland;0;Artikel 22;Stück;1;EUR 7,89;19%;EUR 0,00;EUR 0,00;;EUR 7,89;PayPal;02.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
481;24;Name 22;0;mail@mail.com;Straße 22;bei Name;Stadt 22;default;11111;Deutschland;0;Artikel 23;Stück;1;EUR 5,50;19%;EUR 0,00;EUR 0,00;;EUR 5,50;PayPal;02.02.2014;02.02.2014;02.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
482;25;Name 23;0;mail@mail.com;Straße 23;;Stadt 23;default;11111;Deutschland;0;Artikel 24;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;03.02.2014;03.02.2014;03.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
483;26;Name 24;0;mail@mail.com;Straße 24;;Stadt 24;default;11111;Deutschland;0;Artikel 25;Stück;1;EUR 5,89;19%;EUR 0,00;EUR 0,00;;EUR 5,89;PayPal;03.02.2014;03.02.2014;03.02.2014;;;;Ja;;;0;Deutsche Post Brief;;0;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24; Verkaufsprotokoll(e) heruntergeladen;von ;28.01.2014;11:29:56; bis ;03.02.2014;11:27:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mitgliedsname des Verkäufers: 0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

Und hier mal eine AM.csv mit einem Österreicher:

order-id;order-item-id;purchase-date;payments-date;reporting-date;promise-date;days-past-promise;buyer-email;buyer-name;buyer-phone-number;sku;product-name;quantity-purchased;quantity-shipped;quantity-to-ship;ship-service-level;recipient-name;ship-address-1;ship-address-2;ship-address-3;ship-city;ship-state;ship-postal-code;ship-country
1;8,00E+00;2014-02-01T08:51:18+00:00;2014-02-01T08:51:18+00:00;2014-02-01T09:21:37+00:00;2014-02-04T22:59:59+00:00;-2;mail@mail.com;Name 1;1;1;Artikel 1;1;0;1;Standard;Name 1;Straße 1;;;Stadt 1;BL 1;11111;DE
1;8,00E+00;2014-02-01T16:25:45+00:00;2014-02-01T16:25:45+00:00;2014-02-01T16:55:59+00:00;2014-02-04T22:59:59+00:00;-2;mail@mail.com;Name 2;1;1;Artikel 2;1;0;1;Standard;Name 2;Straße 2;;;Stadt 2;BL 2;2222;AT
1;8,00E+00;2014-02-02T11:30:30+00:00;2014-02-02T11:30:30+00:00;2014-02-02T12:00:43+00:00;2014-02-04T22:59:59+00:00;-2;mail@mail.com;Name 3;1;1;Artikel 3;1;0;1;Standard;Name 3;Straße 3;;;Stadt 3;BL 3;11111;DE
1;8,00E+00;2014-02-02T17:39:19+00:00;2014-02-02T17:39:19+00:00;2014-02-02T18:09:36+00:00;2014-02-04T22:59:59+00:00;-2;mail@mail.com;Name 4;1;1;Artikel 4;1;0;1;Standard;Name 4;Straße 4;;;Stadt 4;BL 4;11111;DE
1;8,00E+00;2014-02-02T18:21:50+00:00;2014-02-02T18:21:50+00:00;2014-02-02T18:56:13+00:00;2014-02-04T22:59:59+00:00;-2;mail@mail.com;Name 5;1;1;Artikel 5;1;0;1;Standard;Name 5;Straße 5;;;Stadt 5;;11111;DE
1;8,00E+00;2014-02-02T20:04:07+00:00;2014-02-02T20:04:07+00:00;2014-02-02T20:34:20+00:00;2014-02-04T22:59:59+00:00;-2;mail@mail.com;Name 6;1;1;Artikel 6;1;0;1;Standard;Name 6;Straße 6;;;Stadt 6;BL 5;11111;DE

Ich poste diese ebenfalls weil mir beim testen des Scripts auffiel das Ausländer eine Sonderegelung bei der PLZ darstellen.
Diese dürfen nämlich 4- Stellige PLZ haben.
Nur Deutsche nicht.
Mitglied: Friemler
Friemler 04.02.2014 um 18:08:37 Uhr
Goto Top
Hallo Knut,

auch mit Deinen zuletzt geposteten Testdaten läuft das Script hier bei mir und produziert Ausgabedateien, in denen alle in den Eingabedateien enthaltenen Datensätze vorhanden sind.

Bitte starte CMD.exe, navigiere mit dem CD-Kommando in das Verzeichnis, wo das Script liegt, und starte es mit der Befehlszeile
cscript /nologo "NameDesScripts.vbs"
Poste evtl. auftauchende Fehlermeldungen hier.

Gruß
Friemler
Mitglied: knotenknut
knotenknut 04.02.2014 um 18:27:21 Uhr
Goto Top
Sorry mein Fehler.
Du hast recht.
Meine EB.csv hieß fälschlicher weise EB.csv.csv

bliebe nur noch die Sache mit der Ausnahme bei der PLZ für Ausländer.

Und ich hab noch eine Frage.
Die AM.csv ist in Wahrheit (so wie ich sie bekomme)
erstmal garkeine CSV ist sondern eine txt die ich über 3 Umwege in eine CSV verwandele.
Lässt sich diese AM.txt auch verwenden ohne dass ich sie umwandeln muss?

Die ursprungliche AM.txt sähe erstmal so aus bevor ich sie umwandle:

order-id	order-item-id	purchase-date	payments-date	reporting-date	promise-date	days-past-promise	buyer-email	buyer-name	buyer-phone-number	sku	product-name	quantity-purchased	quantity-shipped	quantity-to-ship	ship-service-level	recipient-name	ship-address-1	ship-address-2	ship-address-3	ship-city	ship-state	ship-postal-code	ship-country
0	0	2014-02-01T08:51:18+00:00	2014-02-01T08:51:18+00:00	2014-02-01T09:21:37+00:00	2014-02-04T22:59:59+00:00	-2	mail@mail.com	Name 1	0	0	Artikel 1	1	0	1	Standard	Name 1	Straße 1			Ort 1	BL1	11111	DE
0	0	2014-02-01T16:25:45+00:00	2014-02-01T16:25:45+00:00	2014-02-01T16:55:59+00:00	2014-02-04T22:59:59+00:00	-2	mail@mail.com	Name 2	0	0	Artikel 2	1	0	1	Standard	Name 2	Straße 2			Ort 2	BL2	2222	AT
0	0	2014-02-02T11:30:30+00:00	2014-02-02T11:30:30+00:00	2014-02-02T12:00:43+00:00	2014-02-04T22:59:59+00:00	-2	mail@mail.com	Name 3	0	0	Artikel 3	1	0	1	Standard	Name 3	Straße 3			Ort 3	BL3	11111	DE
0	0	2014-02-02T17:39:19+00:00	2014-02-02T17:39:19+00:00	2014-02-02T18:09:36+00:00	2014-02-04T22:59:59+00:00	-2	mail@mail.com	Name 4	0	0	Artikel 4	1	0	1	Standard	Name 4	Straße 4			Ort 4	BL4	11111	DE
0	0	2014-02-02T18:21:50+00:00	2014-02-02T18:21:50+00:00	2014-02-02T18:56:13+00:00	2014-02-04T22:59:59+00:00	-2	mail@mail.com	Name 5	0	0	Artikel 5	1	0	1	Standard	Name 5	Straße 5			Ort 5		11111	DE
0	0	2014-02-02T20:04:07+00:00	2014-02-02T20:04:07+00:00	2014-02-02T20:34:20+00:00	2014-02-04T22:59:59+00:00	-2	mail@mail.com	Name 6	0	0	Artikel 6	1	0	1	Standard	Name 6	Straße 6			Ort 6	BL5	11111	DE

Besteht die Möglichkeit einer Erfolgsmeldung ala Adresse erfolgreich übertragen.. oder so!?!

Ich würde wenn das alles soweit klappt das Script auf Alltagstauglichkeit in meinem Workflow prüfen.

Unabhängig davon hätte ich dann noch eine Sache die den Workflow vereinfachen würde und zumindest theoretisch auf diesem Script aufbauen dürfte.
Aber da frage ich besser erst nach wenn der rest soweit funktioniert. face-smile

lg
Knut
Mitglied: Friemler
Friemler 04.02.2014 aktualisiert um 20:52:30 Uhr
Goto Top
Hallo Knut,

wir nähern uns einer Lösung. face-wink

Ich habe das Script weiter angepasst:

  • Am Anfang des Scripts wird das Vorhandensein sämtlicher benötigter Dateien abgefragt. Wenn eine davon fehlt, wird eine Fehlermeldung angezeigt und abgebrochen.
  • Am Ende des Scriptlaufs wird eine Erfolgsmeldung ausgegeben.
  • Es gibt jetzt noch ein Array zur Zuordnung der Ländercodes zu der im jeweiligen Land gültigen Länge der Postleitzahlen (siehe Zeile 66).
  • Die Datei AM.csv benutzt als Trennzeichen zwischen den Feldern eines Datensatzes TAB-Zeichen. Nach Anpassung von Zeile 36 kannst Du nun die AM.csv direkt verarbeiten.

Hier der Code:
Option Explicit


'Definition der Konstanten  
Const ForReading = 1
Const ForWriting = 2


'Deklaration der Variablen  
Dim strInFile1, strInDelimiter1, intStartLine1, arrMappings1
Dim strInFile2, strInDelimiter2, intStartLine2, arrMappings2

Dim strOutFileDE, strOutFileFC, strOutDelimiter
Dim intOutPLZCol, intOutCountryCodeCol, intOutAdrTypeCol, intOutTotalCols

Dim arrCountryMappings, arrPostCodeMappings

Dim objFSO, objOutStreamDE, objOutStreamFC



'********** Konfiguration ****************  
'Eingabedatei #1  
strInFile1 = "EB.csv"  
'Spalten-Trennzeichen  
strInDelimiter1 = ";"  
'Startzeile  
intStartLine1 = 3
'Spalten-Mappings  
arrMappings1 = Array(_
  Array(3,7,6,10,8,11),_
  Array(1,2,3, 5,6, 7)_
)

'Eingabedatei #2  
strInFile2 = "AM.txt"  
'Spalten-Trennzeichen  
strInDelimiter2 = Chr(9)
'Startzeile  
intStartLine2 = 2
'Spalten-Mappings  
arrMappings2 = Array(_
  Array(17,19,20,18,23,21,24),_
  Array( 1, 2, 2, 3, 5, 6, 7)_
)

'Ausgabedateien  
strOutFileDE = "DPAG.csv"  
strOutFileFC = "DPAG Ausland.csv"  
'Spalten-Trennzeichen  
strOutDelimiter = ";"  
'Nummer der Spalte mit der PLZ  
intOutPLZCol = 5
'Nummer der Spalte mit dem Länderkürzel  
intOutCountryCodeCol = 7
'Nummer der Spalte mit dem Adresstyp  
intOutAdrTypeCol = 8
'Gesamtzahl der Spalten  
intOutTotalCols = 8

'Ländercodes  
arrCountryMappings = Array(_
  Array(""  ,"Deutschland","DE","Österreich","AT","Schweiz","CH"),_  
  Array("DE","DE"         ,"DE","AT"        ,"AT","CH"     ,"CH")_  
)

'Länge der Postleitzahlen in den verschiedenen Ländern  
arrPostCodeMappings = Array(_
  Array("DE","AT","CH"),_  
  Array(   5,   4,   4)_
)
'*****************************************  


Set objFSO = CreateObject("Scripting.FileSystemObject")  

'Alle verwendeten Dateien auf Vorhandensein prüfen  
If Not FileExists(strInFile1)   Then WScript.Quit
If Not FileExists(strInFile2)   Then WScript.Quit
If Not FileExists(strOutFileDE) Then WScript.Quit
If Not FileExists(strOutFileFC) Then WScript.Quit

'Ausgabedateien initialisieren  
Set objOutStreamDE = InitOutFile(strOutFileDE)
Set objOutStreamFC = InitOutFile(strOutFileFC)

'Erste Eingabedatei verarbeiten  
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
                 strInFile1, strInDelimiter1, intStartLine1,_
                 arrMappings1)

'Zweite Eingabedatei verarbeiten  
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
                 strInFile2, strInDelimiter2, intStartLine2,_
                 arrMappings2)

'Ausgabedateien schließen  
objOutStreamDE.Close
objOutStreamFC.Close

'Erfolgsmeldung ausgeben  
MsgBox "Adressen wurden erfolgreich erfasst.", _  
       vbInformation + vbOKOnly + vbDefaultButton1, _
       WScript.ScriptName

       


Sub ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelim, intOutTotalCols,_
                strInFile, strInDelim, intStartLine,_
                arrMappings)
  Dim intCnt, intMapCnt, intColCnt
  Dim arrInLine, arrOutLine, strLineBuffer
  Dim strCountryCode, intPostCodeLength
  Dim intSrcCol, intDstCol
  Dim bolIsGermanCustomer
  Dim objInStream
  
  'Eingabedatei zum Lesen öffnen  
  Set objInStream = objFSO.OpenTextFile(strInFile, ForReading, false)
  
  'Soviele Zeilen überspringen, bis die gewünschte Startzeile erreicht ist   
  For intCnt = 1 To intStartLine - 1
    objInStream.SkipLine
  Next

  'Eingabedatei einlesen bis das Dateiende erreicht ist  
  Do While Not objInStream.AtEndOfStream
    'Eine Zeile einlesen, anhand des Trennzeichens zerteilen  
    'und in Array speichern  
    arrInLine = Split(objInStream.ReadLine, strInDelim)
    
    'Zeilenpuffer für die Ausgabe löschen  
    strLineBuffer = ""  
    
    'Spaltenzähler für jede Eingabezeile neu initialisieren  
    intColCnt = 1
    
    'Wenn die eingelesene Zeile leer ist, das Einlesen der Datei beenden  
    If IsEmptyLine(arrInLine) Then Exit Do
    
    'Alle Spalten-Mappings verarbeiten  
    For intMapCnt = 0 To UBound(arrMappings(0))
      'Quell- und Zielspalte ermitteln  
      intSrcCol = arrMappings(0)(intMapCnt) - 1
      intDstCol = arrMappings(1)(intMapCnt) - 1
      
      'Falls notwendig, den Zeilenpuffer bis zur  
      'ermittelten Zielspalte mit Leerzellen auffüllen  
      For intCnt = intColCnt To intDstCol
        strLineBuffer = strLineBuffer & strOutDelim
      Next
      
      'Falls in die Zielspalte bereits etwas eingetragen wurde,  
      'ein Leerzeichen an den Zeilenpuffer anhängen  
      If intColCnt                > intDstCol   And _
         arrInLine(intSrcCol)    <> ""          And _  
         Len(strLineBuffer)       > 0           And _
         Right(strLineBuffer, 1) <> strOutDelim Then
        strLineBuffer = strLineBuffer & " "  
      End If
      
      'Jetzt den Spaltenwert in den Zeilenpuffer übertragen  
      strLineBuffer = strLineBuffer & arrInLine(intSrcCol)
      
      'Spaltenzähler auf die Nummer der Spalte setzen,  
      'die nach der gerade beschriebenen Spalte kommt  
      intColCnt  = intDstCol + 1
    Next
    
    'Falls notwendig, den Zeilenpuffer bis zur  
    'vorgegebenen Endspalte mit Leerzellen auffüllen  
    For intCnt = intColCnt To intOutTotalCols - 1
      strLineBuffer = strLineBuffer & strOutDelim
    Next

    'Zeilenpuffer anhand des Trennzeichens zerteilen und in Array speichern  
    arrOutLine = Split(strLineBuffer, strOutDelim)
    
    'Aus dem Inhalt der Landesspalte einen Ländercode erzeugen  
    'und ein Flag setzen, ob es sich um einen deutschen oder  
    'einen ausländischen Kunden handelt  
    arrOutLine(intOutCountryCodeCol - 1) = CountryCode(arrOutLine(intOutCountryCodeCol - 1))
    strCountryCode                       = arrOutLine(intOutCountryCodeCol - 1)
    bolIsGermanCustomer                  = (StrComp(strCountryCode, "DE", vbTextCompare) = 0)  

    'Dafür sorgen, dass in der Spalte für Postleitzahlen  
    'immer die im jeweiligen Land gültige Anzahl Ziffern steht  
    intPostCodeLength            = PostCodeLength(strCountryCode)
    arrOutLine(intOutPLZCol - 1) = Right(String(intPostCodeLength, "0") & arrOutLine(intOutPLZCol - 1), intPostCodeLength)  

    'In die Spalte mit dem Adresstyp den Wert "HOUSE" schreiben  
    arrOutLine(intOutAdrTypeCol - 1) = "HOUSE"  
    
    'Das Array wieder zu einem String wandeln  
    strLineBuffer = Join(arrOutLine, strOutDelim)

    'Den Zeilenpuffer nur in die Ausgabedatei schreiben,  
    'wenn die Namensspalte nicht leer ist  
    If Left(strLineBuffer, 1) <> strOutDelim Then
      'Jetzt anhand des oben gesetzten Flags entscheiden, in welche  
      'der beiden Ausgabedateien der Zeilenpuffer geschrieben wird  
      If bolIsGermanCustomer Then
        objOutStreamDE.WriteLine(strLineBuffer)
      Else
        objOutStreamFC.WriteLine(strLineBuffer)
      End If
    End If
    
    'Speicher des Arrays mit der Eingabezeile freigeben  
    Erase arrInLine
    Erase arrOutLine
  Loop
  
  'Eingabedatei schließen  
  objInStream.Close
End Sub


Function FileExists(strFile)
  If objFSO.FileExists(strFile) Then
    FileExists = True
  Else
    MsgBox "Die Datei" & vbNewLine & _  
           strFile & vbNewLine & _
           "existiert nicht!", _  
           vbCritical + vbOKOnly + vbDefaultButton1, _
           WScript.ScriptName

    FileExists = False
  End If
End Function


Function InitOutFile(strOutFile)
  Dim objInStream, objOutStream, strFirstTwoLines
  
  'Ausgabedatei zum Lesen öffnen und die ersten zwei Zeilen auslesen  
  Set objInStream  = objFSO.OpenTextFile(strOutFile, ForReading, false)
  strFirstTwoLines = objInStream.ReadLine & vbNewLine & _
                     objInStream.ReadLine & vbNewLine
  objInStream.Close

  'Ausgabedatei zum Schreiben öffnen und die ersten zwei Zeilen schreiben  
  Set objOutStream = objFSO.OpenTextFile(strOutFile, ForWriting, true)
  objOutStream.Write(strFirstTwoLines)
  
  Set InitOutFile = objOutStream
End Function


Function IsEmptyLine(arrLine)
  Dim intCnt
  
  For intCnt = 0 To UBound(arrLine)
    If arrLine(intCnt) <> "" Then Exit For  
  Next

  IsEmptyLine = (intCnt > UBound(arrLine))
End Function


Function CountryCode(strCountryName)
  Dim intCnt
  
  CountryCode = ""  
  
  For intCnt = 0 To UBound(arrCountryMappings(0))
    If StrComp(arrCountryMappings(0)(intCnt), strCountryName, vbTextCompare) = 0 Then
      CountryCode = arrCountryMappings(1)(intCnt)
      Exit For
    End If
  Next
End Function


Function PostCodeLength(strCountryCode)
  Dim intCnt
  
  PostCodeLength = 0
  
  For intCnt = 0 To UBound(arrPostCodeMappings(0))
    If StrComp(arrPostCodeMappings(0)(intCnt), strCountryCode, vbTextCompare) = 0 Then
      PostCodeLength = arrPostCodeMappings(1)(intCnt)
      Exit For
    End If
  Next
End Function

Gruß
Friemler


[EDIT]
Code etwas aufgeräumt
[/EDIT]
Mitglied: knotenknut
knotenknut 04.02.2014 aktualisiert um 19:52:43 Uhr
Goto Top
Und nochmal Danke. :D

Ich erhalte Leider einen Fehler:

Script.vbs(156, 9) Laufzeitfehler in Microsoft V
BScript: Index außerhalb des gültigen Bereichs: 'intSrcCol'

Und der Name der eigentlich AM Ausgangsdatei ist AM.txt nicht csv
Macht das einen Unterschied?

lg
Knut
Mitglied: Friemler
Friemler 04.02.2014 aktualisiert um 20:02:15 Uhr
Goto Top
Hallo Knut,

prüfe bitte folgendes:

  1. Hast Du an den Arrays arrMappings1 bzw. arrMappings2 etwas geändert? Wenn ja, ist das alles richtig?
  2. Schau mal in den Ausgabedateien nach, bis zu welchem Datensatz Ausgaben erfolgten. Gibt es an dem darauf folgenden Datensatz irgendwelche Auffälligkeiten (Aufbau fehlerhaft)?

Ich kann Deinen Fehler hier nicht reproduzieren.

[EDIT]
Wenn Du eine der beteiligten Dateien umbenennst, musst Du das Script entsprechend anpassen.
[/EDIT]

Gruß
Friemler
Mitglied: knotenknut
knotenknut 04.02.2014 um 21:00:20 Uhr
Goto Top
Danke Friemler.

Dafür dass du schreibst selten anwesend zu sein antwortest du doch recht flink face-smile
Dein Edit beschreibt den Fehler den ich gemacht habe.
Ich kann jetzt aus Anhieb nichts mehr finden was nicht funktioniert.
Ich werde das Script ab sofort im Alltag testen und gerne darüber berichten.
Ich danke dir wirklich vielmals.
Eine letzte Sache hätte ich da jedoch noch.
Ich versuche mal zu beschreiben was ich mir vorstelle.
Bzw. was in meinem Kopf erstmal so klingt als könnte es funktionieren.
Wie bereits erwähnt dürfte das bisher bestehende Script wundebar als Ausgangsbasis dienen.

Der AM.txt und der EB.csv ist neben den ganzen Adressdaten auch zu entnehmen welcher Artikel gekauft wurde und wie oft.

Bei der AM.txt sind es die Spalten "product-name" und "quantity purchased"
Bei der EB.csv sind es die Spalte "Artikelbezeichung" und "Stükzahl"

Is es möglich (vllt. in einem CMD Fenster) für jeden Kunden eine Meldung erscheinen zu lassen die ungefähr so aussieht:

Der Kunde:
Hans Müller
Muster Str. 12
11111 Musterstadt

hat folgende Artikel Bestellt:
1 x Artikel 1
2 x Artikel 2

Drücken Sie die Eingabetaste wenn der Auftrag bearbeitet wurde...

Und wenn dann Enter gedrückt wird kommt der nächste Kunde usw..
Theoretisch müsste das bestehende Script ja "nur" noch 2 weitere Informationen lesen und alles zusammen in eine 3. Datei schreiben die im direkten
Anschluss wieder ausgelesen und als Meldung ausgegeben wird.
Ich hoffe ich hatte Erfolg beim Versuch zu erklären was ich meine.
Ich freue mich wenn du mir hierzu feedback geben kannst.

lg
Knut
Mitglied: Friemler
Friemler 04.02.2014, aktualisiert am 05.02.2014 um 18:54:05 Uhr
Goto Top
Hallo Knut,

ich habe gerade etwas "Luft" im Job, deswegen konnte ich mich heute öfter mit Deinem Problem befassen. Ab morgen ist das wieder anders.

Ich habe das Script nochmals erweitert, um es an Deine neue Anforderung anzupassen. Die Datensätze zu einer Bestellung werden nach Abschluss der Adresserfassung in Windows-Messageboxen ausgegeben, die Du mit Klick auf den OK-Button oder mit Enter schließen kannst.

Im Konfigurationsabschnitt sind ein paar neue Optionen hinzugekommen, z.B. der Name der Datei, die die Datensätze der Bestellungen aufnimmt. Die Arrays arrMappings1 und arrMappings2 enthalten jetzt noch Einträge für die Nummern der Spalten mit der Bestellmenge und den Artikelbezeichnungen. Außerdem habe ich noch eine neue Zuordnung "Ländercode -> Name des Landes" eingeführt, damit bei der Ausgabe der Bestellungs-Datensätze das Land im Klartext unter der Kundenadresse angezeigt wird.

Ich hoffe sehr für Dich, dass die Online-Plattform, von der die AM.txt stammt, für den Fall, dass ein Kunde mehrere Artikel bestellt, die Datei nach dem gleichen Schema wie die EB.csv aufbaut, dass also die Artikel in Zeilen ohne Kundenname stehen, sonst wird mein Script nicht funktionieren.

Hier nun der Code (der Endfassung?):
Option Explicit


'Definition der Konstanten  
Const ForReading = 1
Const ForWriting = 2


'Deklaration der Variablen  
Dim strInFile1, strInDelimiter1, intStartLine1, arrMappings1
Dim strInFile2, strInDelimiter2, intStartLine2, arrMappings2

Dim strOutFileDE, strOutFileFC, strOutDelimiter, strOrdersFile
Dim intOutCustomerCol, intOutAddOnCol, intOutStreetCol, intOutHNoCol, intOutPostCodeCol
Dim intOutTownCol, intOutCountryCodeCol, intOutAdrTypeCol, intOutTotalCols
Dim intArtNameCol, intQuantityCol

Dim arrCountryMappings, arrCountryCodeMappings

Dim objFSO, objOutStreamDE, objOutStreamFC, objOrdersStream



'********** Konfiguration ****************  
'Eingabedatei #1  
strInFile1 = "EB.csv"  
'Spalten-Trennzeichen  
strInDelimiter1 = ";"  
'Startzeile  
intStartLine1 = 3
'Spalten-Mappings  
arrMappings1 = Array(_
  Array(3,7,6,10,8,11),_
  Array(1,2,3, 5,6, 7),_
  Array(13,15)_
)

'Eingabedatei #2  
strInFile2 = "AM.txt"  
'Spalten-Trennzeichen  
strInDelimiter2 = Chr(9)
'Startzeile  
intStartLine2 = 2
'Spalten-Mappings  
arrMappings2 = Array(_
  Array(17,19,20,18,23,21,24),_
  Array( 1, 2, 2, 3, 5, 6, 7),_
  Array(12,13)_
)

'Ausgabedateien  
strOutFileDE = "DPAG.csv"  
strOutFileFC = "DPAG Ausland.csv"  
'Spalten-Trennzeichen  
strOutDelimiter = ";"  
'Nummer der Spalte mit dem Kundennamen  
intOutCustomerCol = 1
'Nummer der Spalte mit den Zusatzinfos  
intOutAddOnCol = 2
'Nummer der Spalte mit der Strasse  
intOutStreetCol = 3
'Nummer der Spalte mit der Hausnummer  
intOutHNoCol = 4
'Nummer der Spalte mit der PLZ  
intOutPostCodeCol = 5
'Nummer der Spalte mit der Stadt  
intOutTownCol = 6
'Nummer der Spalte mit dem Ländercode  
intOutCountryCodeCol = 7
'Nummer der Spalte mit dem Adresstyp  
intOutAdrTypeCol = 8
'Gesamtzahl der Spalten  
intOutTotalCols = 8

'Auftragsdatei  
strOrdersFile = "Aufträge.txt"  
'Arrayindex der Spaltennummer der Artikelbezeichnung  
intArtNameCol = 0
'Arrayindex der Spaltennummer der Menge  
intQuantityCol = 1

'Ländercodes  
arrCountryMappings = Array(_
  Array(""  ,"Deutschland","DE","Österreich","AT","Schweiz","CH"),_  
  Array("DE","DE"         ,"DE","AT"        ,"AT","CH"     ,"CH")_  
)

'Zuordnung der Ländercodes zum Namen des Landes und  
'der Länge der Postleitzahlen  
arrCountryCodeMappings = Array(_
  Array("DE"         ,"AT"        ,"CH"     ),_  
  Array("Deutschland","Österreich","Schweiz"),_  
  Array(            5,           4,        4)_
)
'*****************************************  


Set objFSO = CreateObject("Scripting.FileSystemObject")  

'Alle verwendeten Dateien auf Vorhandensein prüfen  
If Not FileExists(strInFile1)   Then WScript.Quit
If Not FileExists(strInFile2)   Then WScript.Quit
If Not FileExists(strOutFileDE) Then WScript.Quit
If Not FileExists(strOutFileFC) Then WScript.Quit

'Ausgabedateien initialisieren  
Set objOutStreamDE  = InitOutFile(strOutFileDE)
Set objOutStreamFC  = InitOutFile(strOutFileFC)
Set objOrdersStream = objFSO.CreateTextFile(strOrdersFile, True)

'Erste Eingabedatei verarbeiten  
Call ProcessFile(strInFile1, strInDelimiter1, intStartLine1, arrMappings1)

'Zweite Eingabedatei verarbeiten  
Call ProcessFile(strInFile2, strInDelimiter2, intStartLine2, arrMappings2)

'Ausgabedateien schließen  
objOutStreamDE.Close
objOutStreamFC.Close
objOrdersStream.Close

'Erfolgsmeldung ausgeben  
MsgBox "Adressen wurden erfolgreich erfasst.", _  
       vbInformation + vbOKOnly + vbDefaultButton1, _
       WScript.ScriptName

'Aufträge ausgeben  
Set objOrdersStream = objFSO.OpenTextFile(strOrdersFile, ForReading, false)
Call ShowOrders()
objOrdersStream.Close



Sub ProcessFile(strInFile, strInDelim, intStartLine, arrMappings)
  Dim intCnt, intMapCnt, intColCnt
  Dim arrInLine, arrOutLine, strLineBuffer
  Dim strCountryCode, intPostCodeLength
  Dim intSrcCol, intDstCol
  Dim bolIsGermanCustomer
  Dim objInStream

  'Eingabedatei zum Lesen öffnen  
  Set objInStream = objFSO.OpenTextFile(strInFile, ForReading, false)

  'Soviele Zeilen überspringen, bis die gewünschte Startzeile erreicht ist  
  For intCnt = 1 To intStartLine - 1
    objInStream.SkipLine
  Next

  'Eingabedatei einlesen bis das Dateiende erreicht ist  
  Do While Not objInStream.AtEndOfStream
    'Eine Zeile einlesen  
    strLineBuffer = objInStream.ReadLine

    'Codierte Sonderzeichen ersetzen  
    strLineBuffer = Replace(strLineBuffer, "&amp;", "&", 1, -1, vbTextCompare)  

    'Zeile anhand des Trennzeichens zerteilen und in Array speichern  
    arrInLine = Split(strLineBuffer, strInDelim)

    'Anführungszeichen um die Zelleninhalte entfernen  
    For intCnt = 0 To UBound(arrInLine)
      arrInLine(intCnt) = UnQuote(arrInLine(intCnt))
    Next

    'Zeilenpuffer für die Ausgabe löschen  
    strLineBuffer = ""  

    'Spaltenzähler für jede Eingabezeile neu initialisieren  
    intColCnt = 1

    'Wenn die eingelesene Zeile leer ist, das Einlesen der Datei beenden  
    If IsEmptyLine(arrInLine) Then Exit Do

    'Alle Spalten-Mappings verarbeiten  
    For intMapCnt = 0 To UBound(arrMappings(0))
      'Quell- und Zielspalte ermitteln  
      intSrcCol = arrMappings(0)(intMapCnt) - 1
      intDstCol = arrMappings(1)(intMapCnt) - 1

      'Falls notwendig, den Zeilenpuffer bis zur  
      'ermittelten Zielspalte mit Leerzellen auffüllen  
      For intCnt = intColCnt To intDstCol
        strLineBuffer = strLineBuffer & strOutDelimiter
      Next

      'Falls in die Zielspalte bereits etwas eingetragen wurde,  
      'ein Leerzeichen an den Zeilenpuffer anhängen  
      If intColCnt                > intDstCol   And _
         arrInLine(intSrcCol)    <> ""          And _  
         Len(strLineBuffer)       > 0           And _
         Right(strLineBuffer, 1) <> strOutDelimiter Then
        strLineBuffer = strLineBuffer & " "  
      End If

      'Jetzt den Spaltenwert in den Zeilenpuffer übertragen  
      strLineBuffer = strLineBuffer & arrInLine(intSrcCol)

      'Spaltenzähler auf die Nummer der Spalte setzen,  
      'die nach der gerade beschriebenen Spalte kommt  
      intColCnt  = intDstCol + 1
    Next

    'Falls notwendig, den Zeilenpuffer bis zur  
    'vorgegebenen Endspalte mit Leerzellen auffüllen  
    For intCnt = intColCnt To intOutTotalCols - 1
      strLineBuffer = strLineBuffer & strOutDelimiter
    Next

    'Zeilenpuffer anhand des Trennzeichens zerteilen und in Array speichern  
    arrOutLine = Split(strLineBuffer, strOutDelimiter)

    'Aus dem Inhalt der Landesspalte einen Ländercode erzeugen  
    'und ein Flag setzen, ob es sich um einen deutschen oder  
    'einen ausländischen Kunden handelt  
    arrOutLine(intOutCountryCodeCol - 1) = CountryCode(arrOutLine(intOutCountryCodeCol - 1))
    strCountryCode                       = arrOutLine(intOutCountryCodeCol - 1)
    bolIsGermanCustomer                  = (StrComp(strCountryCode, "DE", vbTextCompare) = 0)  

    'Dafür sorgen, dass in der Spalte für Postleitzahlen  
    'immer die im jeweiligen Land gültige Anzahl Ziffern steht  
    intPostCodeLength                 = PostCodeLength(strCountryCode)
    arrOutLine(intOutPostCodeCol - 1) = Right(String(intPostCodeLength, "0") & arrOutLine(intOutPostCodeCol - 1), intPostCodeLength)  

    'In die Spalte mit dem Adresstyp den Wert "HOUSE" schreiben  
    arrOutLine(intOutAdrTypeCol - 1) = "HOUSE"  

    'Das Array wieder zu einem String wandeln  
    strLineBuffer = Join(arrOutLine, strOutDelimiter)

    'Den Zeilenpuffer nur in die Ausgabedatei schreiben,  
    'wenn die Namensspalte nicht leer ist  
    'In diesem Fall auch den Kopf eines neuen Datensatzes  
    'in die Auftragsliste schreiben  
    If arrOutLine(intOutCustomerCol - 1) <> "" Then  
      'Jetzt anhand des oben gesetzten Flags entscheiden, in welche  
      'der beiden Ausgabedateien der Zeilenpuffer geschrieben wird  
      If bolIsGermanCustomer Then
        objOutStreamDE.WriteLine(strLineBuffer)
      Else
        objOutStreamFC.WriteLine(strLineBuffer)
      End If

      'Jetzt die Einträge in die Auftragsliste schreiben  
      'Vor dem ersten Datensatz keine Leerzeilen schreiben  
      If objOrdersStream.Line > 1 Then objOrdersStream.WriteLine(vbNewLine)

      'Kundendaten schreiben  
      objOrdersStream.WriteLine("Der Kunde:")  
      objOrdersStream.WriteLine(arrOutLine(intOutCustomerCol - 1))

      If arrOutLine(intOutAddOnCol - 1) <> "" Then  
        objOrdersStream.WriteLine(arrOutLine(intOutAddOnCol - 1))
      End If

      objOrdersStream.WriteLine(arrOutLine(intOutStreetCol - 1))
      objOrdersStream.WriteLine(arrOutLine(intOutPostCodeCol - 1) & " " & arrOutLine(intOutTownCol - 1))  
      objOrdersStream.WriteLine(CountryName(arrOutLine(intOutCountryCodeCol - 1)))
      objOrdersStream.WriteLine("")  
      objOrdersStream.WriteLine("hat folgende Artikel bestellt:")  

      'Artikeldaten nur schreiben, wenn der aktuelle Datensatz  
      'in der Eingabedatei nicht aus mehreren Zeilen besteht.  
      'Es handelt sich also um eine Bestellung mit nur einem Artikel  
      If arrInLine(arrMappings(2)(intArtNameCol) - 1) <> "" Then  
        objOrdersStream.WriteLine(arrInLine(arrMappings(2)(intQuantityCol) - 1) & _
                                  " x " & _  
                                  arrInLine(arrMappings(2)(intArtNameCol) - 1))
      End If
    Else
      'Hier werden die Artikeldaten einer Bestellung,  
      'die aus mehreren Artikeln besteht, geschrieben  
      objOrdersStream.WriteLine(arrInLine(arrMappings(2)(intQuantityCol) - 1) & _
                                " x " & _  
                                arrInLine(arrMappings(2)(intArtNameCol) - 1))
    End If

    'Speicher der Zeilen-Arrays freigeben  
    Erase arrInLine
    Erase arrOutLine
  Loop

  'Eingabedatei schließen  
  objInStream.Close
End Sub


Sub ShowOrders()
  Dim strLine, strOrderData, intCntEmptyLines
  Dim bolIsDataSetComplete

  intCntEmptyLines     = 0
  strOrderData         = ""  
  bolIsDataSetComplete = False

  Do While Not objOrdersStream.AtEndOfStream
    strLine = objOrdersStream.ReadLine

    If strLine = "" Then intCntEmptyLines = intCntEmptyLines + 1  

    If intCntEmptyLines <> 2 Then
      If strLine <> "" Then  
        strOrderData = strOrderData & strLine & vbNewLine
      ElseIf strOrderData <> "" Then  
        strOrderData = strOrderData & strLine & vbNewLine
      Else
        intCntEmptyLines = 0
      End If

      If objOrdersStream.AtEndOfStream Then bolIsDataSetComplete = True
    Else
      bolIsDataSetComplete = True
    End If

    If bolIsDataSetComplete Then
      MsgBox strOrderData, vbInformation + vbOKOnly + vbDefaultButton1, WScript.ScriptName
      intCntEmptyLines     = 0
      strOrderData         = ""  
      bolIsDataSetComplete = False
    End If
  Loop
End Sub


Function FileExists(strFile)
  If objFSO.FileExists(strFile) Then
    FileExists = True
  Else
    MsgBox "Die Datei" & vbNewLine & _  
           strFile & vbNewLine & _
           "existiert nicht!", _  
           vbCritical + vbOKOnly + vbDefaultButton1, _
           WScript.ScriptName

    FileExists = False
  End If
End Function


Function InitOutFile(strOutFile)
  Dim objInStream, objOutStream, strFirstTwoLines

  'Ausgabedatei zum Lesen öffnen und die ersten zwei Zeilen auslesen  
  Set objInStream  = objFSO.OpenTextFile(strOutFile, ForReading, false)
  strFirstTwoLines = objInStream.ReadLine & vbNewLine & _
                     objInStream.ReadLine & vbNewLine
  objInStream.Close

  'Ausgabedatei zum Schreiben öffnen und die ersten zwei Zeilen schreiben  
  Set objOutStream = objFSO.OpenTextFile(strOutFile, ForWriting, true)
  objOutStream.Write(strFirstTwoLines)

  Set InitOutFile = objOutStream
End Function


Function UnQuote(strString)
  Dim strResult

  strResult = Trim(strString)

  If Left(strResult, 1) & Right(strResult, 1) = """""" Then  
    strResult = Mid(strResult, 2, Len(strResult) - 2)
  End If

  UnQuote = strResult
End Function


Function IsEmptyLine(arrLine)
  Dim intCnt

  For intCnt = 0 To UBound(arrLine)
    If arrLine(intCnt) <> "" Then Exit For  
  Next

  IsEmptyLine = (intCnt > UBound(arrLine))
End Function


Function CountryCode(strCountryName)
  Dim intCnt

  CountryCode = ""  

  For intCnt = 0 To UBound(arrCountryMappings(0))
    If StrComp(arrCountryMappings(0)(intCnt), strCountryName, vbTextCompare) = 0 Then
      CountryCode = arrCountryMappings(1)(intCnt)
      Exit For
    End If
  Next
End Function


Function CountryName(strCountryCode)
  Dim intCnt

  CountryName = ""  

  For intCnt = 0 To UBound(arrCountryCodeMappings(0))
    If StrComp(arrCountryCodeMappings(0)(intCnt), strCountryCode, vbTextCompare) = 0 Then
      CountryName = arrCountryCodeMappings(1)(intCnt)
      Exit For
    End If
  Next
End Function


Function PostCodeLength(strCountryCode)
  Dim intCnt

  PostCodeLength = 0

  For intCnt = 0 To UBound(arrCountryCodeMappings(0))
    If StrComp(arrCountryCodeMappings(0)(intCnt), strCountryCode, vbTextCompare) = 0 Then
      PostCodeLength = arrCountryCodeMappings(2)(intCnt)
      Exit For
    End If
  Next
End Function

Gruß
Friemler
Mitglied: knotenknut
knotenknut 05.02.2014 um 07:11:47 Uhr
Goto Top
Guten Morgen.
Und nochmal Danke face-smile
Das funktioniert auch!
Wahnsinn.
Ich bin bei einem Kundennamen auf einen Fehler gestoßen:
Der Kunde hat im Portal einen Namen angeben der in etwa so aussieht:
A&B Blumenhandel
in der EB.csv wird der Name so geschrieben:
"A&amp;B Blumenhandel"

Das Script schreibt, wenn ich den Namen nicht korrigiere nichts aus der EB.csv.
Ist es möglich das automatisch zu korrigieren?

lg und einen angenehmen Arbeitstag

Knut
Mitglied: Friemler
Friemler 05.02.2014 um 09:58:36 Uhr
Goto Top
Hallo Knut,

ich habe das Script in meinem letzten Posting entsprechend geändert. Sollten noch andere codierte Sonderzeichen auftauchen, kannst Du das Script selbst anpassen, indem Du Zeile 156 als Muster nimmst und entsprechend angepasste Versionen dahinter schreibst.

Gruß
Friemler
Mitglied: knotenknut
knotenknut 05.02.2014 um 13:38:46 Uhr
Goto Top
Wahnsinn.
Für jedes Problem eine Lösung.
Genial!
Ich danke dir! Wirklich!

Ich werde das Script ab heute im Alltagseinsatz testen und
evtl. Fehler / Verbesserungen notieren.
Damit würde ich mich dann am Wochenende wieder melden, wenn das okay für dich ist?

lg
Knut
Mitglied: Friemler
Friemler 05.02.2014 um 14:55:40 Uhr
Goto Top
Hallo Knut,

dann mal viel Erfolg beim Testen.

Ich bin am Wochenende "not at the keyboard", bei Fehlern musst Du dann bis nächste Woche warten.

Gruß
Friemler
Mitglied: knotenknut
knotenknut 05.02.2014 aktualisiert um 16:54:12 Uhr
Goto Top
Danke.
Kein Problem.
Das Script spart mit soviel Zeit, die ich dann nutzen kann um mich in Geduld zu üben face-smile


Edit:
So viel zum Thema "in Geduld üben"
Mich juckts in den Fingern face-smile

Ich habe das Script also heute zum ersten mal ernsthaft bei der "Arbeit" getestet.
und bin prompt auf 3 Dinge gestoßen die noch nicht so ganz richtig sind.

1. Ein Fehler meinerseits. Die EB.csv sieht in Wahrheit garnicht so aus wie das was ich gepostet habe.
Dieses "Aussehen" bekommt sie erst wenn ich sie einmal mit Excel geöffnet und neu gespeichert habe.
Die "wahre" EB.csv wie ich sie aus dem Portal bekommen sieht so aus und funktioniert dementsprechend nicht richtig mit dem Script:

	Verkaufsprotokollnummer;Mitgliedsname;Name des Käufers;Telefonnummer;E-Mail-Adresse;Adresse 1;Adresse 2;Ort;Region;PLZ;Land;Artikelnummer;Artikelbezeichnung;Bestandseinheit;Stückzahl;Preis;MwSt.-Satz;Verpackung und Versand;Versicherung;Nachnahmekosten;Gesamtpreis;Zahlungsmethode;Verkauft am;Datum der Kaufabwicklung;Zahlungsdatum;Versanddatum;Rechnungsdatum;Rechnungsnummer;Abgegebene Bewertung;Erhaltene Bewertung;Notizzettel;PayPal-Transaktions-ID;Versandservice;Option ?Nachnahme?;Transaktions-ID;Bestellnummer;Variantendetails

"465";"User1";"Vorname Name";"0";"mail@gmx.net";"Str. 8";"";"Ort";"default";"11111";"Deutschland";"0";"Artikel 1";"Stück";"1";"EUR 5,89";"19%";"EUR 0,00";"EUR 0,00";"";"EUR 5,89";"Überweisung";"02.02.14";"02.02.14";"05.02.14";"05.02.14";"";"";"Ja";"";"";"";"Deutsche Post Brief";"";"0";"";""  
"466";"User1";"Vorname Name";"0";"mail@gmx.net";"Str. 8";"";"Ort";"default";"11111";"Deutschland";"0";"Artikel 1";"Stück";"1";"EUR 5,89";"19%";"EUR 0,00";"EUR 0,00";"";"EUR 5,89";"Überweisung";"02.02.14";"02.02.14";"05.02.14";"05.02.14";"";"";"Ja";"";"";"";"Deutsche Post Brief";"";"0";"";""  

2; Verkaufsprotokoll(e) heruntergeladen;von ;02.02.14;12:03:33; bis ;02.02.14;12:12:58
Mitgliedsname des Verkäufers: mail@mail.com

2. Diese Datei zeigt gleichzeitig auch ein weiteres Problem dass mir während der Arbeit heute auffiel.
Bei den beiden Zeilen handelt es sich um Bestelleung von ein und dem selben Kunden.
Wenn der Kunde mehrere Artikel bestellt und gleichzeitig bezahlt sieht das aus wie besprochen.
Und die Anzeige in der Versandmeldung funktioniert entsprechend.
Der Fall hier ist ein anderer. Der Kunde hat 2 Artikel bestellt, bezahlt aber beide einzeln bzw. zahlt nicht per PayPal sondern überweist das Geld.
Wie auch immer.
Momentan hat das Script mit in der Versandmeldung nur den Kunden mit einem bestelltem Artikel angezeigt.
Immerhin wurde der Kunde nur einmal in der DPAG.csv eingetragen.

Ist es möglich dass das Script prüft ob ein Kunde doppelt verhanden ist, und wenn ja alle seine bestellten Artikel wie bei der
anderen Variante (wo die anderen Felder leer sind) angezeigt?

3. Die Korrektur der &amp Sache funktioniert wie gesagt. Allerdings schreibt das Script den Namen des Kunden nun in "" also
"A&B Blumenladen"
in die DPAG.csv.
Da meckert mein Onlinefrankierungsservice wegen unerlaubter Zeichen.

Ansonsten hat alles bestens funktioniert und ich bin hellauf begeistert und dankbar.
Ich werde anfänglich meine Probleme haben dem Script am Ende wirklich zu vertrauen.
Dabei ist das wahrscheinlich weniger Fehleranfällig als ich als "Copy&Paster" es bin/war. :D

lg
Knut
Mitglied: Friemler
Friemler 05.02.2014 um 19:14:30 Uhr
Goto Top
Hallo Knut,

ich habe das Script oben nochmals aktualisiert. Es kann jetzt mit Eingabedateien umgehen, bei denen die Spaltenwerte in Anführungszeichen eingeschlossen sind.Deine oben beschriebenen Fehler sollten damit eigentlich alle verschwunden sein.

Zu Deiner Frage nach dem Zusammenfassen der Bestellungen eines Kunden zu einem Eintrag in der Auftragsliste: Das wird mir zu aufwendig. Ich müsste das komplette Script neu schreiben. In der derzeitigen Version stelle ich ja nur einen Datensatz zusammen und schreibe ihn dann in die Ausgabedateien. Um Deinen Wunsch zu erfüllen, müsste ich bei jedem Datensatz zunächst nachsehen, ob es bereits einen Datensatz des selben Kunden gibt, wenn ja diesen ändern, den neuen Datensatz anhängen...

Wenn Du in die Richtung willst, deine Bestellungen zu verwalten, solltest Du Dich nach professionellen Lösungen umsehen, das sprengt dann doch den Rahmen einer Forumshilfe.

Ein möglicher Workaround für Dich: Du kannst die DPAG.csv bzw. DPAG Ausland.csv in Excel öffnen, nach der Namens-Spalte sortieren und somit doppelte Einträge finden.

Wenn es noch weitere Probleme mit dem Script gibt, die durch das Format oder die Art der Eingabedaten verursacht werden, kannst Du Dich gerne weiterhin melden.

Gruß
Friemler
Mitglied: knotenknut
knotenknut 05.02.2014 um 20:22:19 Uhr
Goto Top
Verstehe, kein Problem.
Und für die andere Korrektur danke ich dir nochmal face-smile

Ich habe herausgefunden dass ich lediglich den Namen der 2. Bestellung des Kunden aus der EB.csv löschen muss, dann macht das script alles richtig.
Mitglied: Friemler
Lösung Friemler 05.02.2014, aktualisiert am 01.05.2014 um 19:42:50 Uhr
Goto Top
Ja, das ist ein möglicher Workaround. Aber das funktioniert nur wie gewünscht, wenn die beiden Einträge direkt aufeinander folgend in der EB.csv stehen. Wenn ein Kunde also am gleichen Tag mit zeitlichem Abstand zwei Bestellungen tätigt und in dieser Zeit noch andere Kunden bestellt haben, musst Du den zweiten Eintrag unter den ersten verschieben.

Gruß
Friemler
Mitglied: knotenknut
knotenknut 05.02.2014 um 21:47:12 Uhr
Goto Top
ok. verstanden.
Danke face-smile
Mitglied: knotenknut
knotenknut 01.05.2014 um 19:54:56 Uhr
Goto Top
Hallo Tüftler,
Hallo Community,

Ich melde mich mal mit Feedback und Erfahrungen aus dem Alltag mit dem Script zurück.
Kurz: Es funktioniert weitestgehend gut und hilft sehr!

Es gibt in manchen Fälle manchmal noch Probleme mit "Ausländern" in der EB.csv
Aber nicht immer.
Ich konnte noch keinen sinnvollen Zusammenhang erkennen.
Wenn ich einen erkenne würde ich mich freuen mich diesbezüglich melden zu dürfen.

Desweiteren möchte ich nochmal um Hilfe bei der Erweiterung des Script bitten.

Ich biete mitttlerweile auch Artikel an die ich auf eine andere, günstigere Art versenden kann.
In der Artikelbeschreibung der EB.csv und der AM.txt taucht bei diesen auch ein Wort auf dass bei den "normalen" Artikeln nicht vorkommt.

Besteht die Möglichkeit dem Script noch eine Anfrage hinzu zu fügen die in etwa so lautet:

Wenn Begriff "Beispielbegriff" in der Artikelbeschreibung vorkommt. Schreibe die Daten nicht in die DPAG.csv (oder DPAG Ausland.csv) sondern in die
DPAG Kompakt (oder DPAG Kompakt Ausland.csv). Entsprechend nach In oder Ausland getrennt.

Ich danke mal wieder im Voraus!

lg
Knut