Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Per BAT CSV bestimmte Spalten und Zeilen auslesen und übertragen

Mitglied: knotenknut

knotenknut (Level 1) - Jetzt verbinden

02.02.2014, aktualisiert 01.05.2014, 5812 Aufrufe, 30 Kommentare, 3 Danke

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..

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

mfg
Knut


30 Antworten
Mitglied: bastla
02.02.2014, aktualisiert 01.05.2014
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?
Bitte warten ..
Mitglied: Friemler
03.02.2014 um 03:07 Uhr
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:

Das Script

01.
Const ForReading = 1
02.
Const ForWriting = 2
03.

04.

05.
'********** Konfiguration ****************
06.
'Eingabedatei #1
07.
strInFile1 = "EB.csv"
08.
'Spalten-Trennzeichen
09.
strInDelimiter1 = ";"
10.
'Startzeile
11.
intStartLine1 = 2
12.
'Spalten-Mappings
13.
arrMappings1 = Array(_
14.
                     Array(1,3,5,6),_
15.
                     Array(2,4,6,8)_
16.
                    )
17.

18.
'Eingabedatei #2
19.
strInFile2 = "AM.csv"
20.
'Spalten-Trennzeichen
21.
strInDelimiter2 = ";"
22.
'Startzeile
23.
intStartLine2 = 2
24.
'Spalten-Mappings
25.
arrMappings2 = Array(_
26.
                     Array(6,8,5,7),_
27.
                     Array(2,4,6,8)_
28.
                    )
29.

30.
'Ausgabedatei
31.
strOutFile = "DPAG.csv"
32.
'Spalten-Trennzeichen
33.
strOutDelimiter = ";"
34.
'Gesamtzahl der Spalten
35.
intOutCols = 10
36.
'*****************************************
37.

38.

39.
Set objFSO = CreateObject("Scripting.FileSystemObject")
40.

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

44.
'Erste Eingabedatei verarbeiten
45.
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
46.
                 strInFile1, strInDelimiter1, intStartLine1,_
47.
                 arrMappings1)
48.

49.
'Zweite Eingabedatei verarbeiten
50.
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
51.
                 strInFile2, strInDelimiter2, intStartLine2,_
52.
                 arrMappings2)
53.

54.
'Ausgabedatei schließen
55.
objOutStream.Close
56.

57.

58.

59.
Sub ProcessFile(objOutStream, strOutDelim, intOutCols,_
60.
                strInFile, strInDelim, intStartLine,_
61.
                arrMappings)
62.
  Dim intCnt, intMapCnt, intColCnt, arrLine, strOutLine, intSrcCol, intDstCol
63.
  Dim objInStream
64.
  
65.
  If objFSO.FileExists(strInFile) Then
66.
    Set objInStream = objFSO.OpenTextFile(strInFile, ForReading, false)
67.
    
68.
    For intCnt = 1 To intStartLine - 1
69.
      objInStream.SkipLine
70.
    Next
71.

72.
    Do While Not objInStream.AtEndOfStream
73.
      arrLine    = Split(objInStream.ReadLine, strInDelim)
74.
      strOutLine = ""
75.
      intColCnt  = 1
76.
      
77.
      For intMapCnt = 0 To UBound(arrMappings(0))
78.
        intSrcCol = arrMappings(0)(intMapCnt) - 1
79.
        intDstCol = arrMappings(1)(intMapCnt) - 1
80.
        
81.
        For intCnt = intColCnt To intDstCol
82.
          strOutLine = strOutLine & strOutDelim
83.
        Next
84.
        
85.
        strOutLine = strOutLine & arrLine(intSrcCol)
86.
        intColCnt = intDstCol + 1
87.
      Next
88.
      
89.
      For intCnt = intColCnt To intOutCols - 1
90.
        strOutLine = strOutLine & strOutDelim
91.
      Next
92.
        
93.
      objOutStream.WriteLine(strOutLine)
94.
      Erase arrLine
95.
    Loop
96.
    
97.
    objInStream.Close
98.
  End If
99.
End Sub

Aufruf

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

Anwendung

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
Bitte warten ..
Mitglied: knotenknut
03.02.2014 um 09:44 Uhr
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

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..

Ich danke euch für die Teilnahme an diesem Thema.
Bitte warten ..
Mitglied: Endoro
03.02.2014 um 18:58 Uhr
Hey,
das kann gebatcht werden, aber leider artet das in Arbeit aus. Erschwerend kommt hinzu, dass colinardo scheints heut sein gewonnenes Surface feiert
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
Gruss!
Bitte warten ..
Mitglied: knotenknut
03.02.2014 um 19:40 Uhr
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
Bitte warten ..
Mitglied: Endoro
03.02.2014 um 19:45 Uhr
Hey,

na ja, nicht hier im Batch-Bereich sondern eher in der Office-Ecke.
Gruss.
Bitte warten ..
Mitglied: knotenknut
03.02.2014 um 19:57 Uhr
Ich danke dir!
und den anderen für die Teilnahme.
Bitte warten ..
Mitglied: Friemler
03.02.2014, aktualisiert 04.02.2014
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:
01.
Const ForReading   = 1
02.
Const ForAppending = 8
03.

04.

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

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

30.
'Ausgabedatei
31.
strOutFile = "DPAG.csv"
32.
'Spalten-Trennzeichen
33.
strOutDelimiter = ";"
34.
'Nummer der Spalte mit der Strasse
35.
intOutStreetCol = 3
36.
'Nummer der Spalte mit der PLZ
37.
intOutPLZCol = 5
38.
'Gesamtzahl der Spalten
39.
intOutCols = 8
40.
'*****************************************
41.

42.

43.
Set objFSO = CreateObject("Scripting.FileSystemObject")
44.

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

48.
'Erste Eingabedatei verarbeiten
49.
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
50.
                 strInFile1, strInDelimiter1, intStartLine1,_
51.
                 arrMappings1)
52.

53.
'Zweite Eingabedatei verarbeiten
54.
Call ProcessFile(objOutStream, strOutDelimiter, intOutCols,_
55.
                 strInFile2, strInDelimiter2, intStartLine2,_
56.
                 arrMappings2)
57.

58.
'Ausgabedatei schließen
59.
objOutStream.Close
60.

61.

62.

63.
Sub ProcessFile(objOutStream, strOutDelim, intOutCols,_
64.
                strInFile, strInDelim, intStartLine,_
65.
                arrMappings)
66.
  Dim intCnt, intMapCnt, intColCnt, arrLine, strOutLine, strStreet, strHouseNumber
67.
  Dim intSrcCol, intDstCol
68.
  Dim objInStream
69.
  
70.
  If objFSO.FileExists(strInFile) Then
71.
    Set objInStream = objFSO.OpenTextFile(strInFile, ForReading, false)
72.
    
73.
    For intCnt = 1 To intStartLine - 1
74.
      objInStream.SkipLine
75.
    Next
76.

77.
    Do While Not objInStream.AtEndOfStream
78.
      arrLine    = Split(objInStream.ReadLine, strInDelim)
79.
      strOutLine = ""
80.
      intColCnt  = 1
81.
      
82.
      If IsEmptyLine(arrLine) Then Exit Do
83.
      
84.
      For intMapCnt = 0 To UBound(arrMappings(0))
85.
        intSrcCol = arrMappings(0)(intMapCnt) - 1
86.
        intDstCol = arrMappings(1)(intMapCnt) - 1
87.
        
88.
        For intCnt = intColCnt To intDstCol
89.
          strOutLine = strOutLine & strOutDelim
90.
        Next
91.
        
92.
        If intColCnt             > intDstCol   And _
93.
           arrLine(intSrcCol)   <> ""          And _
94.
           Len(strOutLine)       > 0           And _
95.
           Right(strOutLine, 1) <> strOutDelim Then
96.
          strOutLine = strOutLine & " "
97.
        End If
98.
        
99.
        If intDstCol + 1 = intOutPLZCol Then
100.
          arrLine(intSrcCol) = Right("00000" & arrLine(intSrcCol), 5)
101.
        End If
102.

103.
        If intDstCol + 1 = intOutStreetCol Then
104.
          strStreet = arrLine(intSrcCol)
105.
          Call ExtractHouseNumber(strStreet, strHouseNumber)
106.

107.
          strOutLine = strOutLine & strStreet & strOutDelim & strHouseNumber
108.
          intColCnt  = intDstCol + 2
109.
        Else
110.
          strOutLine = strOutLine & arrLine(intSrcCol)
111.
          intColCnt  = intDstCol + 1
112.
        End If
113.
      Next
114.
      
115.
      For intCnt = intColCnt To intOutCols - 1
116.
        strOutLine = strOutLine & strOutDelim
117.
      Next
118.
        
119.
      objOutStream.WriteLine(strOutLine)
120.
      Erase arrLine
121.
    Loop
122.
    
123.
    objInStream.Close
124.
  End If
125.
End Sub
126.

127.

128.
Function IsEmptyLine(arrLine)
129.
  Dim intCnt
130.
  
131.
  For intCnt = 0 To UBound(arrLine)
132.
    If arrLine(intCnt) <> "" Then Exit For
133.
  Next
134.

135.
  IsEmptyLine = (intCnt > UBound(arrLine))
136.
End Function
137.

138.

139.
Sub ExtractHouseNumber(ByRef strStreet, ByRef strHouseNumber)
140.
  Dim objRegEx, colMatches
141.
  
142.
  strStreet      = Trim(strStreet)
143.
  strHouseNumber = ""
144.
  
145.
  Set objRegEx        = New RegExp
146.
  objRegEx.IgnoreCase = True
147.
  objRegEx.Pattern    = "([^0-9]*)([0-9]*[a-z ]*)"
148.

149.
  Set colMatches = objRegEx.Execute(strStreet)
150.
  
151.
  If colMatches.Count > 0 Then
152.
    If colMatches(0).SubMatches.Count > 1 Then
153.
      strStreet      = Trim(colMatches(0).SubMatches(0))
154.
      strHouseNumber = Trim(colMatches(0).SubMatches(1))
155.
    End If
156.
  End If
157.
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]
Bitte warten ..
Mitglied: knotenknut
03.02.2014 um 22:26 Uhr
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!

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.
Bitte warten ..
Mitglied: Friemler
04.02.2014, aktualisiert um 00:44 Uhr
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
Bitte warten ..
Mitglied: knotenknut
04.02.2014 um 13:31 Uhr
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:

01.

02.
"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";""
03.
"456";"User";"";"";"";"";"";"";"";"";"";"00000";"Artikel1";"Stück";"1";"EUR 1,50";"";"";"";"";"";"";"30.01.14";"";"";"";"";"";"Ja";"";"";"";"";"";"000000";"000000";""
04.
"456";"User";"";"";"";"";"";"";"";"";"";"00000";"Artikel2";"Stück";"1";"EUR 1,50";"";"";"";"";"";"";"31.01.14";"";"";"";"";"";"Ja";"";"";"";"";"";"000000";"000000";""
05.

06.
 
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
Bitte warten ..
Mitglied: Friemler
04.02.2014, aktualisiert um 17:07 Uhr
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:
01.
Option Explicit
02.

03.

04.
Const ForReading = 1
05.
Const ForWriting = 2
06.

07.

08.
Dim strInFile1, strInDelimiter1, intStartLine1, arrMappings1
09.
Dim strInFile2, strInDelimiter2, intStartLine2, arrMappings2
10.

11.
Dim strOutFileDE, strOutFileFC, strOutDelimiter
12.
Dim intOutPLZCol, intOutCountryCodeCol, intOutAdrTypeCol, intOutTotalCols
13.

14.
Dim arrCountryMappings
15.

16.
Dim objFSO, objOutStreamDE, objOutStreamFC
17.

18.

19.

20.
'********** Konfiguration ****************
21.
'Eingabedatei #1
22.
strInFile1 = "EB.csv"
23.
'Spalten-Trennzeichen
24.
strInDelimiter1 = ";"
25.
'Startzeile
26.
intStartLine1 = 3
27.
'Spalten-Mappings
28.
arrMappings1 = Array(_
29.
                     Array(3,7,6,10,8,11,1),_
30.
                     Array(1,2,3, 5,6, 7,8)_
31.
                    )
32.

33.
'Eingabedatei #2
34.
strInFile2 = "AM.csv"
35.
'Spalten-Trennzeichen
36.
strInDelimiter2 = ";"
37.
'Startzeile
38.
intStartLine2 = 2
39.
'Spalten-Mappings
40.
arrMappings2 = Array(_
41.
                     Array(17,19,20,18,23,21,24,1),_
42.
                     Array( 1, 2, 2, 3, 5, 6, 7,8)_
43.
                    )
44.

45.
'Ausgabedateien
46.
strOutFileDE = "DPAG.csv"
47.
strOutFileFC = "DPAG Ausland.csv"
48.
'Spalten-Trennzeichen
49.
strOutDelimiter = ";"
50.
'Nummer der Spalte mit der PLZ
51.
intOutPLZCol = 5
52.
'Nummer der Spalte mit dem Länderkürzel
53.
intOutCountryCodeCol = 7
54.
'Nummer der Spalte mit dem Adresstyp
55.
intOutAdrTypeCol = 8
56.
'Gesamtzahl der Spalten
57.
intOutTotalCols = 8
58.

59.
'Länderkürzel
60.
arrCountryMappings = Array(_
61.
                           Array(""  ,"Deutschland","DE","Österreich","AT","Schweiz","CH"),_
62.
                           Array("DE","DE"         ,"DE","AT"        ,"AT","CH"     ,"CH")_
63.
                          )
64.
'*****************************************
65.

66.

67.
Set objFSO = CreateObject("Scripting.FileSystemObject")
68.

69.
If Not FileExists(strOutFileDE) Then WScript.Quit
70.
If Not FileExists(strOutFileFC) Then WScript.Quit
71.

72.
'Ausgabedateien initialisieren
73.
Set objOutStreamDE = InitOutFile(strOutFileDE)
74.
Set objOutStreamFC = InitOutFile(strOutFileFC)
75.

76.
'Erste Eingabedatei verarbeiten
77.
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
78.
                 strInFile1, strInDelimiter1, intStartLine1,_
79.
                 arrMappings1)
80.

81.
'Zweite Eingabedatei verarbeiten
82.
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
83.
                 strInFile2, strInDelimiter2, intStartLine2,_
84.
                 arrMappings2)
85.

86.
'Ausgabedateien schließen
87.
objOutStreamDE.Close
88.
objOutStreamFC.Close
89.

90.

91.

92.
Sub ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelim, intOutTotalCols,_
93.
                strInFile, strInDelim, intStartLine,_
94.
                arrMappings)
95.
  Dim intCnt, intMapCnt, intColCnt
96.
  Dim arrLine, strOutLine, strCountryCode
97.
  Dim intSrcCol, intDstCol
98.
  Dim bolIsGermanCustomer
99.
  Dim objInStream
100.
  
101.
  'Prüfen ob die Eingabedatei existiert
102.
  If objFSO.FileExists(strInFile) Then
103.
    'Flag initialisieren
104.
    bolIsGermanCustomer = True
105.
    
106.
    'Eingabedatei zum Lesen öffnen
107.
    Set objInStream  = objFSO.OpenTextFile(strInFile, ForReading, false)
108.
    
109.
    'Soviele Zeilen überspringen, bis die gewünschte Startzeile erreicht ist 
110.
    For intCnt = 1 To intStartLine - 1
111.
      objInStream.SkipLine
112.
    Next
113.

114.
    'Eingabedatei einlesen bis das Dateiende erreicht ist
115.
    Do While Not objInStream.AtEndOfStream
116.
      'Eine Zeile einlesen, anhand des Trennzeichens zerteilen
117.
      'und in Array speichern
118.
      arrLine = Split(objInStream.ReadLine, strInDelim)
119.
      
120.
      'Zeilenpuffer für die Ausgabe löschen
121.
      strOutLine = ""
122.
      
123.
      'Spaltenzähler für jede Eingabezeile neu initialisieren
124.
      intColCnt = 1
125.
      
126.
      'Wenn die eingelesene Zeile leer ist, das Einlesen der Datei beenden
127.
      If IsEmptyLine(arrLine) Then Exit Do
128.
      
129.
      'Alle Spalten-Mappings verarbeiten
130.
      For intMapCnt = 0 To UBound(arrMappings(0))
131.
        'Quell- und Zielspalte ermitteln
132.
        intSrcCol = arrMappings(0)(intMapCnt) - 1
133.
        intDstCol = arrMappings(1)(intMapCnt) - 1
134.
        
135.
        'Falls notwendig, den Zeilenpuffer bis zur
136.
        'ermittelten Zielspalte mit Leerzellen auffüllen
137.
        For intCnt = intColCnt To intDstCol
138.
          strOutLine = strOutLine & strOutDelim
139.
        Next
140.
        
141.
        'Falls in die Zielspalte bereits etwas eingetragen wurde,
142.
        'ein Leerzeichen an den Zeilenpuffer anhängen
143.
        If intColCnt             > intDstCol   And _
144.
           arrLine(intSrcCol)   <> ""          And _
145.
           Len(strOutLine)       > 0           And _
146.
           Right(strOutLine, 1) <> strOutDelim Then
147.
          strOutLine = strOutLine & " "
148.
        End If
149.
        
150.
        'Dafür sorgen, dass in der Spalte für Postleitzahlen
151.
        'immer 5 Ziffern stehen
152.
        If intDstCol + 1 = intOutPLZCol Then
153.
          arrLine(intSrcCol) = Right("00000" & arrLine(intSrcCol), 5)
154.
        End If
155.

156.
        'Aus dem Inhalt der Quellspalte mit dem Land der Versandadresse
157.
        'einen Ländercode erzeugen und ein Flag setzen, ob es sich um
158.
        'einen deutschen oder ausländischen Kunden handelt
159.
        If intDstCol + 1 = intOutCountryCodeCol Then
160.
          strCountryCode     = CountryCode(arrLine(intSrcCol))
161.
          arrLine(intSrcCol) = strCountryCode
162.
          
163.
          If StrComp(strCountryCode, "DE", vbTextCompare) = 0 Then
164.
            bolIsGermanCustomer = True
165.
          Else
166.
            bolIsGermanCustomer = False
167.
          End If
168.
        End If
169.

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

175.
        'Jetzt den Spaltenwert in den Zeilenpuffer übertragen
176.
        strOutLine = strOutLine & arrLine(intSrcCol)
177.
        
178.
        'Spaltenzähler auf die Nummer der Spalte setzen,
179.
        'die nach der gerade beschriebenen Spalte kommt
180.
        intColCnt  = intDstCol + 1
181.
      Next
182.
      
183.
      'Falls notwendig, den Zeilenpuffer bis zur
184.
      'vorgegebenen Endspalte mit Leerzellen auffüllen
185.
      For intCnt = intColCnt To intOutTotalCols - 1
186.
        strOutLine = strOutLine & strOutDelim
187.
      Next
188.
        
189.
      'Den Zeilenpuffer nur in die Ausgabedatei schreiben,
190.
      'wenn die Namensspalte nicht leer ist
191.
      If Left(strOutLine, 1) <> strOutDelim Then
192.
        'Jetzt anhand des oben gesetzten Flags entscheiden, in welche
193.
        'der beiden Ausgabedateien der Zeilenpuffer geschrieben wird
194.
        If bolIsGermanCustomer Then
195.
          objOutStreamDE.WriteLine(strOutLine)
196.
        Else
197.
          objOutStreamFC.WriteLine(strOutLine)
198.
        End If
199.
      End If
200.
      
201.
      'Speicher des Arrays mit der Eingabezeile freigeben
202.
      Erase arrLine
203.
    Loop
204.
    
205.
    'Eingabedatei schließen
206.
    objInStream.Close
207.
  End If
208.
End Sub
209.

210.

211.
Function FileExists(strFile)
212.
  If objFSO.FileExists(strFile) Then
213.
    FileExists = True
214.
  Else
215.
    MsgBox "Die Datei" & vbNewLine & _
216.
           strFile & vbNewLine & _
217.
           "existiert nicht!", _
218.
           vbCritical + vbOKOnly + vbDefaultButton1, _
219.
           WScript.ScriptName
220.

221.
    FileExists = False
222.
  End If
223.
End Function
224.

225.

226.
Function InitOutFile(strOutFile)
227.
  Dim objInStream, objOutStream, strFirstTwoLines
228.
  
229.
  'Ausgabedatei zum Lesen öffnen und die ersten zwei Zeilen auslesen
230.
  Set objInStream  = objFSO.OpenTextFile(strOutFile, ForReading, false)
231.
  strFirstTwoLines = objInStream.ReadLine & vbNewLine & _
232.
                     objInStream.ReadLine & vbNewLine
233.
  objInStream.Close
234.

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

242.

243.
Function IsEmptyLine(arrLine)
244.
  Dim intCnt
245.
  
246.
  For intCnt = 0 To UBound(arrLine)
247.
    If arrLine(intCnt) <> "" Then Exit For
248.
  Next
249.

250.
  IsEmptyLine = (intCnt > UBound(arrLine))
251.
End Function
252.

253.

254.
Function CountryCode(strCountryName)
255.
  Dim intCnt
256.
  
257.
  CountryCode = ""
258.
  
259.
  For intCnt = 0 To UBound(arrCountryMappings(0))
260.
    If StrComp(arrCountryMappings(0)(intCnt), strCountryName, vbTextCompare) = 0 Then
261.
      CountryCode = arrCountryMappings(1)(intCnt)
262.
      Exit For
263.
    End If
264.
  Next
265.
End Function
Gruß
Friemler
Bitte warten ..
Mitglied: knotenknut
04.02.2014 um 17:46 Uhr
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:

01.
"	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
02.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
03.
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;;
04.
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;;
05.
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;;
06.
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;;
07.
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;;
08.
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;
09.
456;7;;;;;;;;;;0;Artikel 6;Stück;1;EUR 5,50;;;;;;;30.01.2014;;;;;;Ja;;;;;;0;0;
10.
456;8;;;;;;;;;;0;Artikel 7;Stück;1;EUR 5,50;;;;;;;31.01.2014;;;;;;Ja;;;;;;0;0;
11.
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;;
12.
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;;
13.
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;;
14.
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;;
15.
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;;
16.
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;;
17.
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;;
18.
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;;
19.
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;;
20.
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;;
21.
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;;
22.
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;;
23.
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;;
24.
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;;
25.
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;;
26.
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;;
27.
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;;
28.
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;;
29.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
30.
24; Verkaufsprotokoll(e) heruntergeladen;von ;28.01.2014;11:29:56; bis ;03.02.2014;11:27:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31.
Mitgliedsname des Verkäufers: 0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32.

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

01.
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
02.
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
03.
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
04.
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
05.
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
06.
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
07.
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.
Bitte warten ..
Mitglied: Friemler
04.02.2014 um 18:08 Uhr
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
Bitte warten ..
Mitglied: knotenknut
04.02.2014 um 18:27 Uhr
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:

01.

02.
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
03.
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
04.
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
05.
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
06.
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
07.
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
08.
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
09.
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.

lg
Knut
Bitte warten ..
Mitglied: Friemler
04.02.2014, aktualisiert um 20:52 Uhr
Hallo Knut,

wir nähern uns einer Lösung.

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:
01.
Option Explicit
02.

03.

04.
'Definition der Konstanten
05.
Const ForReading = 1
06.
Const ForWriting = 2
07.

08.

09.
'Deklaration der Variablen
10.
Dim strInFile1, strInDelimiter1, intStartLine1, arrMappings1
11.
Dim strInFile2, strInDelimiter2, intStartLine2, arrMappings2
12.

13.
Dim strOutFileDE, strOutFileFC, strOutDelimiter
14.
Dim intOutPLZCol, intOutCountryCodeCol, intOutAdrTypeCol, intOutTotalCols
15.

16.
Dim arrCountryMappings, arrPostCodeMappings
17.

18.
Dim objFSO, objOutStreamDE, objOutStreamFC
19.

20.

21.

22.
'********** Konfiguration ****************
23.
'Eingabedatei #1
24.
strInFile1 = "EB.csv"
25.
'Spalten-Trennzeichen
26.
strInDelimiter1 = ";"
27.
'Startzeile
28.
intStartLine1 = 3
29.
'Spalten-Mappings
30.
arrMappings1 = Array(_
31.
  Array(3,7,6,10,8,11),_
32.
  Array(1,2,3, 5,6, 7)_
33.
)
34.

35.
'Eingabedatei #2
36.
strInFile2 = "AM.txt"
37.
'Spalten-Trennzeichen
38.
strInDelimiter2 = Chr(9)
39.
'Startzeile
40.
intStartLine2 = 2
41.
'Spalten-Mappings
42.
arrMappings2 = Array(_
43.
  Array(17,19,20,18,23,21,24),_
44.
  Array( 1, 2, 2, 3, 5, 6, 7)_
45.
)
46.

47.
'Ausgabedateien
48.
strOutFileDE = "DPAG.csv"
49.
strOutFileFC = "DPAG Ausland.csv"
50.
'Spalten-Trennzeichen
51.
strOutDelimiter = ";"
52.
'Nummer der Spalte mit der PLZ
53.
intOutPLZCol = 5
54.
'Nummer der Spalte mit dem Länderkürzel
55.
intOutCountryCodeCol = 7
56.
'Nummer der Spalte mit dem Adresstyp
57.
intOutAdrTypeCol = 8
58.
'Gesamtzahl der Spalten
59.
intOutTotalCols = 8
60.

61.
'Ländercodes
62.
arrCountryMappings = Array(_
63.
  Array(""  ,"Deutschland","DE","Österreich","AT","Schweiz","CH"),_
64.
  Array("DE","DE"         ,"DE","AT"        ,"AT","CH"     ,"CH")_
65.
)
66.

67.
'Länge der Postleitzahlen in den verschiedenen Ländern
68.
arrPostCodeMappings = Array(_
69.
  Array("DE","AT","CH"),_
70.
  Array(   5,   4,   4)_
71.
)
72.
'*****************************************
73.

74.

75.
Set objFSO = CreateObject("Scripting.FileSystemObject")
76.

77.
'Alle verwendeten Dateien auf Vorhandensein prüfen
78.
If Not FileExists(strInFile1)   Then WScript.Quit
79.
If Not FileExists(strInFile2)   Then WScript.Quit
80.
If Not FileExists(strOutFileDE) Then WScript.Quit
81.
If Not FileExists(strOutFileFC) Then WScript.Quit
82.

83.
'Ausgabedateien initialisieren
84.
Set objOutStreamDE = InitOutFile(strOutFileDE)
85.
Set objOutStreamFC = InitOutFile(strOutFileFC)
86.

87.
'Erste Eingabedatei verarbeiten
88.
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
89.
                 strInFile1, strInDelimiter1, intStartLine1,_
90.
                 arrMappings1)
91.

92.
'Zweite Eingabedatei verarbeiten
93.
Call ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelimiter, intOutTotalCols,_
94.
                 strInFile2, strInDelimiter2, intStartLine2,_
95.
                 arrMappings2)
96.

97.
'Ausgabedateien schließen
98.
objOutStreamDE.Close
99.
objOutStreamFC.Close
100.

101.
'Erfolgsmeldung ausgeben
102.
MsgBox "Adressen wurden erfolgreich erfasst.", _
103.
       vbInformation + vbOKOnly + vbDefaultButton1, _
104.
       WScript.ScriptName
105.

106.
       
107.

108.

109.
Sub ProcessFile(objOutStreamDE, objOutStreamFC, strOutDelim, intOutTotalCols,_
110.
                strInFile, strInDelim, intStartLine,_
111.
                arrMappings)
112.
  Dim intCnt, intMapCnt, intColCnt
113.
  Dim arrInLine, arrOutLine, strLineBuffer
114.
  Dim strCountryCode, intPostCodeLength
115.
  Dim intSrcCol, intDstCol
116.
  Dim bolIsGermanCustomer
117.
  Dim objInStream
118.
  
119.
  'Eingabedatei zum Lesen öffnen
120.
  Set objInStream = objFSO.OpenTextFile(strInFile, ForReading, false)
121.
  
122.
  'Soviele Zeilen überspringen, bis die gewünschte Startzeile erreicht ist 
123.
  For intCnt = 1 To intStartLine - 1
124.
    objInStream.SkipLine
125.
  Next
126.

127.
  'Eingabedatei einlesen bis das Dateiende erreicht ist
128.
  Do While Not objInStream.AtEndOfStream
129.
    'Eine Zeile einlesen, anhand des Trennzeichens zerteilen
130.
    'und in Array speichern
131.
    arrInLine = Split(objInStream.ReadLine, strInDelim)
132.
    
133.
    'Zeilenpuffer für die Ausgabe löschen
134.
    strLineBuffer = ""
135.
    
136.
    'Spaltenzähler für jede Eingabezeile neu initialisieren
137.
    intColCnt = 1
138.
    
139.
    'Wenn die eingelesene Zeile leer ist, das Einlesen der Datei beenden
140.
    If IsEmptyLine(arrInLine) Then Exit Do
141.
    
142.
    'Alle Spalten-Mappings verarbeiten
143.
    For intMapCnt = 0 To UBound(arrMappings(0))
144.
      'Quell- und Zielspalte ermitteln
145.
      intSrcCol = arrMappings(0)(intMapCnt) - 1
146.
      intDstCol = arrMappings(1)(intMapCnt) - 1
147.
      
148.
      'Falls notwendig, den Zeilenpuffer bis zur
149.
      'ermittelten Zielspalte mit Leerzellen auffüllen
150.
      For intCnt = intColCnt To intDstCol
151.
        strLineBuffer = strLineBuffer & strOutDelim
152.
      Next
153.
      
154.
      'Falls in die Zielspalte bereits etwas eingetragen wurde,
155.
      'ein Leerzeichen an den Zeilenpuffer anhängen
156.
      If intColCnt                > intDstCol   And _
157.
         arrInLine(intSrcCol)    <> ""          And _
158.
         Len(strLineBuffer)       > 0           And _
159.
         Right(strLineBuffer, 1) <> strOutDelim Then
160.
        strLineBuffer = strLineBuffer & " "
161.
      End If
162.
      
163.
      'Jetzt den Spaltenwert in den Zeilenpuffer übertragen
164.
      strLineBuffer = strLineBuffer & arrInLine(intSrcCol)
165.
      
166.
      'Spaltenzähler auf die Nummer der Spalte setzen,
167.
      'die nach der gerade beschriebenen Spalte kommt
168.
      intColCnt  = intDstCol + 1
169.
    Next
170.
    
171.
    'Falls notwendig, den Zeilenpuffer bis zur
172.
    'vorgegebenen Endspalte mit Leerzellen auffüllen
173.
    For intCnt = intColCnt To intOutTotalCols - 1
174.
      strLineBuffer = strLineBuffer & strOutDelim
175.
    Next
176.

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

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

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

198.
    'Den Zeilenpuffer nur in die Ausgabedatei schreiben,
199.
    'wenn die Namensspalte nicht leer ist
200.
    If Left(strLineBuffer, 1) <> strOutDelim Then
201.
      'Jetzt anhand des oben gesetzten Flags entscheiden, in welche
202.
      'der beiden Ausgabedateien der Zeilenpuffer geschrieben wird
203.
      If bolIsGermanCustomer Then
204.
        objOutStreamDE.WriteLine(strLineBuffer)
205.
      Else
206.
        objOutStreamFC.WriteLine(strLineBuffer)
207.
      End If
208.
    End If
209.
    
210.
    'Speicher des Arrays mit der Eingabezeile freigeben
211.
    Erase arrInLine
212.
    Erase arrOutLine
213.
  Loop
214.
  
215.
  'Eingabedatei schließen
216.
  objInStream.Close
217.
End Sub
218.

219.

220.
Function FileExists(strFile)
221.
  If objFSO.FileExists(strFile) Then
222.
    FileExists = True
223.
  Else
224.
    MsgBox "Die Datei" & vbNewLine & _
225.
           strFile & vbNewLine & _
226.
           "existiert nicht!", _
227.
           vbCritical + vbOKOnly + vbDefaultButton1, _
228.
           WScript.ScriptName
229.

230.
    FileExists = False
231.
  End If
232.
End Function
233.

234.

235.
Function InitOutFile(strOutFile)
236.
  Dim objInStream, objOutStream, strFirstTwoLines
237.
  
238.
  'Ausgabedatei zum Lesen öffnen und die ersten zwei Zeilen auslesen
239.
  Set objInStream  = objFSO.OpenTextFile(strOutFile, ForReading, false)
240.
  strFirstTwoLines = objInStream.ReadLine & vbNewLine & _
241.
                     objInStream.ReadLine & vbNewLine
242.
  objInStream.Close
243.

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

251.

252.
Function IsEmptyLine(arrLine)
253.
  Dim intCnt
254.
  
255.
  For intCnt = 0 To UBound(arrLine)
256.
    If arrLine(intCnt) <> "" Then Exit For
257.
  Next
258.

259.
  IsEmptyLine = (intCnt > UBound(arrLine))
260.
End Function
261.

262.

263.
Function CountryCode(strCountryName)
264.
  Dim intCnt
265.
  
266.
  CountryCode = ""
267.
  
268.
  For intCnt = 0 To UBound(arrCountryMappings(0))
269.
    If StrComp(arrCountryMappings(0)(intCnt), strCountryName, vbTextCompare) = 0 Then
270.
      CountryCode = arrCountryMappings(1)(intCnt)
271.
      Exit For
272.
    End If
273.
  Next
274.
End Function
275.

276.

277.
Function PostCodeLength(strCountryCode)
278.
  Dim intCnt
279.
  
280.
  PostCodeLength = 0
281.
  
282.
  For intCnt = 0 To UBound(arrPostCodeMappings(0))
283.
    If StrComp(arrPostCodeMappings(0)(intCnt), strCountryCode, vbTextCompare) = 0 Then
284.
      PostCodeLength = arrPostCodeMappings(1)(intCnt)
285.
      Exit For
286.
    End If
287.
  Next
288.
End Function
Gruß
Friemler


[EDIT]
Code etwas aufgeräumt
[/EDIT]
Bitte warten ..
Mitglied: knotenknut
04.02.2014, aktualisiert um 19:52 Uhr
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
Bitte warten ..
Mitglied: Friemler
04.02.2014, aktualisiert um 20:02 Uhr
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
Bitte warten ..
Mitglied: knotenknut
04.02.2014 um 21:00 Uhr
Danke Friemler.

Dafür dass du schreibst selten anwesend zu sein antwortest du doch recht flink
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:

01.
Der Kunde:
02.
Hans Müller
03.
Muster Str. 12
04.
11111 Musterstadt
05.

06.
hat folgende Artikel Bestellt:
07.
1 x Artikel 1
08.
2 x Artikel 2
09.

10.
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
Bitte warten ..
Mitglied: Friemler
04.02.2014, aktualisiert 05.02.2014
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?):
01.
Option Explicit
02.

03.

04.
'Definition der Konstanten
05.
Const ForReading = 1
06.
Const ForWriting = 2
07.

08.

09.
'Deklaration der Variablen
10.
Dim strInFile1, strInDelimiter1, intStartLine1, arrMappings1
11.
Dim strInFile2, strInDelimiter2, intStartLine2, arrMappings2
12.

13.
Dim strOutFileDE, strOutFileFC, strOutDelimiter, strOrdersFile
14.
Dim intOutCustomerCol, intOutAddOnCol, intOutStreetCol, intOutHNoCol, intOutPostCodeCol
15.
Dim intOutTownCol, intOutCountryCodeCol, intOutAdrTypeCol, intOutTotalCols
16.
Dim intArtNameCol, intQuantityCol
17.

18.
Dim arrCountryMappings, arrCountryCodeMappings
19.

20.
Dim objFSO, objOutStreamDE, objOutStreamFC, objOrdersStream
21.

22.

23.

24.
'********** Konfiguration ****************
25.
'Eingabedatei #1
26.
strInFile1 = "EB.csv"
27.
'Spalten-Trennzeichen
28.
strInDelimiter1 = ";"
29.
'Startzeile
30.
intStartLine1 = 3
31.
'Spalten-Mappings
32.
arrMappings1 = Array(_
33.
  Array(3,7,6,10,8,11),_
34.
  Array(1,2,3, 5,6, 7),_
35.
  Array(13,15)_
36.
)
37.

38.
'Eingabedatei #2
39.
strInFile2 = "AM.txt"
40.
'Spalten-Trennzeichen
41.
strInDelimiter2 = Chr(9)
42.
'Startzeile
43.
intStartLine2 = 2
44.
'Spalten-Mappings
45.
arrMappings2 = Array(_
46.
  Array(17,19,20,18,23,21,24),_
47.
  Array( 1, 2, 2, 3, 5, 6, 7),_
48.
  Array(12,13)_
49.
)
50.

51.
'Ausgabedateien
52.
strOutFileDE = "DPAG.csv"
53.
strOutFileFC = "DPAG Ausland.csv"
54.
'Spalten-Trennzeichen
55.
strOutDelimiter = ";"
56.
'Nummer der Spalte mit dem Kundennamen
57.
intOutCustomerCol = 1
58.
'Nummer der Spalte mit den Zusatzinfos
59.
intOutAddOnCol = 2
60.
'Nummer der Spalte mit der Strasse
61.
intOutStreetCol = 3
62.
'Nummer der Spalte mit der Hausnummer
63.
intOutHNoCol = 4
64.
'Nummer der Spalte mit der PLZ
65.
intOutPostCodeCol = 5
66.
'Nummer der Spalte mit der Stadt
67.
intOutTownCol = 6
68.
'Nummer der Spalte mit dem Ländercode
69.
intOutCountryCodeCol = 7
70.
'Nummer der Spalte mit dem Adresstyp
71.
intOutAdrTypeCol = 8
72.
'Gesamtzahl der Spalten
73.
intOutTotalCols = 8
74.

75.
'Auftragsdatei
76.
strOrdersFile = "Aufträge.txt"
77.
'Arrayindex der Spaltennummer der Artikelbezeichnung
78.
intArtNameCol = 0
79.
'Arrayindex der Spaltennummer der Menge
80.
intQuantityCol = 1
81.

82.
'Ländercodes
83.
arrCountryMappings = Array(_
84.
  Array(""  ,"Deutschland","DE","Österreich","AT","Schweiz","CH"),_
85.
  Array("DE","DE"         ,"DE","AT"        ,"AT","CH"     ,"CH")_
86.
)
87.

88.
'Zuordnung der Ländercodes zum Namen des Landes und
89.
'der Länge der Postleitzahlen
90.
arrCountryCodeMappings = Array(_
91.
  Array("DE"         ,"AT"        ,"CH"     ),_
92.
  Array("Deutschland","Österreich","Schweiz"),_
93.
  Array(            5,           4,        4)_
94.
)
95.
'*****************************************
96.

97.

98.
Set objFSO = CreateObject("Scripting.FileSystemObject")
99.

100.
'Alle verwendeten Dateien auf Vorhandensein prüfen
101.
If Not FileExists(strInFile1)   Then WScript.Quit
102.
If Not FileExists(strInFile2)   Then WScript.Quit
103.
If Not FileExists(strOutFileDE) Then WScript.Quit
104.
If Not FileExists(strOutFileFC) Then WScript.Quit
105.

106.
'Ausgabedateien initialisieren
107.
Set objOutStreamDE  = InitOutFile(strOutFileDE)
108.
Set objOutStreamFC  = InitOutFile(strOutFileFC)
109.
Set objOrdersStream = objFSO.CreateTextFile(strOrdersFile, True)
110.

111.
'Erste Eingabedatei verarbeiten
112.
Call ProcessFile(strInFile1, strInDelimiter1, intStartLine1, arrMappings1)
113.

114.
'Zweite Eingabedatei verarbeiten
115.
Call ProcessFile(strInFile2, strInDelimiter2, intStartLine2, arrMappings2)
116.

117.
'Ausgabedateien schließen
118.
objOutStreamDE.Close
119.
objOutStreamFC.Close
120.
objOrdersStream.Close
121.

122.
'Erfolgsmeldung ausgeben
123.
MsgBox "Adressen wurden erfolgreich erfasst.", _
124.
       vbInformation + vbOKOnly + vbDefaultButton1, _
125.
       WScript.ScriptName
126.

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

132.

133.

134.
Sub ProcessFile(strInFile, strInDelim, intStartLine, arrMappings)
135.
  Dim intCnt, intMapCnt, intColCnt
136.
  Dim arrInLine, arrOutLine, strLineBuffer
137.
  Dim strCountryCode, intPostCodeLength
138.
  Dim intSrcCol, intDstCol
139.
  Dim bolIsGermanCustomer
140.
  Dim objInStream
141.

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

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

150.
  'Eingabedatei einlesen bis das Dateiende erreicht ist
151.
  Do While Not objInStream.AtEndOfStream
152.
    'Eine Zeile einlesen
153.
    strLineBuffer = objInStream.ReadLine
154.

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

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

161.
    'Anführungszeichen um die Zelleninhalte entfernen
162.
    For intCnt = 0 To UBound(arrInLine)
163.
      arrInLine(intCnt) = UnQuote(arrInLine(intCnt))
164.
    Next
165.

166.
    'Zeilenpuffer für die Ausgabe löschen
167.
    strLineBuffer = ""
168.

169.
    'Spaltenzähler für jede Eingabezeile neu initialisieren
170.
    intColCnt = 1
171.

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

175.
    'Alle Spalten-Mappings verarbeiten
176.
    For intMapCnt = 0 To UBound(arrMappings(0))
177.
      'Quell- und Zielspalte ermitteln
178.
      intSrcCol = arrMappings(0)(intMapCnt) - 1
179.
      intDstCol = arrMappings(1)(intMapCnt) - 1
180.

181.
      'Falls notwendig, den Zeilenpuffer bis zur
182.
      'ermittelten Zielspalte mit Leerzellen auffüllen
183.
      For intCnt = intColCnt To intDstCol
184.
        strLineBuffer = strLineBuffer & strOutDelimiter
185.
      Next
186.

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

196.
      'Jetzt den Spaltenwert in den Zeilenpuffer übertragen
197.
      strLineBuffer = strLineBuffer & arrInLine(intSrcCol)
198.

199.
      'Spaltenzähler auf die Nummer der Spalte setzen,
200.
      'die nach der gerade beschriebenen Spalte kommt
201.
      intColCnt  = intDstCol + 1
202.
    Next
203.

204.
    'Falls notwendig, den Zeilenpuffer bis zur
205.
    'vorgegebenen Endspalte mit Leerzellen auffüllen
206.
    For intCnt = intColCnt To intOutTotalCols - 1
207.
      strLineBuffer = strLineBuffer & strOutDelimiter
208.
    Next
209.

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

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

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

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

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

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

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

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

252.
      If arrOutLine(intOutAddOnCol - 1) <> "" Then
253.
        objOrdersStream.WriteLine(arrOutLine(intOutAddOnCol - 1))
254.
      End If
255.

256.
      objOrdersStream.WriteLine(arrOutLine(intOutStreetCol - 1))
257.
      objOrdersStream.WriteLine(arrOutLine(intOutPostCodeCol - 1) & " " & arrOutLine(intOutTownCol - 1))
258.
      objOrdersStream.WriteLine(CountryName(arrOutLine(intOutCountryCodeCol - 1)))
259.
      objOrdersStream.WriteLine("")
260.
      objOrdersStream.WriteLine("hat folgende Artikel bestellt:")
261.

262.
      'Artikeldaten nur schreiben, wenn der aktuelle Datensatz
263.
      'in der Eingabedatei nicht aus mehreren Zeilen besteht.
264.
      'Es handelt sich also um eine Bestellung mit nur einem Artikel
265.
      If arrInLine(arrMappings(2)(intArtNameCol) - 1) <> "" Then
266.
        objOrdersStream.WriteLine(arrInLine(arrMappings(2)(intQuantityCol) - 1) & _
267.
                                  " x " & _
268.
                                  arrInLine(arrMappings(2)(intArtNameCol) - 1))
269.
      End If
270.
    Else
271.
      'Hier werden die Artikeldaten einer Bestellung,
272.
      'die aus mehreren Artikeln besteht, geschrieben
273.
      objOrdersStream.WriteLine(arrInLine(arrMappings(2)(intQuantityCol) - 1) & _
274.
                                " x " & _
275.
                                arrInLine(arrMappings(2)(intArtNameCol) - 1))
276.
    End If
277.

278.
    'Speicher der Zeilen-Arrays freigeben
279.
    Erase arrInLine
280.
    Erase arrOutLine
281.
  Loop
282.

283.
  'Eingabedatei schließen
284.
  objInStream.Close
285.
End Sub
286.

287.

288.
Sub ShowOrders()
289.
  Dim strLine, strOrderData, intCntEmptyLines
290.
  Dim bolIsDataSetComplete
291.

292.
  intCntEmptyLines     = 0
293.
  strOrderData         = ""
294.
  bolIsDataSetComplete = False
295.

296.
  Do While Not objOrdersStream.AtEndOfStream
297.
    strLine = objOrdersStream.ReadLine
298.

299.
    If strLine = "" Then intCntEmptyLines = intCntEmptyLines + 1
300.

301.
    If intCntEmptyLines <> 2 Then
302.
      If strLine <> "" Then
303.
        strOrderData = strOrderData & strLine & vbNewLine
304.
      ElseIf strOrderData <> "" Then
305.
        strOrderData = strOrderData & strLine & vbNewLine
306.
      Else
307.
        intCntEmptyLines = 0
308.
      End If
309.

310.
      If objOrdersStream.AtEndOfStream Then bolIsDataSetComplete = True
311.
    Else
312.
      bolIsDataSetComplete = True
313.
    End If
314.

315.
    If bolIsDataSetComplete Then
316.
      MsgBox strOrderData, vbInformation + vbOKOnly + vbDefaultButton1, WScript.ScriptName
317.
      intCntEmptyLines     = 0
318.
      strOrderData         = ""
319.
      bolIsDataSetComplete = False
320.
    End If
321.
  Loop
322.
End Sub
323.

324.

325.
Function FileExists(strFile)
326.
  If objFSO.FileExists(strFile) Then
327.
    FileExists = True
328.
  Else
329.
    MsgBox "Die Datei" & vbNewLine & _
330.
           strFile & vbNewLine & _
331.
           "existiert nicht!", _
332.
           vbCritical + vbOKOnly + vbDefaultButton1, _
333.
           WScript.ScriptName
334.

335.
    FileExists = False
336.
  End If
337.
End Function
338.

339.

340.
Function InitOutFile(strOutFile)
341.
  Dim objInStream, objOutStream, strFirstTwoLines
342.

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

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

353.
  Set InitOutFile = objOutStream
354.
End Function
355.

356.

357.
Function UnQuote(strString)
358.
  Dim strResult
359.

360.
  strResult = Trim(strString)
361.

362.
  If Left(strResult, 1) & Right(strResult, 1) = """""" Then
363.
    strResult = Mid(strResult, 2, Len(strResult) - 2)
364.
  End If
365.

366.
  UnQuote = strResult
367.
End Function
368.

369.

370.
Function IsEmptyLine(arrLine)
371.
  Dim intCnt
372.

373.
  For intCnt = 0 To UBound(arrLine)
374.
    If arrLine(intCnt) <> "" Then Exit For
375.
  Next
376.

377.
  IsEmptyLine = (intCnt > UBound(arrLine))
378.
End Function
379.

380.

381.
Function CountryCode(strCountryName)
382.
  Dim intCnt
383.

384.
  CountryCode = ""
385.

386.
  For intCnt = 0 To UBound(arrCountryMappings(0))
387.
    If StrComp(arrCountryMappings(0)(intCnt), strCountryName, vbTextCompare) = 0 Then
388.
      CountryCode = arrCountryMappings(1)(intCnt)
389.
      Exit For
390.
    End If
391.
  Next
392.
End Function
393.

394.

395.
Function CountryName(strCountryCode)
396.
  Dim intCnt
397.

398.
  CountryName = ""
399.

400.
  For intCnt = 0 To UBound(arrCountryCodeMappings(0))
401.
    If StrComp(arrCountryCodeMappings(0)(intCnt), strCountryCode, vbTextCompare) = 0 Then
402.
      CountryName = arrCountryCodeMappings(1)(intCnt)
403.
      Exit For
404.
    End If
405.
  Next
406.
End Function
407.

408.

409.
Function PostCodeLength(strCountryCode)
410.
  Dim intCnt
411.

412.
  PostCodeLength = 0
413.

414.
  For intCnt = 0 To UBound(arrCountryCodeMappings(0))
415.
    If StrComp(arrCountryCodeMappings(0)(intCnt), strCountryCode, vbTextCompare) = 0 Then
416.
      PostCodeLength = arrCountryCodeMappings(2)(intCnt)
417.
      Exit For
418.
    End If
419.
  Next
420.
End Function
Gruß
Friemler
Bitte warten ..
Mitglied: knotenknut
05.02.2014 um 07:11 Uhr
Guten Morgen.
Und nochmal Danke
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
Bitte warten ..
Mitglied: Friemler
05.02.2014 um 09:58 Uhr
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
Bitte warten ..
Mitglied: knotenknut
05.02.2014 um 13:38 Uhr
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
Bitte warten ..
Mitglied: Friemler
05.02.2014 um 14:55 Uhr
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
Bitte warten ..
Mitglied: knotenknut
05.02.2014, aktualisiert um 16:54 Uhr
Danke.
Kein Problem.
Das Script spart mit soviel Zeit, die ich dann nutzen kann um mich in Geduld zu üben


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

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:

01.

02.
	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
03.

04.
"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";"";""
05.
"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";"";""
06.

07.
2; Verkaufsprotokoll(e) heruntergeladen;von ;02.02.14;12:03:33; bis ;02.02.14;12:12:58
08.
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
Bitte warten ..
Mitglied: Friemler
05.02.2014 um 19:14 Uhr
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
Bitte warten ..
Mitglied: knotenknut
05.02.2014 um 20:22 Uhr
Verstehe, kein Problem.
Und für die andere Korrektur danke ich dir nochmal

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.
Bitte warten ..
Mitglied: Friemler
LÖSUNG 05.02.2014, aktualisiert 01.05.2014
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
Bitte warten ..
Mitglied: knotenknut
05.02.2014 um 21:47 Uhr
ok. verstanden.
Danke
Bitte warten ..
Mitglied: knotenknut
01.05.2014 um 19:54 Uhr
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
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
XML in CSV bat batch powershell
Frage von nolle99Batch & Shell9 Kommentare

Als erstes mal frohe Ostern euch allen ;) Nach dem Essen habe ich nun ein Problem das ich gern ...

Microsoft Office
Word bestimmt Sprache selbst
gelöst Frage von honeybeeMicrosoft Office1 Kommentar

Hallo, habe in Word 2016 ein nerviges Problem: Auf meinem Computer (Windows 10) sind zwei Sprachen installiert: Deutsch und ...

Mac OS X
Safari öffnet bestimmt Seite nicht
Frage von tomi93Mac OS X2 Kommentare

Hallo , ich habe an einem iMac bei uns im Unternehmen das Problem das Safari dort eine bestimmte Seite ...

Weiterbildung
Bat Dateien
Frage von fajo23Weiterbildung20 Kommentare

Ich habe folgendes Problem. Ich habe auf meiner Festplatte viele Dateinamen die wie folgt aussehen: 20180126 2355 - Dlf ...

Neue Wissensbeiträge
Datenschutz

SiSyPHuS Win10: Analyse der Telemetriekomponenten in Windows 10

Tipp von freesolo vor 2 TagenDatenschutz1 Kommentar

Alle die sich detailliert für die Datensammlung interessieren die unter Windows 10 stattfindet, sollten sich folgende Analyse des BSI ...

Sicherheit
Adminrechte dank Intel-Grafikkarte
Information von DerWoWusste vor 2 TagenSicherheit1 Kommentar

ist das Advisory, welches beschreibt, welche Intel HD Graphics Modelle Sicherheitslücken haben, mit denen sich schwache Nutzer zu Admins ...

Internet

EU Urheberrechtsreform: Eingriff in die Internetkultur

Information von Frank vor 3 TagenInternet1 Kommentar

Liebe Besucherin, lieber Besucher, warum erscheint das obere Banner in allen Beiträgen? Aus Protest gegen Teile der geplanten EU-Urheberrechtsreform ...

Windows Server
Windows Backup - FilterManager Event 3
Tipp von NixVerstehen vor 4 TagenWindows Server

Hallo zusammen, ich bin kein gelernter ITler und auch beruflich nicht in dem Feld tätig. Wir setzen in unserem ...

Heiß diskutierte Inhalte
Hyper-V
Hyper-V Manager startet, jedoch keine VM
Frage von NaleorHyper-V14 Kommentare

Hallo zusammen, auf meinem Windows 10 (Build 1703) Notebook von der Arbeit scheint Hyper-V plötzliche nicht mehr zu funktionieren. ...

Windows Server
Sonntagsfrage: Welchen Sinn seht Ihr noch im Server 2019 Essentials
Frage von ashnodWindows Server13 Kommentare

Guten Morgen, ich habe gestern den Windows Server 2019 Essentials als Trial in einer VM installiert um mir das ...

DNS
50 EUR für Telekom-, Unitymedia- und Vodafone-Kunden
Frage von Zorro1199DNS13 Kommentare

Hallo zusammen, wie evaluieren gerade das korrekte Einhalten von DNS-TTLs durch verschiedene Provider. Aktuell suchen wir noch Kunden der ...

Windows 10
Windows 10 PC kein Ping möglich von anderen PCs
Frage von babylon05Windows 108 Kommentare

Hallo, ich habe 2 neue PC's in einer Windows 2008 Domän. Diese haben Windows 10. Die anderen PC's sind ...