intermde
Goto Top

CSV Datei trennen, ersten Wert beibehalten und folgende Werte mit KOMMA trennen

Hallo,

ich habe unterschiedliche Dateien mit dem Aufbau z.b. Test.csv

dbr;Marke
234;A
234;v
456;V
456;S
456;C
897;


daraus soll Werden

dbr;Marke
234;A,V
456;V,S,C
897;


Vielleich kann mir hier nochmal jemand helfen..

Gruß
Thoma

Content-Key: 190733

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

Printed on: April 19, 2024 at 03:04 o'clock

Mitglied: 55648
55648 Sep 05, 2012 at 11:10:50 (UTC)
Goto Top
Ich würde hierfür wohl die CSV in Excel einlesen und dort die gleichen Werte zusammenführen.
Member: intermde
intermde Sep 05, 2012 at 12:52:35 (UTC)
Goto Top
Wollte den Umweg aus Excel umgehen und alles per VBS Script erledigen lassen, da die Daten nochmalig in Access zusammen gefügt werden..
Mit Excel hab ich weitere Dokumente die laufen müssen
Member: mathe172
mathe172 Sep 05, 2012 at 16:02:13 (UTC)
Goto Top
Hallo,

in der Hoffnung, dass Batch auch ok ist (zumal wir hier im Batch&Shell-Bereich sind):
@echo off & setlocal enabledelayedexpansion
set "Input=csv.csv"  
set "Output=Output.csv"  
<"%Input%" set /p "Header="  
for /f "skip=1 tokens=1,2 usebackq delims=;" %%A in ("csv.csv") do (  
if "!Data_%%A!"=="" set "dbrs=!dbrs! %%A"  
set "Data_%%A=!Data_%%A!,%%B"  
)
>"%Output%" (  
echo.%Header%
for %%A in (%dbrs%) do echo.%%A;!Data_%%A:~1!
)
Diese Batch liest die Datei csv.csv ein (in Zeile 2 änderbar) und gibt das Ergebnis in Output.csv aus (siehe Zeile 3). Der "Header" muss dabei in der ersten Zeile der Input-Datei stehen.

MfG,
Mathe172
Member: NetWolf
NetWolf Sep 05, 2012 at 16:17:41 (UTC)
Goto Top
Grüß Gott,

*grübel* die Datei wird in Access eingelesen? Dann frage ich mich, warum du die Änderung nicht gleich in Access durchführst? Den VBA - Code kannst du doch erstellen, oder?

Grüße aus München
Wolfgang
(Netwolf)
Member: bastla
bastla Sep 05, 2012 updated at 19:11:47 (UTC)
Goto Top
Hallo intermde!

Ich reiche noch die VBS-Variante nach - aber eigentlich solltest Du doch inzwischen auch selbst schon zumindest zu einem Ansatz kommen können ...
Ein = "Test.csv"  
Aus = "Test_neu.csv"  
Delim = ";"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set d = CreateObject("Scripting.Dictionary")  

T = Split(fso.OpenTextFile(Ein).ReadAll, vbNewLine)
Ueber = T(0) 'erste Zeile übernehmen  
For i = 1 To UBound(T) 'Bezeichnungen sammeln  
    If Trim(T(i)) <> "" Then 'keine Leerzeile verarbeiten  
        dbr = Split(T(i), Delim)(0) 'erstes und ...  
        Marke = Split(T(i), Delim)(1) '... zweites Feld der Datenzeile lesen ...  
        If dbr <> "" Then  
            If Not d.Exists(dbr) Then '... und, falls noch nicht vorhanden, ...  
                d.Add dbr, Marke '... als neuen Eintrag dem Dictionary hinzufügen; ...  
            Else
                d.Item(dbr) = d.Item(dbr) & "," & Marke '... ansonsten nur "Marke" an bisherige Zeile anfügen  
            End If
        End If
    End If
Next

Daten = Ueber 'Ausgabe beginnt mit Überschrift  
K = d.Keys: I = d.Items ' Werte aus Dictionary in Arrays übernehmen ...  
For j = 0 To UBound(K) '... und diese zeilenweise ...  
    Daten = Daten & vbNewLine & K(j) & Delim & I(j) '... auslesen und zur Ausgabe hinzufügen  
Next

fso.CreateTextFile(Aus).Write Daten 'Ausgabedatei schreiben  
WScript.Echo "Fertig."  
Vorteil dieser Version: Die Daten müssen nicht sortiert sein ...

Grüße
bastla
Member: mathe172
mathe172 Sep 05, 2012 at 20:32:03 (UTC)
Goto Top
@bastla: Was meinst du mit "bei dieser Version müssen die Daten nicht sortiert sein"? Müssen sie das bei meiner? Ich bin wahrscheinlich einfach blind...könntest du mich aufklären?

Mathe172
Member: bastla
bastla Sep 06, 2012 at 06:12:43 (UTC)
Goto Top
@ mathe172
Bezog sich nicht auf Deinen Batch, sondern auf die VBS-Ansätze zu anderen Datenstrukturen, die der TO hier schon erhalten hat (und die mich hoffen ließen, dass er vielleicht auch selbst schon einmal zumindest die Grundstruktur würde aufbauen können) ...

Grüße
bastla