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 batch oder vbs script csv dateien aufgliedern Ohne EXCEL

Frage Entwicklung Batch & Shell

Mitglied: intermde

intermde (Level 1) - Jetzt verbinden

01.09.2012, aktualisiert 05:47 Uhr, 3690 Aufrufe, 10 Kommentare

Hallo an das Forum,

ich habe div. cvs Dateien, welche ich nicht per Excel sonder per Batch weiterverarbeiten möchte
bzw. wie ich diese in Access direkt richtig aufgebaut bekomme.

Die Dateien sind unterschiedlich aufgebaut, daher mal 2 Beispiele wie Sie aussehen können und was ich erreichen möchte

Beispiel 1

Zeile 1 ist Überschrift die durch ; getrennt ist
Ab Zeile 2 Werte die durch ; getrennt sind

Nummer;Bezeichnung
4566;Michael
4566;Kerstin
4566;Thomas
4566;Simone
4566:Dirk
3333;Kerstin
3333;Thomas
3333;Simone
9876;
6788;Simone
6788:Dirk

Nun soll aus dem gefunden Wert ab der 2 Zeile die Bezeichnung übernommen werden
und diese in die erste Zeile getrennt mit ; eingebunden
gleichzeitig soll der Wert entweder 1 oder 0 sein.

Nummer;Michael;Kerstin;Thomas;Simone;Dirk
4566;1;1;1;1;1
3333;0;1;1;0;0
9876;0;0;0;0;0
6788;0;0;0;1;1

andere Möglichkeit der Aufbau einer ander Datei


Nummer;Zahl1;Zahl2;Zahl3;Artikel
123;9;5;A
123;9;2;D
123;9;3;G
456;34;23;D
654:57;23;D
654:57;26;G

Nummer;Zahl1;A;D;G
123;9;5;2;3
456;34;;23;
654;57;23;26


Vielleicht hat hier jemand eine Hilfestellung per VBS für mich.
Eine Lösung über Access habe ich nicht gefunden. Die Kreuztabellen kommt als Lösung nicht in Frage, da die Zeilen alle unterschiedlich aufgebaut sind und ich in den Kreuztabellen max 1 Spalte und 1 Zeile angeben kann, ich aber mehr Spalten hintereinander stehen haben muss
Mitglied: bastla
01.09.2012 um 09:56 Uhr
Hallo intermde!

Lässt sich zwar vermutlich noch eleganter lösen, aber als Anhaltspunkt ein Ansatz für Beispiel 1:
01.
Ein = "Beispiel1.csv" 
02.
Aus = "Beispiel1_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 
48.
WScript.Echo "Fertig."
Ich bin davon ausgegangen, dass Deine Originaldaten keine fehlerhaften Trennzeichen (wie die "Dirk"-Zeilen im Beispiel) aufweisen und nach Nummern sortiert vorliegen ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
01.09.2012, aktualisiert um 13:33 Uhr
Hallo intermde, bastla!

Lässt sich zwar vermutlich noch eleganter lösen, aber als Anhaltspunkt ein Ansatz für Beispiel 1:
Eventuell so?
01.
Option Explicit 
02.
 
03.
Const Ein = "E:\Beispiel1_Ein.csv" 
04.
Const Aus = "E:\Beispiel1_Aus.csv" 
05.
Const Delim = ";" 
06.
     
07.
Dim oFso, oCsv, aCsvHead, aTarget, aToken, aText, aCsvItems, sCsvHead, sCsvText, sName, i 
08.
 
09.
Set oFso = CreateObject("Scripting.FileSystemObject") 
10.
Set oCsv = CreateObject("Scripting.Dictionary") 
11.
     
12.
'Alle Textzeilen einlesen 
13.
aText = Split(oFso.openTextFile(Ein).ReadAll, vbCrLf) 
14.
     
15.
'1. Feldname übernehmen 
16.
sCsvHead = Split(aText(0), Delim)(0) 
17.
     
18.
'Alle restlichen Feldnamen ermitteln und übernehmen 
19.
For i = 1 To UBound(aText) 
20.
    If InStr(aText(i), Delim) > 0 Then 
21.
        sName = Trim(Split(aText(i), Delim)(1)) 
22.
        If InStr(1, sCsvHead, sName, vbTextCompare) <= 0 Then 
23.
            sCsvHead = sCsvHead & Delim & sName 
24.
        End If 
25.
    End If 
26.
Next 
27.
     
28.
'Array mit Csv-Feldnamen erzeugen 
29.
aCsvHead = Split(sCsvHead, Delim) 
30.
     
31.
'Array mit Csv-Spalten erzeugen 
32.
ReDim aToken(UBound(aCsvHead)) 
33.
     
34.
'Spalten-Array mit 0 initialisieren 
35.
For i = 0 To UBound(aToken):  aToken(i) = 0:  Next 
36.
     
37.
'Überschrift in Dictionary übernehmen 
38.
oCsv.Add "CsvHead", aCsvHead 
39.
     
40.
'Restliche Textzeilen auslesen und auswerten 
41.
For i = 1 To UBound(aText) 
42.
    If InStr(aText(i), Delim) > 0 Then      'Test Textzeile enthält Trennzeichen 
43.
        aTarget = Split(aText(i), Delim)    'Array mit Nummer und Namen 
44.
        If oCsv.Exists(aTarget(0)) Then     'Test ob Nummer schon existiert 
45.
            'Wenn Nummer existiert, dann Name in Spalte XY = 1 
46.
            oCsv.Item(aTarget(0)) = GetCsvItems(oCsv.Item(aTarget(0)), aTarget(1)) 
47.
        Else 
48.
            aToken(0) = aTarget(0)  'Spalte 1 = Nummer 
49.
            'Wenn neue Nummer, dann Nummer in Spalte 1 und Name in Spalte XY = 1 
50.
            oCsv.Add aTarget(0), GetCsvItems(aToken, aTarget(1)) 
51.
        End If 
52.
    End If 
53.
Next 
54.
    
55.
'Dictionary auslesen und Csv-Zeilen in Text-String schreiben 
56.
For Each aCsvItems In oCsv.Items 
57.
    sCsvText = sCsvText & Join(aCsvItems, Delim) & vbCrLf 
58.
Next 
59.
     
60.
'Csv-Zeilen in Datei schreiben 
61.
oFso.CreateTextFile(Aus).Write sCsvText 
62.
 
63.
Function GetCsvItems(ByVal aCsvItems, ByRef sName) 
64.
    Dim i 
65.
     
66.
    'Namen in der Überschriftzeile suchen und in Spalte XY eine 1 eintragen 
67.
    For i = 1 To UBound(aCsvItems) 
68.
        If LCase(Trim(aCsvHead(i))) = LCase(Trim(sName)) Then 
69.
            aCsvItems(i) = 1:  Exit For 
70.
        End If 
71.
    Next 
72.
 
73.
    GetCsvItems = aCsvItems 
74.
End Function
Gruß Dieter
Bitte warten ..
Mitglied: intermde
01.09.2012, aktualisiert um 16:58 Uhr
Hallo, danke euch beiden,

ich werde es in meinen weiteren Daten berücksichtne und anpassen,

würde mir nur ein Hinweis auf mein Beispiel 2 fehlen...

"....
andere Möglichkeit der Aufbau einer anderen Datei


Nummer;Zahl1;Zahl2;Zahl3;Artikel
123;9;5;A
123;9;2;D
123;9;3;G
456;34;23;D
654:57;23;D
654:57;26;G

Nummer;Zahl1;A;D;G
123;9;5;2;3
456;34;;23;
654;57;23;26

..."

vielleicht kann hier nochmal Basla oder Dieter drüber schauen, wünsche euch ein schönes Wochenende
Bitte warten ..
Mitglied: 76109
01.09.2012, aktualisiert um 18:24 Uhr
Hallo intermde!

Sollte in etwa so gehen:
01.
Option Explicit 
02.
 
03.
Const Ein = "E:\Ein2.csv" 
04.
Const Aus = "E:\Aus2.csv" 
05.
Const Delim = ";" 
06.
     
07.
Dim oFso, oCsv, aCsvHead, aTarget, aToken, aText, aCsvItems, sCsvHead, sCsvText, sArtikel, sKey, i 
08.
 
09.
Set oFso = CreateObject("Scripting.FileSystemObject") 
10.
Set oCsv = CreateObject("Scripting.Dictionary") 
11.
     
12.
'Alle Textzeilen einlesen 
13.
aText = Split(oFso.openTextFile(Ein).ReadAll, vbCrLf) 
14.
     
15.
'Array mit den Feldnamen 
16.
aTarget = Split(aText(0), Delim) 
17.
     
18.
'1. und 2. Feldname übernehmen 
19.
sCsvHead = aTarget(0) & Delim & aTarget(1) 
20.
     
21.
'Alle restlichen Feldnamen ermitteln und übernehmen 
22.
For i = 1 To UBound(aText) 
23.
    If InStr(aText(i), Delim) > 0 Then 
24.
        sArtikel = "#" & Trim(Split(aText(i), Delim)(3)) 
25.
        If InStr(1, sCsvHead, sArtikel, vbTextCompare) <= 0 Then 
26.
            sCsvHead = sCsvHead & Delim & sArtikel 
27.
        End If 
28.
    End If 
29.
Next 
30.
     
31.
'Array mit Csv-Feldnamen erzeugen 
32.
aCsvHead = Split(Replace(sCsvHead, "#", ""), Delim) 
33.
     
34.
'Array mit Csv-Spalten erzeugen 
35.
ReDim aToken(UBound(aCsvHead)) 
36.
     
37.
'Spalten-Array mit 0 initialisieren 
38.
For i = 0 To UBound(aToken):  aToken(i) = 0:  Next 
39.
     
40.
'Überschrift in Dictionary übernehmen 
41.
oCsv.Add "CsvHead", aCsvHead 
42.
     
43.
'Restliche Textzeilen auslesen und auswerten 
44.
For i = 1 To UBound(aText) 
45.
    If InStr(aText(i), Delim) > 0 Then          'Test Textzeile enthält Trennzeichen 
46.
        aTarget = Split(aText(i), Delim)        'Array mit Nummer und Zahl1 
47.
        sKey = aTarget(0) & "$" & aTarget(1)    'Key = Nummer + $ + Zahl1 
48.
        If oCsv.Exists(sKey) Then     'Test ob Nummer mit Zahl1 schon existiert 
49.
            'Wenn Nummer mit Zahl1 existiert, dann Name in Spalte XY = Zahl? 
50.
            oCsv.Item(sKey) = GetCsvItems(oCsv.Item(sKey), aTarget(2), aTarget(3)) 
51.
        Else 
52.
            aToken(0) = aTarget(0)  'Spalte 1 = Nummer 
53.
            aToken(1) = aTarget(1)  'Spalte 2 = Zahl1 
54.
            'Wenn neue Nummer mit Zahl1, dann Spalte Artikel XY = Anzahl 
55.
            oCsv.Add sKey, GetCsvItems(aToken, aTarget(2), aTarget(3)) 
56.
        End If 
57.
    End If 
58.
Next 
59.
    
60.
'Dictionary auslesen und Csv-Zeilen in Text-String schreiben 
61.
For Each aCsvItems In oCsv.Items 
62.
    sCsvText = sCsvText & Join(aCsvItems, Delim) & vbCrLf 
63.
Next 
64.
     
65.
'Csv-Zeilen in Datei schreiben 
66.
oFso.CreateTextFile(Aus).Write sCsvText 
67.
 
68.
 
69.
Function GetCsvItems(ByVal aCsvItems, ByVal iAnzahl, ByRef sArtikel) 
70.
    Dim i 
71.
     
72.
    'Artikel in der Überschriftzeile suchen und in Spalte XY die Anzahl eintragen 
73.
    For i = 2 To UBound(aCsvItems) 
74.
        If LCase(Trim(aCsvHead(i))) = LCase(Trim(sArtikel)) Then 
75.
            aCsvItems(i) = iAnzahl:  Exit For 
76.
        End If 
77.
    Next 
78.
 
79.
    GetCsvItems = aCsvItems 
80.
End Function
Wobei für Nummer mit unterschiedlicher Zahl1 (falls gegeben) eine neue Csv-Zeile erzeugt wird

Ergebnis:
01.
Nummer;Zahl1;A;D;G 
02.
123;9;5;2;3 
03.
456;34;0;23;0 
04.
654;57;0;23;26
Gruß Dieter
Bitte warten ..
Mitglied: intermde
02.09.2012 um 08:42 Uhr
Hallo Dieter,

vielen Dank für die Hilestellung,

habe hier zwar das problem mit dem Wert 0

habs aber einfach mit einem weiteren Script gelöst, welches ich einfach im Anschluss laufen lasse

01.
Datei = "c:\temp\test.csv" 
02.
Set fso = CreateObject("Scripting.FileSystemObject") 
03.
T = fso.OpenTextFile(Datei).ReadAll 
04.
fso.CreateTextFile(Datei).Write Replace(T, ";0", ";")
Danke nochmal für die Hilfe
Bitte warten ..
Mitglied: intermde
02.09.2012 um 09:17 Uhr
Hallo nochmal...
sorry, wenn ich die Frage noch nicht geschlossen habe.

Hab noch 4 Dateien mit folgendem Aufbau gefunden, die Frage ist wie kann ich o.g. Scripte den Bedürfnissen anpassen?

Der Aufbau ist ähnlich

Überschrift 1; Überschrif 2; Überschrift 3
3456;Name1;Wert1
3456;Name2;Wert2
3456;Name3;Wert3
6789;Name1;Wert4
6789;Name2;Wert5
6789;Name3;Wert6

Daraus soll werden


Überschrift 1; Name1; Name2; Name3....
3456;Wert1;Wert2;Wert3
6789;Wert4;Wert5;Wert6
....

Sprich übernehme den ersten Wert, generiere aus dem nachfolgenden Bereich die Überschriften
und übernehme dann den Werte aus dem letzen Bereich.

Der NameX kann unterschiedlich sein, es gibt für diesen NamenX aber immer einen WertX.
Der WertX kann Text aber auch Nummerisch sein.

Wünsche allen einen schönen Sonntag
Bitte warten ..
Mitglied: 76109
02.09.2012, aktualisiert um 12:01 Uhr
Hallo intermde!

Wenn Du die Nullen nicht magst, dann ließe sich das in Skript 2 einfach ändern, indem Du die Codezeile 38 durch diese ersetzt:
01.
    For i = 0 To UBound(aToken):  aToken(i) = "":  Next
Für Dein letztes Beispiel eignet sich Skript 1, wobei bei sich nur 4 Codezeilen (46, 50, 63, 69) ändern:
01.
46:  oCsv.Item(aTarget(0)) = GetCsvItems(oCsv.Item(aTarget(0)), aTarget(1), aTarget(2)) 
02.
50:  oCsv.Add aTarget(0), GetCsvItems(aToken, aTarget(1), aTarget(2)) 
03.
63:  Function GetCsvItems(ByVal aCsvItems, ByRef sName, ByRef sValue) 
04.
69:  aCsvItems(i) = sValue:  Exit For  
Gruß Dieter
Bitte warten ..
Mitglied: bastla
02.09.2012, aktualisiert um 12:48 Uhr
@ Dieter
Wenn Du die Nullen nicht magst, dann ließe sich das in Skript 2 einfach ändern, indem Du die Codezeile 38 durch
'
ersetzt ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
02.09.2012, aktualisiert um 12:57 Uhr
@ bastla

Stimmt, so gehts auch

Gruß Dieter
Bitte warten ..
Mitglied: intermde
04.09.2012 um 11:23 Uhr
Dank euch.. hat wunderbar geklappt..
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
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 CSV Dateien auswerten mit Script (8)

Frage von Crank69 zum Thema Batch & Shell ...

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

Frage von Luuke257 zum Thema Batch & Shell ...

VB for Applications
gelöst VBA - viele CSV Dateien in ein Excel sheet (2)

Frage von LordY6 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...