Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung Batch & Shell

Mitglied: knotenknut

knotenknut (Level 1) - Jetzt verbinden

02.02.2014, aktualisiert 01.05.2014, 4631 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

Mit freundlichen Grüßen
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.

Mit freundlichen Grüßen
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 ..
Neuester Wissensbeitrag
DSL, VDSL

Telekom blockiert immer noch den Port 7547 in ihrem Netz

(3)

Erfahrungsbericht von joachim57 zum Thema DSL, VDSL ...

Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
gelöst Mit batch zeilen auslesen (2)

Frage von keksegriller zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...