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

Batch zum zusammenfügen von CSV Dateien und dem hinzufügen des Dateinamens

Frage Entwicklung Batch & Shell

Mitglied: Joker313

Joker313 (Level 1) - Jetzt verbinden

25.04.2012 um 10:55 Uhr, 5598 Aufrufe, 12 Kommentare

Hallo liebes Forum,

ich habe gesehen, dass hier einige sehr engagierte und fachkundige User unterwegs sind und ich würde mich freuen, wenn man mir bei meinem Problem helfen könnte.

Ich habe in einem Ordner ziemlich viele csv Dateien und ich möchte diese gesammelt in einer Datei speichern. Das habe ich noch hinbekommen!

Die csv Datei sieht folgender Maßen aus (eine Zeile als Beispiel):

Transaction ID,"Transaction Code","User","Domain","Location","Datum und Uhrzeit","Datum und Uhrzeit","Länge","Rate","Preis","Acces Type","Usage"

Mein Batch, dass diese Dateien zusammenfügt, sieht folgender Maßen aus:


>"gesammelt.csv" type nul
for /f "delims=" %%a in ('dir /a-d /b *.csv^|findstr /vic:"gesammelt.cs"') do >>"gesammelt.csv" type "%%~a"


Am Ende entsteht die Datei gesammelt.csv mit allen Zeilen der jeweiligen Dateien. Nun hätte ich aber gerne den Dateinamen der Datei als extra Spalte!

Der Dateiname sieht wie folgt aus:

sess=02cfffc6d6b2868ce833b2dc4c821e85&m=Datum&f=Datei.html&z=1056446&c=1045675.csv

Nun hätte ich gerne in meiner zusammen gefassten Datei die letzten Ziffern (in diesem Fall 1045675) des Dateinamens als Spalte um diese als Indikator zu nutzen zum wem ich das zuordnen muss.

Wäre super, wenn jemand hier eine Lösung parat hätte, mir würde es eine Menge Arbeit ersparen


Danke im Voraus für die Hilfe!

Grüße
Mitglied: bastla
25.04.2012 um 11:58 Uhr
Hallo Joker313 und willkommen im Forum!

Ungetestet etwa so:
01.
@echo off & setlocal 
02.
set "Sammel=gesammelt.csv" 
03.
set "Delim=," 
04.
 
05.
>"%Sammel%" type nul 
06.
for /f "delims=" %%a in ('dir /a-d /b *.csv^|findstr /vic:"%Sammel%"') do call :ProcessFile "%%a" 
07.
goto :eof 
08.
 
09.
:ProcessFile 
10.
for /f "tokens=6 delims==" %%i in ("%~n1") do set "Datei=%%i" 
11.
(for /f "usebackq eol=§ delims=" %%i in (%1) do ( 
12.
    set "Zeile=%%i" 
13.
    setlocal enabledelayedexpansion 
14.
    echo !Zeile!%Delim%%Datei% 
15.
    endlocal 
16.
))>>"%Sammel%" 
17.
goto :eof
Hinweis zu Zeile 11: "§" soll ein Zeichen darstellen, das in der csv-Datei nicht vorkommt; falls sichergestellt ist, dass keine Zeile mit ";" beginnt, kann "eol=§" auch gleich weggelassen werden ...

Grüße
bastla
Bitte warten ..
Mitglied: 106009
25.04.2012 um 12:42 Uhr
Hallo und willkommen im Forum.

Oder so, etwas kürzer vielleicht?
01.
setlocal enabledelayedexpansion 
02.
>"gesammelt.csv" type nul 
03.
for /f "delims=" %%a in ('dir /a-d /b *.csv^|findstr /vic:"gesammelt.cs"') do call :process "%%a" 
04.
goto :eof 
05.
 
06.
:Process 
07.
for /f "tokens=6 delims==" %%x in ("%~1") do set number=%%~nx 
08.
for /f "delims=" %%z in ('type "%~1"') do set "zeile=%%z" & @echo %number%,!zeile! >> gesammelt.csv  
09.
goto :eof
Gruß
Bitte warten ..
Mitglied: Skyemugen
25.04.2012 um 12:49 Uhr
Aloha ollidolli,

ähm überlege dir den process-Part der zweiten Schleife lieber noch einmal

ich weiß ja nicht, ob der TE gefragt hat, dass er nur die letzte Zeile einer .csv haben will ... aber ... Zweifel mit kürzer wird da nix

greetz André
edit: ah, er hat sich's überlegt ...
Bitte warten ..
Mitglied: Joker313
25.04.2012 um 13:15 Uhr
Du bist der König!

Tausend Dank!

!!!!

Gruß eines zufriedenden Users!
Bitte warten ..
Mitglied: Joker313
25.04.2012 um 13:17 Uhr
Dank dir ebenfalls Ollidolli, wenn ich möchte kann ich auch deins ausprobieren, habe aber eigentlich mit bastlas Lösung gute Erfahrungen sammeln können ;)
Bitte warten ..
Mitglied: bastla
25.04.2012 um 14:25 Uhr
@106009
etwas kürzer vielleicht?
Sicher dann, wenn in den Dateien mindestens ein "!" vorkommt (bei zweien sogar überproportional) ...

... aber wenn kürzerer Code das Ziel ist, kannst Du auch auf die Verwendung eines Unterprogramms verzichten (und vielleicht doch "gesammelt.csv" in eine Variable packen).

Grüße
bastla
Bitte warten ..
Mitglied: 106009
25.04.2012 um 14:36 Uhr
Hi,

Zitat von bastla:
... aber wenn kürzerer Code das Ziel ist, kannst Du auch auf die Verwendung eines Unterprogramms verzichten (und vielleicht
doch "gesammelt.csv" in eine Variable packen).

Man kann viel tun, wenn der Tag lang ist. Man kann aber auch den Code so erstellen, dass er sich der Ursprungsversion des TE etwas annähert und dadurch auch ohne zusätzliche Erläuterungen verständlicher wird.
Man kann auch immer alles ganz anders machen.

Du brauchst dich nicht auf den Schlips getreten zu fühlen, ich hatte nichts gegen deinen Code.

Gruß
Bitte warten ..
Mitglied: bastla
25.04.2012 um 14:45 Uhr
Hallo ollidolli!
Du brauchst dich nicht auf den Schlips getreten zu fühlen, ich hatte nichts gegen deinen Code.
Kein Problem - und der Hinweis war ernst gemeint (Unterprogramme setze ich meist zur "delayedExpansion"-Vermeidung ein - wenn die aber ohnehin im gesamten Batch gelten soll, braucht's das Unterprogramm hier gar nicht):
01.
setlocal enabledelayedexpansion 
02.
>"gesammelt.csv" type nul 
03.
for /f "delims=" %%a in ('dir /a-d /b *.csv^|findstr /vic:"gesammelt.cs"') do ( 
04.
    for /f "tokens=6 delims==" %%x in ("%%~na") do set number=%%~nx 
05.
    for /f "delims=" %%z in ('type "%%a"') do set "zeile=%%z" & @echo !number!,!zeile! 
06.
)>>gesammelt.csv
Den Namen der Ausgabedatei würde ich aber jedenfalls (wartungssfreundlicher) in eine Variable setzen.
auch ohne zusätzliche Erläuterungen
wäre das abgegangen, wenn der TE auch die Daten beschrieben hätte (was aber vorausgesetzt hätte, dass er über die Besonderheiten hinsichtlich "!" oder ein ";" am Zeilenanfang Bescheid weiß) ...

Grüße
bastla
Bitte warten ..
Mitglied: 106009
25.04.2012 um 14:53 Uhr
Hi, bastla
im Prinzip hast du ja Recht und dagegen ist auch überhaupt nichts einzuwenden. Ich stehe aber auf dem Standpunkt, dass sich die Aufteilung mit einem Unterprogramm sowohl leichter darstellen als auch leichter pflegen lässt als ein Einzeilerwurm.

Und zur Beschreibung der Daten: Mit ziemlicher Wahrscheinlichkeit lässt sich aus den getroffenen Angaben über den Inhalt der Felder schließen, dass sich dort wohl keine "!" verstecken werden, zumindest bin ich davon ausgegangen.

Gruß
Bitte warten ..
Mitglied: bastla
25.04.2012 um 14:57 Uhr
Hallo ollidolli!
zumindest bin ich davon ausgegangen.
Mach ich ja durchaus auch öfter mal - aber im Zweifelsfall kommuniziere ich das dann zur Sicherheit auch ...
Ganz so schlimm (und auch gar nicht einzeilig) wäre aber doch auch die Version ohne Unterprogramm nicht (s.o.) - und um auch mal eine Annahme zu treffen : Performance dürfte hier nicht unbedingt das Kriterium sein (aber falls doch, wäre das grundsätzlich ein weiteres Argument gegen die Verwendung des Unterprogramms) ...

Grüße
bastla
Bitte warten ..
Mitglied: 106009
25.04.2012 um 15:05 Uhr
Zitat von bastla:
Ganz so schlimm (und auch gar nicht einzeilig)
Doch. Eingeklammerte Werte werden doch angeblich wie eine Zeile behandelt.
Performance dürfte hier nicht unbedingt das Kriterium sein (aber falls doch, wäre das
grundsätzlich ein weiteres Argument gegen die Verwendung des Unterprogramms) ...

Das vermutest du, ich vermute da auch was: Sehr wahrscheinlich behandelt der Compiler diese "eine Zeile" genauso, als ob sie ein Unterprogramm wäre, nämlich durch call (local-) Label ..... RET
Oder hast du schon mal einen Batchlauf mit einem Debugger beobachtet? Ich schon, aber das ist schon ungefähr ein Jahrzehnt her.

Aber wollen wir nun wirklich den Thread hier durch Spitzfindigkeiten aufblähen? Der Eine löst es so, der Anderen wählt einen anderen Weg. Beides funktioniert, und das ist doch die Hauptsache.

Gruß
Bitte warten ..
Mitglied: bastla
25.04.2012 um 15:12 Uhr
Hallo ollidolli!
Eingeklammerte Werte werden doch angeblich wie eine Zeile behandelt.
Vom Interpreter ja - vom Leser / Bearbeiter des Codes eher nicht ...

... ansonsten hat Du recht: lassen wir's gut sein.

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst 2 Csv -Dateien zum Teil zusammenfügen (6)

Frage von Piotrney zum Thema Batch & Shell ...

Batch & Shell
Mehrere.csv Dateien zusammenfügen zu einer Datei mit bat (4)

Frage von Piotrney zum Thema Batch & Shell ...

Batch & Shell
gelöst Mehrere PDF-Dateien per Batch zusammenfügen (1)

Frage von Grimmli zum Thema Batch & Shell ...

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