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

Probleme mit Array in vbscript

Frage Entwicklung Batch & Shell

Mitglied: BadFsaadKl

BadFsaadKl (Level 1) - Jetzt verbinden

29.04.2014, aktualisiert 02.05.2014, 1800 Aufrufe, 13 Kommentare

Hallo zusammen,

ich habe mal wieder ein Problem, bei einem Vergleich / Update zweier Files mittels vbscript, und hohhe Ihr könnt mir helfen.
Habe zwar schon die ersten Grundzüge in dem Script, komme aber jetzt nicht weiter, wie und wo ich ein entsprechendes Array einbauen muss .

Aber erst einmal zur Ausgangssituation.
Ich habe zwei csv Files, welche ich auf Inhalt vergleichen muss, und wenn eine Bedingung zutrifft, soll ein Wert aus File A nach File B übernommen werden.

File A:
01.
XTSOL;p_model;p_stock;p_sorting;p_shipping;p_tpl;p_manufacturer;p_fsk18;p_priceNoTax;p_priceNoTax.1;p_priceNoTax.2;p_priceNoTax.3;p_tax;p_status;p_weight;p_ean 
02.
 
03.
XTSOL;41014500;10000;0;5;default;1_100FM;0;32.353;;;;1;1;0.00;8714572047791 
04.
XTSOL;85010700;10000;0;5;default;1_100FM;0;150.840;;;;1;1;0.00;8714572074919 
05.
XTSOL;10007800;9984;0;5;default;1_100FM;0;15.966;;;;1;1;0.00;8714572075060 
06.
XTSOL;80022100;0;0;5;default;1_100FM;0;23.529;;;;1;1;0.00;8714572079105
File B:
01.
products_id;external_id;afterbuy_id;afterbuy_image_path;permission_id;products_owner;products_ean;products_quantity;products_average_quantity;products_shippingtime;products_model 
02.
 
03.
8852;41777081;../info_images/12882_0.jpg;1;;;hier müsste die EAN stehen;1000.00;0;7;41014500 
04.
8820;41536000;../info_images/12854_0.jpg;1;;;8714572074919;1000.00;0;7;85010700 
05.
8671;41242775;../info_images/12746_0.jpg;1;;;8714572075060;1000.00;0;7;10007800 
06.
9157;43366458;../info_images/13102_0.jpg;1;;;8714572079105;1000.00;0;7;80022100
Ich habe nun das Problem, das in File B nicht alle EAN Nummern aus File A übernommen sind.
Im Normalfall steht diese in File B an der 7ten Stelle.
Bei einigen fehlt diese aber, und die Stelle ist leer.
In File A ist die EAN aber noch vorhanden, und müsste jetzt ausgelesen werden, und in File B übertragen werden.

Den Querverweis hierzu habe ich über die Felder p_model (File A - Zweiter Eintrag) und products_model (File B - 11ter Eintrag).
Als Beispiel siehe hier die Nummer "41014500".

Es müsste nun geprüft werden, ob in File B die 7te Stelle leer ist.
Ist das der Fall, muss aus File B, die Nummer aus products_model (File B - 11ter Eintrag) genommen werden, und nach diesem in p_model (File A - Zweiter Eintrag) gesucht werden.
Bei einem Treffer, muss nun aus File A die EAN (16te Stelle) in File B übernommen werden (7te Stelle).

Anbei mal mein Script, was ich bis jetzt habe.
Ich weis, ist nicht viel, aber das ist ja mein Problem, ich weis im Moment nicht, wie ich weiter machen muss...

01.
Const ForWriting = 2 
02.
Const ForReading = 1 
03.
Const ForAppending = 8 
04.
Set FSO = CreateObject("Scripting.FileSystemObject") 
05.
 
06.
Const Basis01 = "S:\datacenter\Workspace\tmp\file_a.csv" 
07.
Const Basis02 = "S:\datacenter\Workspace\tmp\file_b.csv" 
08.
Const Ausgabe01 = "S:\datacenter\Workspace\tmp\Ausgabe_Ergbenisse.csv" 
09.
 
10.
if not fso.fileexists(Basis01) then 
11.
	wscript.echo "Achtung die Eingabedatei " & Basis01 & " steht nicht zur Verfügung, Script wird abgebrochen" 
12.
	wscript.quit 
13.
end if 
14.
 
15.
if not fso.fileexists(Basis02) then 
16.
	wscript.echo "Achtung die Eingabedatei " & Basis02 & " steht nicht zur Verfügung, Script wird abgebrochen" 
17.
	wscript.quit 
18.
end if 
19.
 
20.
set mf = fso.CreateTextFile(Ausgabe01,True) : mf.close 
21.
 
22.
set xout = fso.OpenTextFile(Basis02, ForReading) 
23.
While not xout.AtEndOfStream 
24.
	inhalt_datei02=xout.Readall() 
25.
Wend 
26.
xout.close 
27.
 
28.
set erg = fso.OpenTextFile(Ausgabe01, ForAppending) 
29.
 
30.
set xout = fso.OpenTextFile(Basis01, ForReading) 
31.
While not xout.AtEndOfStream 
32.
	inhalt_datei01=xout.ReadLine() 
33.
if Instr(inhalt_datei02,inhalt_datei01) then 
34.
	'Mach Nischt 
35.
else 
36.
erg.write "      " & """" & inhalt_datei01 & " xx""," & vbcrlf 
37.
end if 
38.
Wend 
39.
xout.close 
40.
erg.close
Das script hatte ich mal, um einen kompletten String zweier Files zu vergleichen.

Ich hoffe Ihr könnt mir hier helfen.

Gruß
BadFsaadKl
Mitglied: bastla
29.04.2014 um 23:39 Uhr
Hallo BadFsaadKl!

Versuch es damit:
01.
Set fso = CreateObject("Scripting.FileSystemObject") 
02.
 
03.
Const Basis01 = "S:\datacenter\Workspace\tmp\file_a.csv" 
04.
Const Basis02 = "S:\datacenter\Workspace\tmp\file_b.csv" 
05.
Const Ausgabe01 = "S:\datacenter\Workspace\tmp\Ausgabe_Ergbenisse.csv" 
06.
 
07.
Const Delim = ";" 'Trennreichen 
08.
 
09.
If Not fso.FileExists(Basis01) Then 
10.
	WScript.Echo "Achtung die Eingabedatei " & Basis01 & " steht nicht zur Verfügung, Script wird abgebrochen" 
11.
	WScript.Quit 
12.
End If 
13.
 
14.
If Not fso.FileExists(Basis02) Then 
15.
	WScript.Echo "Achtung die Eingabedatei " & Basis02 & " steht nicht zur Verfügung, Script wird abgebrochen" 
16.
	WScript.Quit 
17.
End If 
18.
 
19.
Set xout = fso.OpenTextFile(Basis01) 
20.
If xout.AtEndOfStream Then 
21.
	WScript.Echo "Achtung die Eingabedatei " & Basis01 & " enthält keine Daten, Script wird abgebrochen" 
22.
	WScript.Quit 
23.
End If 
24.
Inhalt_Datei01 = Split(xout.ReadAll, vbNewLine) 
25.
 
26.
Set xout = fso.OpenTextFile(Basis02) 
27.
If xout.AtEndOfStream Then 
28.
	WScript.Echo "Achtung die Eingabedatei " & Basis02 & " enthält keine Daten, Script wird abgebrochen" 
29.
	WScript.Quit 
30.
End If 
31.
Inhalt_Datei02 = Split(xout.ReadAll, vbNewLine) 
32.
 
33.
'EAN-Tabelle aufbauen 
34.
Set d = CreateObject("Scripting.Dictionary") 
35.
For i = 2 To UBound(Inhalt_Datei01) 'erste 2 Zeilen überspringen 
36.
    Satz = Split(Inhalt_Datei01(i), Delim) 'Datensatz (Zeile) zerlegen 
37.
    d.Add Satz(1), Satz(15) 'Feld 2 = Schlüssel, Feld 16 = EAN 
38.
Next 
39.
 
40.
For i = 2 To UBound(Inhalt_Datei02) 'erste 2 Zeilen überspringen 
41.
    Satz = Split(Inhalt_Datei02(i), Delim) 'Datensatz (Zeile) zerlegen 
42.
    If Satz(6) = "" Then 'EAN in Feld 7 fehlt 
43.
        If d.Exists(Satz(10)) Then 'Schlüssel lt Feld 11 vorhanden? 
44.
            Satz(6) = d.Item(Satz(10)) 'EAN in Feld 7 übernehmen 
45.
        Else 
46.
            WScript.Echo "Für Zeile " & i + 1 & " keine EAN gefunden!" 
47.
            WScript.Quit 
48.
        End If 
49.
        Inhalt_Datei02(i) = Join(Satz, Delim) 'Satz überschreiben 
50.
    End If 
51.
Next 
52.
 
53.
fso.CreateTextFile(Ausgabe01).Write Join(Inhalt_Datei02, vbNewline) 'komplette Datei ausgeben
Grüße
bastla
Bitte warten ..
Mitglied: BadFsaadKl
30.04.2014 um 18:48 Uhr
Hallo Bastla,

erst einmal danke für die Hilfe.
Das Script bricht jedoch mit folgender Meldung ab:
01.
ean-abgleich.vbs(38, 5) Laufzeitfehler in Microsoft VBScript: Dieser Schlüssel ist bereits einem Element dieser Auflistung zugeordnet
Laut Fehlermeldung ist bei mir in Zeile 38,5 folgender Bereich
01.
d.Add Satz(1), Satz(15) 'Feld 2 = Schlüssel, Feld 16 = EAN 
In deinem Beispiel Zeile 37.

Gruß BadFsaadKl
Bitte warten ..
Mitglied: bastla
30.04.2014 um 19:41 Uhr
Hallo BadFsaadKl!

Ursache ist, dass in File A der Wert für "p_model" in mehreren Datensätzen gleich ist - mit
If Not d.Exists(Satz(1)) Then d.Add Satz(1), Satz(15) 'Feld 2 = Schlüssel, Feld 16 = EAN
sollte der Fehler nicht mehr auftreten ...

Grüße
bastla
Bitte warten ..
Mitglied: BadFsaadKl
30.04.2014 um 19:50 Uhr
Hi Bastla,

Ok, ist ausgetauscht.
01.
 
02.
'EAN-Tabelle aufbauen  
03.
Set d = CreateObject("Scripting.Dictionary")  
04.
For i = 1 To UBound(Inhalt_Datei01) 'erste Zeile überspringen  
05.
    Satz = Split(Inhalt_Datei01(i), Delim) 'Datensatz (Zeile) zerlegen  
06.
    If Not d.Exists(Satz(1)) Then d.Add Satz(1), Satz(15) 'Feld 2 = Schlüssel, Feld 16 = EAN  
07.
Next  
08.
 
jetzt bekomme ich folgenden Fehler:
01.
ean-abgleich.vbs(38, 5) Laufzeitfehler in Microsoft VBScript: Index außerhalb des gültigen Bereichs: '[number: 1]'
Gruß
Bad
Bitte warten ..
Mitglied: bastla
30.04.2014 um 20:00 Uhr
Hallo BadFsaadKl!

Vermutlich enthält die Datei A am Ende eine Leerzeile - demnach müssten die Zeilen 36 und 37 so ergänzt werden:
01.
    If Trim(Inhalt_Datei01(i)) <> "" Then 
02.
        Satz = Split(Inhalt_Datei01(i), Delim) 'Datensatz (Zeile) zerlegen 
03.
        If Not d.Exists(Satz(1)) Then d.Add Satz(1), Satz(15) 'Feld 2 = Schlüssel, Feld 16 = EAN 
04.
    End If
- analog dazu vermutlich auch für die "Inhalt_Dati02"-Schleife.

Alternativ dazu könntest Du auch mit
    If UBound(Satz) >= 15 Then d.Add Satz(1), Satz(15) 'Feld 2 = Schlüssel, Feld 16 = EAN
als Zeile 37 nur eine Zuweisung vornehmen, wenn genügend Felder gefunden wurden ...

Grüße
bastla
Bitte warten ..
Mitglied: BadFsaadKl
30.04.2014 um 20:21 Uhr
Hi Bastla,

soweit sogut, das Script bricht mir jetzt zwar nicht mehr, und läuft auch erfolgreich durch.
Aber irgendwie übernimmt das Script nicht die EAN Nummern in die Ausgabedatei .
Das Feld bleibt hierbei leer.

01.
8852;;41777081;../info_images/12882_0.jpg;1;;1000.00;;0;7;41014500
Vor der 1000.00 müsste hier eigentlich die EAN Nummer jetzt übernommen sein.

in File A ist die EAN auch vorhanden, an 16ter Stelle. Also Laut Array stelle 15, das würde ja soweit passen.
01.
XTSOL;41014500;10000;0;5;default;1_100FM;0;32.353;;;;1;1;0.00;8714572047791;1;0.00;default;0;0;0.0000;12882_0.jpg;
Hast du ne Idee woran das liegen kann ?

Gruß
Bad
Bitte warten ..
Mitglied: bastla
30.04.2014 um 20:35 Uhr
Hallo BadFsaadKl!

Wenn ich die Zeile mit der fehlenden EAN aus Deinem Beispiel oben mit Deinem letzten Beispiel vergleiche:
01.
8852;41777081;../info_images/12882_0.jpg;1;;;hier müsste die EAN stehen;1000.00;0;7;41014500 
02.
8852;;41777081;../info_images/12882_0.jpg;1;;1000.00;;0;7;41014500
fällt mir etwas auf - Dir auch?

Zähl mal bis 7 ...

Grüße
bastla
Bitte warten ..
Mitglied: BadFsaadKl
30.04.2014 um 20:49 Uhr
Hi Bastla,

Glaube muss mich entschuldigen, hatte glaub bei meinem Bespiel ein Semikolon zu viel entfernt.

Anbei aber mal der komplette auszug, und Vergleich der Files wie sie mir vorliegen:
01.
File A: 
02.
XTSOL;41014500;10000;0;5;default;1_100FM;0;32.353;;;;1;1;0.00;8714572047791 
03.
File B: 
04.
8852;;41777081;../info_images/12882_0.jpg;;1; ;1000.00;0;7;41014500 
05.
Ausgabe: 
06.
8852;;41777081;../info_images/12882_0.jpg;;1; ;1000.00;0;7;41014500
Und hier passt es doch aber, oder ?
In File B bzw. Ausgabe müsste die EAN an die 7te Stelle.

Oder steh ich jetzt irgendwie auf dem schlauch ?

Gruß
Bad
Bitte warten ..
Mitglied: bastla
30.04.2014 um 20:57 Uhr
Hallo Hallo BadFsaadKl!

Jetzt hast Du anstatt der EAN ein Leerzeichen - wenn dem wirklich so sein sollte, müsstest Du Zeile 42 auf
If Trim(Satz(6)) = "" Then 'EAN in Feld 7 fehlt
ändern (kannst Du aber auf jeden Fall machen) ...

Grüße
bastla
Bitte warten ..
Mitglied: BadFsaadKl
30.04.2014 um 21:17 Uhr
BASTLA....
Du bist mein Held !!!
Danke dir...

Sag mal wenn ich jetzt noch nen weiteres Feld abgleichen wöllte, müsste ich das doch nur als neuen "Satz" anfügen, oder ?
In File A hab ich ein Feld 14, welches ich dann in File B an Stelle 24 bringen würde.

Würde ich jetzt wie folgt machen:
01.
Set d = CreateObject("Scripting.Dictionary")  
02.
For i = 1 To UBound(Inhalt_Datei01) 'erste Zeile überspringen 
03.
	if Trim(Inhalt_Datei01(i)) <> "" Then 
04.
		Satz = Split(Inhalt_Datei01(i), Delim) 'Datensatz (Zeile) zerlegen  
05.
		If Not d.Exists(Satz(1)) Then d.Add Satz(1), Satz(15), Satz(13) 'Feld 2 = Schlüssel, Feld 16 = EAN, Feld 13 = Status 
06.
	End If 
07.
Next  
08.
 
09.
For i = 1 To UBound(Inhalt_Datei02) 'erste Zeile überspringen  
10.
    Satz = Split(Inhalt_Datei02(i), Delim) 'Datensatz (Zeile) zerlegen  
11.
	If Trim(Inhalt_Datei02(i)) <> "" Then	 
12.
		If Trim(Satz(6)) = "" Then 'EAN in Feld 7 fehlt  
13.
			If d.Exists(Satz(10)) Then 'Schlüssel lt Feld 11 vorhanden?  
14.
				Satz(6) = d.Item(Satz(10)) 'EAN in Feld 7 übernehmen  
15.
				Satz(23) = d.Item(Satz(23)) 
16.
			Else  
17.
				WScript.Echo "Für Zeile " & i + 1 & " keine EAN gefunden!"  
18.
				'WScript.Quit  
19.
			End If  
20.
			Inhalt_Datei02(i) = Join(Satz, Delim) 'Satz überschreiben  
21.
		End If  
22.
	End If 
23.
Next 
Oder bringe ich hier jetzt noch was mit den Satz-Array durcheinander ?

In Zeile 5 habe ich es mit dekraliert, als Satz(13).
Aber glaub habe bei der Übergabe
01.
Satz(23) = d.Item(Satz(23)) 
noch nen kleinen Denkfehler, oder ?

Gruß
Bad
Bitte warten ..
Mitglied: bastla
LÖSUNG 30.04.2014, aktualisiert 02.05.2014
Hallo BadFsaadKl!

Schau Dir einmal das Dictionary genauer an: http://msdn.microsoft.com/en-us/library/x4k5wbx4%28v=vs.84%29.aspx

Du kannst zu jedem Schlüssel nur einen Wert speichern - daher entweder die beiden benötigten Werte zusammenfassen und danach wieder trennen, oder (wenn es wirklich nur 2 Werte sein sollten) ein zweites Dictionary erstellen und den zweiten Wert dort ablegen / heraussuchen.

Möglichkeit 1 sähe etwa so aus:
In die Liste schreiben:
If Not d.Exists(Satz(1)) Then d.Add Satz(1), Satz(15) & Delim & Satz(13) 'Feld 2 = Schlüssel, Feld 16 = EAN und Feld 14 = Status, getrennt durch ";" (Delim) als Wert speichern
Aus der Liste lesen:
01.
			If d.Exists(Satz(10)) Then 'Schlüssel lt Feld 11 vorhanden? 
02.
                                Werte = Split(d.Item(Satz(10)), Delim) 'zum Schlüssel gespeicherte Werte (ein String) in Array einlesen; dazu anhand des Delimiters ";" trennen 
03.
				Satz(6) = Werte(0) 'EAN in Feld 7 übernehmen  
04.
				Satz(23) = Werte(1) 'Status in Feld 24 übernehmen
Nach diesem Muster kannst Du dann auch 3 oder mehr Werte abgleichen.

Grüße
bastla
Bitte warten ..
Mitglied: BadFsaadKl
30.04.2014 um 21:49 Uhr
Hi Bastla,

klingt irgendwie kompliziert %).

Ja, das sind nur 2 Werte...
Einmal die EAN Nummer, und der zweite Wert ist entweder eine 1 oder 0.

Äh, blöde Frage.
Wie speichere ich in diesem Zusammenhang die beiden Zahlen als Wert ab ?
Wo mach ich hier die Deklaration ?

Ist ja bestimmt wieder mit
01.
Werte = Split...
Gruß
Bad
Bitte warten ..
Mitglied: bastla
30.04.2014 um 23:01 Uhr
Hallo BadFsaadKl!
Wie speichere ich in diesem Zusammenhang die beiden Zahlen als Wert ab ?
Steht doch schon da: Der Status ist in Satz(13) zu finden und wird einfach zusammen mit der EAN gespeichert, sodass lt Deinem Beispiel für den Key "41014500" der Wert "8714572047791;1" abgelegt wird - beim Auslesen entsteht dann per Split das Array "Werte", wobei in Werte(0) "8714572047791" und in Werte(1) eben "1" enthalten ist.

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Microsoft Office
Office 2016 Probleme mit Outlook (4)

Frage von killtec zum Thema Microsoft Office ...

Batch & Shell
gelöst Crontab mit Shell Probleme (9)

Frage von mschaedler1982 zum Thema Batch & Shell ...

Windows 7
gelöst Sind euch verstärkte Probleme bei Windows 7 Updates aufgefallen? (4)

Frage von RadioHam zum Thema Windows 7 ...

Cloud-Dienste
gelöst OwnCloud 8 Probleme mit Vorschaubildern auf Mobilgeräten (1)

Frage von zeroblue2005 zum Thema Cloud-Dienste ...

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

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (22)

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