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

Fehletrhaftes vbs Script. Werte werden falsch ausgelesen bzw. geschrieben. Kann mir hier jemand helfen?

Frage Entwicklung Batch & Shell

Mitglied: thomas1972

thomas1972 (Level 1) - Jetzt verbinden

11.03.2013, aktualisiert 11:58 Uhr, 1946 Aufrufe, 2 Kommentare

Hallo,

ich habe eine csv Datei die wie folgt aufgebaut ist

Test;name
20309;
20309;
20309;we
20309;te
20309;er
20309;ei
20309;ws
20309;si
10030;
10030;ei
10030;ws
10030;si
10030;

habe hierzu ein script gefunden, welches mir die Werte nebeneinander schreibt

01.
Ein = "c:\temp\funktion.csv" 
02.
Aus = "C:\Quelle\funktion_neu.csv" 
03.
Delim = ";" 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
Set d = CreateObject("Scripting.Dictionary") 
07.
 
08.
T = Split(fso.OpenTextFile(Ein).ReadAll, vbNewLine) 
09.
Ueber = Split(T(0), Delim)(0) 'erstes Feld der ersten Zeile übernehmen 
10.
For i = 1 To UBound(T) 'Bezeichnungen sammeln 
11.
    If Trim(T(i)) <> "" Then 'keine Leerzeile verarbeiten 
12.
        Bez = Split(T(i), Delim)(1) 'zweites Feld der Datenzeile lesen ... 
13.
        If Bez <> "" Then 
14.
            If Not d.Exists(Bez) Then '... und falls noch nicht vorhanden ... 
15.
                Ueber = Ueber & Delim & Bez '... der Überschrift hinzufügen 
16.
                Index = Index + 1 'Index für Felder hochzählen 
17.
                d.Add Bez, Index 'Bezeichnung und Index in Dictionary hinzufügen 
18.
            End If 
19.
        End If 
20.
    End If 
21.
Next 
22.
 
23.
Daten = Ueber 'Ausgabe beginnt mit Überschrift 
24.
Dim Felder 'Array initialisieren 
25.
ReDim Felder(Index) 
26.
For j = 1 To Index: Felder(j) = 0: Next 'Feldwerte auf 0 setzen 
27.
For i = 1 To UBound(T) 'alle Datenzeilen verarbeiten 
28.
    If Trim(T(i)) <> "" Then 'keine Leerzeile verarbeiten 
29.
        Bez = Split(T(i), Delim)(1) 'zweites Feld der Datenzeile lesen 
30.
        Nr = Split(T(i), Delim)(0) 'erstes Feld der Datenzeile lesen ... 
31.
        If Nr = Zuletzt Then '... und prüfen, ob noch gleiche Nummer 
32.
            FeldIndex = d.Item(Bez) 'Index für Bezeichnung ermitteln 
33.
            Felder(FeldIndex) = Felder(FeldIndex) - 1  'Anzahl erhöhen 
34.
        Else 
35.
            If i > 1 Then 'nicht erste Zeile, ... 
36.
                Daten = Daten & vbNewLine & Join(Felder, Delim) 'Datensatz der Ausgabe hinzufügen 
37.
            End If 
38.
            For j = 1 To Index: Felder(j) = 0: Next 'Feldwerte auf 0 setzen 
39.
            Felder(0) = Nr '... und Nr für neuen Satz eintragen 
40.
            FeldIndex = d.Item(Bez) 'Index für Bezeichnung ermitteln 
41.
            Felder(FeldIndex) = Felder(FeldIndex) - 1 'Anzahl erhöhen 
42.
        End If 
43.
        Zuletzt = Nr 
44.
    End If 
45.
Next 
46.
Daten = Daten & vbNewLine & Join(Felder, Delim) 'letzten Datensatz der Ausgabe hinzufügen 
47.
fso.CreateTextFile(Aus).Write Daten 'Ausgabedatei schreiben

aber Anstatt
Test;We;Te;Er;Ei;Ws;Si;
20309;-1;-1;-1;-1;-1;1
10030;0;0;0;-1;-1;-1

schreibt er


Test;We;Te;Er;Ei;Ws;Si;
20307;-1;-1;-1;-1;-1;1
10038;0;0;0;-1;-1;-1

Warum verändert er den Wert 20309 in 20307
bzw. 10030 ind 10038

es werden alle Werte in dern eu geschriebenen Datei verändert
Kann mir dieses nicht erklären, daher hoffe ich, jemand kann den Fehler erkennen.
Mitglied: 106543
11.03.2013 um 15:10 Uhr
Hi,

hab das ganze mal getestet und bei mir kommt am Ende wieder was anderes raus :D
den Fehler hab ich jetzt leider nicht gefunden, werde aber weitersuchen ;)

Ausgabe bei mir:
01.
Test;we;te;er;ei;ws;si 
02.
20307;-1;-1;-1;-1;-1;-1 
03.
10028;0;0;0;-1;-1;-1
Grüße
Exzellius
Bitte warten ..
Mitglied: bastla
11.03.2013, aktualisiert um 16:29 Uhr
Hallo thomas1972!

Bei einem leeren zweiten Feld im Datensatz ergibt sich ein FeldIndex von 0, und da in Felder(0) die Zeilenbezeichnung steht, wird diese um 1 vermindert - mit dieser Version sollte das nicht mehr passieren:
01.
Ein = "c:\temp\funktion.csv" 
02.
Aus = "C:\Quelle\funktion_neu.csv" 
03.
Delim = ";" 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
Set d = CreateObject("Scripting.Dictionary") 
07.
 
08.
T = Split(fso.OpenTextFile(Ein).ReadAll, vbNewLine) 
09.
Ueber = Split(T(0), Delim)(0) 'erstes Feld der ersten Zeile übernehmen 
10.
For i = 1 To UBound(T) 'Bezeichnungen sammeln 
11.
    If Trim(T(i)) <> "" Then 'keine Leerzeile verarbeiten 
12.
        Bez = Split(T(i), Delim)(1) 'zweites Feld der Datenzeile lesen ... 
13.
        If Bez <> "" Then 
14.
            If Not d.Exists(Bez) Then '... und falls noch nicht vorhanden ... 
15.
                Ueber = Ueber & Delim & Bez '... der Überschrift hinzufügen 
16.
                Index = Index + 1 'Index für Felder hochzählen 
17.
                d.Add Bez, Index 'Bezeichnung und Index in Dictionary hinzufügen 
18.
            End If 
19.
        End If 
20.
    End If 
21.
Next 
22.
 
23.
Daten = Ueber 'Ausgabe beginnt mit Überschrift 
24.
Dim Felder 'Array initialisieren 
25.
ReDim Felder(Index) 
26.
For j = 1 To Index: Felder(j) = 0: Next 'Feldwerte auf 0 setzen 
27.
For i = 1 To UBound(T) 'alle Datenzeilen verarbeiten 
28.
    If Trim(T(i)) <> "" Then 'keine Leerzeile verarbeiten 
29.
        Bez = Split(T(i), Delim)(1) 'zweites Feld der Datenzeile lesen 
30.
        Nr = Split(T(i), Delim)(0) 'erstes Feld der Datenzeile lesen ... 
31.
        If Nr = Zuletzt Then '... und prüfen, ob noch gleiche Nummer 
32.
            If Bez <> "" Then 
33.
                FeldIndex = d.Item(Bez) 'Index für Bezeichnung ermitteln 
34.
                Felder(FeldIndex) = Felder(FeldIndex) - 1  'Anzahl erhöhen 
35.
            End If 
36.
        Else 
37.
            If i > 1 Then 'nicht erste Zeile, ... 
38.
                Daten = Daten & vbNewLine & Join(Felder, Delim) 'Datensatz der Ausgabe hinzufügen 
39.
            End If 
40.
            For j = 1 To Index: Felder(j) = 0: Next 'Feldwerte auf 0 setzen 
41.
            Felder(0) = Nr '... und Nr für neuen Satz eintragen 
42.
            If Bez <> "" Then 
43.
                FeldIndex = d.Item(Bez) 'Index für Bezeichnung ermitteln 
44.
                Felder(FeldIndex) = Felder(FeldIndex) - 1 'Anzahl erhöhen 
45.
            End If 
46.
        End If 
47.
        Zuletzt = Nr 
48.
    End If 
49.
Next 
50.
Daten = Daten & vbNewLine & Join(Felder, Delim) 'letzten Datensatz der Ausgabe hinzufügen 
51.
fso.CreateTextFile(Aus).Write Daten 'Ausgabedatei schreiben
Noch eine Frage: Warum -1 in den Zeilen 34 und 44 (passt auch nicht zum Kommentar )? Eigentlich wird ja die Häufigkeit des Vorkommens von "we", "te", etc gezählt ...

Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Hilfe Bei einem vbs Script (19)

Frage von Hattori-Hanzo zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Windows Systemdateien
Windows 7 und 10 herunterfahren Knopf mit Script belegen (21)

Frage von c-o-o-p-e-r92 zum Thema Windows Systemdateien ...

Neue Wissensbeiträge
Drucker und Scanner

Samsung SL-M4025ND, firmware update und (kompatible) Tonerkassetten

(1)

Erfahrungsbericht von markus-1969 zum Thema Drucker und Scanner ...

Router & Routing

PfSense auf Supermicro Intel Xeon D-15x8 SoC Bare Bone

Tipp von Dobby zum Thema Router & Routing ...

Windows Server

Exchange 2010 auf Windows Server 2016 und AD

(2)

Tipp von Herbrich19 zum Thema Windows Server ...

KVM

How to: Libvirt Port forwarding

(2)

Anleitung von fundave3 zum Thema KVM ...

Heiß diskutierte Inhalte
Basic
Programmierung von Windows Programmen (9)

Frage von Ghost108 zum Thema Basic ...

C und C++
Fehlendes verständiss von C und C++ (8)

Frage von zelamedia zum Thema C und C ...