chrislm
Goto Top

Eine Spalte aus einer anderen CSV übernehmen

Hallo
ich bin mit meinen batchdateien soweit durch aber ein kleines Problem habe ich noch.
Eine CSV mit Adresse und geburtsdatum wird versedet und kommt verarbeitet zurück. Leider ist dann das Datum in der empfangenen Datei etwas durcheinander, es fehlen die Jahreszahlen. in der von mir erstellten Datei ist aber das Datum richtig.
Nun suche ich eine Möglichkeit bei der empfangenen Datei das datum aus der 1. Datei zu übernehmen.

Das Datum steht bei beiden in Spalte 8.

nach meinen Versuchen scheint das mit einer Batchdatei unmöglich zu sein. kann man sowas über VBS lösen?

Content-ID: 181554

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

Ausgedruckt am: 25.11.2024 um 23:11 Uhr

TsukiSan
TsukiSan 07.03.2012 um 13:44:06 Uhr
Goto Top
Hallo chrislm

kann man sowas über VBS lösen?
JA!

Aber wenn du Hilfe hier beantragst, benötigen die Helfenden noch etwas mehr Input, damit der Output nicht kaputt geht face-wink

Spass beiseide.
Wenn du beide Dateien als Beispiel hier mal posten könntest, dann schauen wir, was sich machen lässt.

Gruss
Tsuki
it-frosch
it-frosch 07.03.2012 um 13:54:32 Uhr
Goto Top
Hallo chrislm,

die erste Frage wäre ob du diese Arbeit regelmäßig hast oder ob das im Moment eine einmalige Sache ist.

Bei Regelmäßigkeit wäre ich für evtl. VBS bei Einmaligkeit für den simplen SVERWEIS.

Du liest beide CSV in eine extra Karteikarte ein und verknüpfst die Datumsspalte über SVERWEIS.
Solle auch bei Tausenden von Datensätzen eine Arbeit von ca. 10min sein (Maximal!).

grüße vom it-frosch
chrislm
chrislm 07.03.2012 um 14:07:04 Uhr
Goto Top
also die sehen soweit identisch aus, und haben folgenden kopf:
"Nr";"Geschlecht";"Name";"Vorname";"PLZ";"Ort";"Strasse";"GebDat"
Um diese Datei zu erstellen gehe ich so vor:
for /f "tokens=1,16,1-16 delims=;" %%a in (out.txt) do echo %%p;%%c;%%d;%%e;%%f;%%g;%%h;%%i>>fertig.txt

das klappt uach soweit bisauf das Datum worin die Jahreszahlen verscwunden sind. Das ist aber kein Problem da ich die Daten vorher in einer CSV nochmal habe. Deswegen möchte ich gerne das Datum aus der ursprungsdate wieder eingepflegt haben.

So hatte ich mir das gedacht: wenn ich eine for schleife mache aus der datei mit dem richtigen Datum, mache es mit set x% =h%% und baue die 2. for - Schleife mit der out.csv und schreibe dann für h%% einfach von der anderen das x% ins echo......

aber ich weiß nicht wie man es richtig programiert...
chrislm
chrislm 07.03.2012 um 14:14:59 Uhr
Goto Top
ich generiere täglich 2- 3 Dateien. früher wurde alles von Hand gemacht und nun, seit ich den Job hier habe, habe ich mir batches erstellt die fast alles von alleine machen. es klappt uach bisauf den schönheitsfehler. die tabellen sind gleich und ich kann die zwar mit copy und past in excel tauschen aber wenn ich es als batch lösen kann wäre das klasse...
TsukiSan
TsukiSan 07.03.2012 um 14:23:00 Uhr
Goto Top
mit copy und past in excel tauschen aber

da würde sich doch der Makrorekorder vom Excel bestens zu eignen. Lass den arbeiten face-wink

Gruss
Tsuki
bastla
bastla 07.03.2012, aktualisiert am 18.10.2012 um 18:50:15 Uhr
Goto Top
Hallo chrislm!

Wenn doch Batch, sollten die beiden folgenden Threads helfen:
Zwei Texte Zeilenweise zusammenfügen per batch
Mehrere CSV Dateien zusammenfügen, nicht hintereinander, sondern parallel

Grüße
bastla
Pjordorf
Pjordorf 07.03.2012 um 14:53:49 Uhr
Goto Top
Hallo,

Zitat von @chrislm:
Eine CSV mit ... wird versedet und kommt verarbeitet zurück. Leider ist dann das Datum in der empfangenen Datei etwas durcheinander, es fehlen die Jahreszahlen.
Warum wird denn etwas an den daten einer Spalte verändert wenn du es nicht willst? Warum kann der verarbeiter nicht die datumswerte belassen? Was genau passiert denn da? Wurde denn die Verarbeitung und deren Folgen (geänderte Feldinhalte) nicht vorher besprochen / festgelegt? Wenn das Datum beim Verarbeiter nur gelesen werden sollte, warum ist es anschließend verändert? Warum sollte ein Geburtsdatum hier geändert (wie oft ändert sich das dennface-smile) werden? Das Datum wird ja wohl vom Verarbeiter wenn überhaupt dann nur ausgelesen, oder? Da solltest du ansetzen um erst gar keine unstimmigkeiten aufkommen zu lassen.

Gruß,
Peter
chrislm
chrislm 07.03.2012 um 15:15:43 Uhr
Goto Top
da habe ich schon gesucht, aber ich bekomme das Datum nicht richtig dazwischen... denn hinter dem Datum steht noch die Telefonnummer, habe ich oben vergessen in die Kopzeile zu schreiben.
chrislm
chrislm 07.03.2012 um 15:21:00 Uhr
Goto Top
also ich bekomme das Datum so zurück : 01.01.0070. es solle je 1970 heißen... überall bei den Jahreszahlen felht mir die 19.
Ich bekomme die daten zurück und hinten drann ist so ein Ampelsystem, diese Ampel baue ich dann in einer neuen CSV nach vorne, erstelle die Datei genau so wie ich sie hingeschickt habe. An den Daten kann ich nicht viel tun, das ist ein externes Unternehmen was die Daten überprüft.
Pjordorf
Pjordorf 07.03.2012 um 15:37:16 Uhr
Goto Top
Hallo,

Zitat von @chrislm:
also ich bekomme das Datum so zurück : 01.01.0070. es solle je 1970 heißen... überall bei den Jahreszahlen felht mir die 19.
Ja, und dafür sind aber Zwei nullen zuviel drin. Das Jahr 0070 hat es schon gegeben wenn wir das die Jahreszahl grundsätzlich 4 stellig schreiben. Wenn du als Datumswert ein 01.01.1970 hinschickst und ein 01.01.0070 zurückbekommst, dann ...

An den Daten kann ich nicht viel tun, das ist ein externes Unternehmen was die Daten überprüft.
Zeig mir mal das Unternehmen wo ich ungefragt CSV Dateien hinschicken kann, diese werden be/verarbeitet und ich bekomme diese geänderten Daten dann als CSV wieder zurück. Ihr werdet schon irgendeinen Vertrag oder sonstwas haben was dieses regelt. Und wenn dieses Externe Unternehmen seine Arbeit / Dienstleistung nicht korrekt erfüllt dann .... Nach deiner Aussage ist also dieses Externe Unternehmen Schuld an dein Problem und du hast es wohl auch so nicht mit denen abgesprochen / vereinbart.

Gruß,
Peter
TsukiSan
TsukiSan 07.03.2012 um 15:43:48 Uhr
Goto Top
überall bei den Jahreszahlen felht mir die 19
Wenn es als sicher gilt, dass alle im 20ten Jahundert geboren worden und immer die 00 durch die 19 ersetzt werden soll, dann ist es einfach mit VBS und REPLACE. Man muss nur aufpassen, dass andere Daten - wie Telefonnummern oder Adressen - nicht auch 00 enthalten!

Gruss
Tsuki
chrislm
chrislm 07.03.2012 um 16:17:13 Uhr
Goto Top
OK, dann lassen wir das ganze. Dann ist das doch mehr aufwand als die Sache wert ist. Ich lasse die Datei per batch erzeugen, wegschicken und holen. Deswegen ist es schade wenn alles soweit reibungslos funktioniert bisauf die eine kleinigkeit. dort. Oder, ich sende das datum nur mit jahreszahlen, ohne das jahhundert. Dann passt es auch wieder...


Trozdem allen vielen dank an alle die sich meinetwegen das Hirn zermartert haben...
TsukiSan
TsukiSan 08.03.2012 um 03:47:17 Uhr
Goto Top
Hallo chrisIm,

du gibst aber schnell auf face-wink

Nein, was wir nur versuchen zu vermitteln ist, dass das Problem bei jemanden liegt, der dir die Daten so verändert, dass du die Arbeit zum Schluss wieder damit hast. Du zerbrichst dir nun den Kopf, wie Du das wieder gerade bügeln kannst.
Von daher haben wir versucht, dir einige einfache und sehr schnelle Möglichkeiten aufzuzeigen.
Man kann deine CSV-Datei auch mit dem Wordpad öffnen, dann Tastenkombination STRG+H eingeben und dann 00 ersetzen durch 19 meinetwegen. Aber eventuell gibt es jemanden, der in dieser Liste nach 2000 geboren worden ist. Dann muss das schon wieder geändert werden.

Also, ich will's gar nicht zu lang machen und dir mal ein Beispiel-Code in VBS zeigen.
Ich habe deine Infos genommen bezüglich Aufbau der CSV-Dateien (vorher/nachher).
Ich gehe davon aus, dass das Geburtstagsdatum immer in der "letzten" Spalte steht!
Dim FSO
Dim DatenVorher , DatenNachher , DatenZumSchluss

Const CSV_vorher_Datei ="CSV_Before.csv"  
Const CSV_nachher_Datei ="CSV_After.csv"  
Const CSV_zumSchluss_Datei ="CSV_Fertig.csv"  

SET FSO = CreateObject("Scripting.FileSystemObject")  

DatenVorher = Split(FSO.OpenTextFile(CSV_vorher_Datei).ReadAll,vbcrlf)
DatenNachher = Split(FSO.OpenTextFile(CSV_nachher_Datei).ReadAll,vbcrlf)

For i = 1 to (Ubound(DatenVorher) - 1)
	tempV = Split(DatenVorher(i),";")  
	tempN = Split(DatenNachher(i),";")  
	tempN(Ubound(tempN)) = Replace(tempN(Ubound(tempN)),tempN(Ubound(tempN)),tempV(Ubound(tempV)))
	DatenZumSchluss = DatenZumSchluss & Join(tempN,";") & vbcrlf  
Next

FSO.CreateTextFile(CSV_zumSchluss_Datei).Write DatenZumSchluss

Set FSO = Nothing
Aber Vorsicht!
Der Code funktioiert nur, wenn...... Genau! Da gäbe es noch zu viele Wenn(s) und Aber(s)
Ansonsten könnte es unter Umständen sein, dass jemand an einem anderen Tag Geburtstag hat ganz plötzlich und und und..


Schau es dir mal an und dann überlege dir wirklich, ob es Sinn macht, da selber Geist reinzustecken in dein Vorhaben oder ob es doch nicht besser und einfacher ist, demjenigen auf die Finger zu (sc)hauen, der dir das verbockt face-wink

Gruss
Tsuki
it-frosch
it-frosch 10.03.2012 um 14:59:56 Uhr
Goto Top
Hallo chrislm,

du kannst auch via Makrorecorder und Text in Spalten die 01.01.0070 nach 6 Stellen trennen, die 0070 in eine Zahl umformen und 1900 dazuaddieren.

Das ganze machst du einmal manuell, läßt den Macrorecorder mitlaufen und speicherst das Ganze dann als Makro XY ab.

grüße vom it-frosch