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

Textdateien zusammenfassen aber mit Bedingungen. (die ersten 5 Zeilen auslassen)

Frage Entwicklung Batch & Shell

Mitglied: Joindy

Joindy (Level 1) - Jetzt verbinden

14.01.2010, aktualisiert 22:19 Uhr, 5352 Aufrufe, 10 Kommentare

Hallo zusammen,

hoffe Ihr könnt mir helfen. Habe ähnliche Fragen schon oft gelesen und schon unzählige Texte und Beispiele mir angeschaut. bekomme es aber nicht hin.

Meine Problem ist, dass ich in einer Datei viele txt-Dateien habe die ich zusammenfassen möchte. jede txt-Datei hat aber die gleiche Kopfzeile. Nun soll die Kopfzeile aber nur einmal kopiert werden und nicht aus jeder txt-Datei. Dazu bräuchte ich eine batch mit der ich die Dateien nicht nur zusammenfassen kann sondern auch angeben kann ab welcher Zeile die Txt-Datei ab der 2. txt-Datei kopiert werden soll. Kann mir da jemand helfen. bin auch für andere Lösungen offen.





DANKE FÜR EURE HILFE

Joindy
Mitglied: bastla
14.01.2010 um 22:38 Uhr
Hallo Joindy und willkommen im Forum!

Etwa so (wobei sich die Reihenfolge aus dem Dateidatum ergibt):
01.
@echo off & setlocal 
02.
set "Dateien=D:\Datei*.txt" 
03.
set "Sammel=D:\Sammel.txt" 
04.
set /a Skip=5 
05.
 
06.
set "Erste=" 
07.
for /f "delims=" %%i in ('dir /b /o-d "%Dateien%" 2^>nul') do set "Erste=%%i" 
08.
if not defined Erste echo Keine passenden Dateien gefunden! & goto :eof 
09.
copy "%Erste%" "%Sammel%" 
10.
for /f "skip=1 delims=" %%i in ('dir /b /od "%Dateien%"') do >>"%Sammel%" more +%Skip% "%%i"
[Edit] Noch etwas vereinfacht ... [/Edit]
]Edit2] ... und gegen "Datei nicht gefunden" abgesichert. [/Edit2]

Grüße
bastla
Bitte warten ..
Mitglied: Joindy
14.01.2010 um 23:27 Uhr
Hallo bastla,

Danke für deine superschnelle Hilfe, die ich auch gleich nach etwas hin und her zum Laufen gebracht habe. Werde morgen noch einiges testen und mich dann nochmal gegebenenfalls bei dir/euch melden. Bin aber schon sehr glücklich über das Ergebnis. Möchte es nur noch verstehen.

Viele Grüße

Joindy
Bitte warten ..
Mitglied: bastla
14.01.2010 um 23:49 Uhr
Hallo Joindy!

Kurze Erklärung (zur aktuellen Version):
Die ersten Zeilen sollten eigentlich ziemlich klar sein ...

Durch die Zeile 6 wird sicher gestellt, dass kein "alter" Wert in der Variablen "%Erste%" steht.

In Zeile 7 wird die erste Datei gesucht, indem in einer Schleife alle Dateien in umgekehrter Reihenfolge aufgelistet und jeweils in der Variablen %Erste% gespeichert werden (was natürlich den vorherigen Inhalt überschreibt) - die erste Datei wird zuletzt gespeichert und bleibt daher in der Variablen. Das (nachträglich ergänzte) "2>nul" stellt sicher, dass eine etwaige Fehlermeldung "Datei nicht gefunden" unterdrückt und daher nicht in die Variable geschrieben wird, sodass ...

... die Abfrage in Zeile 8 anhand einer leeren Variablen "%Erste%" für den Fall, dass keine Datei gefunden wurde, den Batch abbrechen kann.

Wenn es zumindest eine Datei gibt, wird die erste (=älteste) in die Zieldatei "%Sammel%" kopiert (Zeile 9) und ...

... in Zeile 10 in einer Schleife über die Auflistung aller Dateien (dieses Mal in der richtigen Reihenfolge, sodass die erste, bereits verarbeitete Datei übersprungen werden kann - siehe "skip=1") der Inhalt jeder Datei, beginnend nach der in %Skip% (vielleicht wäre der Variablenname %NachZeile% besser gewesen) angegebenen Zeilenanzahl, mit "more" ausgegeben und per Umleitung mit ">>" an die Sammeldatei angefügt werden kann.

Grüße
bastla
Bitte warten ..
Mitglied: AS-N00
15.05.2012 um 15:04 Uhr
Hallo,

ich habe mir mal erlaubt das kleine Script zu nutzen, da ich genau vor dem gleichen Problem stand.
Was jetzt bei mir aber passiert ist, dass die zweite und weitere Dateien die zusammengefasst werden alle ihre Formatierung verlieren.
Es handelt sich dabei um tab-getrennte txt-Dateien.
Die erste bleibt noch tab-getrennt, alle weiteren in der Sammeldatei haben dann keine Trennung mehr.
Gibt es da eine Lösung?

Danke
Bitte warten ..
Mitglied: bastla
17.05.2012 um 23:31 Uhr
Hallo AS-N00!

Geschwindigkeitsrekorde lassen sich so wohl eher nicht aufstellen, aber funktionieren sollte es:
01.
@echo off & setlocal 
02.
set "Ordner=D:\" 
03.
set "Dateien=Datei*.txt" 
04.
set "Sammel=Sammel.txt" 
05.
set /a Skip=5 
06.
 
07.
pushd "%Ordner%" 
08.
set "Erste=" 
09.
for /f "delims=" %%i in ('dir /b /o-d /a-d "%Dateien%" 2^>nul') do set "Erste=%%i" 
10.
if not defined Erste (echo Keine passenden Dateien gefunden! & popd & goto :eof) 
11.
copy "%Erste%" "%Sammel%">nul 
12.
for /f "skip=1 delims=" %%i in ('dir /b /od /a-d "%Dateien%"') do ( 
13.
    for /f "skip=%Skip% delims=" %%a in ('findstr /n "^" "%%i"') do ( 
14.
        set "Zeile=%%a" 
15.
        setlocal enabledelayedexpansion 
16.
        echo(!Zeile:*:=! 
17.
        endlocal 
18.
19.
)>>"%Sammel%" 
20.
popd
Grüße
bastla
Bitte warten ..
Mitglied: sirOne
27.11.2015 um 13:36 Uhr
Ich mache hier ein sehr altes Thema wieder auf, aber es trifft genau auf mein Problem zu. Ich konnte hierdurch eine Reihe von CSV Dateien zusammenfügen.

Ich hätte als Anfrage allerdings noch eine kleine Ergänzung: Bei der ersten Datei möchte ich zusätzlich die erste Zeile nicht in die zusammengefügte Datei übernehmen.

01.
copy "%Erste%" "%Sammel%" 
Ist dafür nicht nur eine kleine Ergänzung in dieser Zeile notwendig? Wäre über ein wenig Hilfe sehr dankbar, da ich hiermit leider keinerlei Erfahrung habe, die Lösung mir allerdings ungemein bei der schnellen Datenaufbereitung helfen würde.

Gruß
One
Bitte warten ..
Mitglied: bastla
27.11.2015 um 16:22 Uhr
Hallo sirOne und willkommen im Forum!

Wenn ich das richtig interpretiere, möchtest du einfach nur alle Dateien ohne die jeweils erste Zeile zusammenfassen - das ginge relativ einfach (aber ungetestet) etwa so:
01.
@echo off & setlocal 
02.
set "QuellOrdner=D:\Dein Ordner" 
03.
set "Dateien=Datei*.txt" 
04.
set "Sammel=D:\Sammel.txt" 
05.
del "%Sammel%" 2>nul 
06.
pushd "%QuellOrdner%" 
07.
for /f "delims=" %%i in ('dir /b /od "%Dateien%"') do >>"%Sammel%" more +1 "%%~i" 
08.
popd
"%Erste%" in der von dir zitierten Zeile im ursprünglichen Batch meinte übrigens die erste (= älteste) Datei, welche ohne das Weglassen von Zeilen kopiert und so zum Inhalt der neuen Sammeldatei (das Kopieren überschreibt eine ev bereits vorhandene Datei) gemacht wurde.

Grüße
bastla
Bitte warten ..
Mitglied: sirOne
27.11.2015 um 17:36 Uhr
Danke für die schnelle Antwort und das freundliche Hallo bastla!

Leider verhält es sich etwas anders. Ich erkläre doch mal ausführlich: Ich habe einen Ordner mit einer unbestimmten Anzahl an CSV Dateien, diese sind alle folgendermaßen aufgebaut:

01.
Protokollunsinn des Programms aus welchem sie stammen 
02.
Überschriften1;Überschriften2;Überschriften3;Überschriften4;usw. 
03.
Data1;Data2;Data3;Data4;usw. 
04.
usw.
Diese CSV Dateien möchte ich zusammenfügen zu einer einzigen Datei, dabei benötige ich also einmalig die Zeile mit den Überschriften und ansonsten alle Datenzeilen aus allen Dateien. Die Zeile mit dem Protokoll benötige ich gar nicht.

In einem weiteren Schritt wollte ich jeder Zeile noch eine Information hinzufügen, nämlich ";Information" und dementsprechend in der Zeile mit den Überschriften ";Infoüberschrift"

Dafür habe ich mir aus deinem Code oben und aus einer anderen Quelle das folgende Script zusammen geschrieben:

01.
@echo off & setlocal 
02.
set "Dateien=D:\Data\Quelle*.csv" 
03.
set "Sammel=batch.csv" 
04.
set /a Skip=2 
05.
 
06.
set "Erste=" 
07.
for /f "delims=" %%i in ('dir /b /o-d "%Dateien%" 2^>nul') do set "Erste=%%i" 
08.
if not defined Erste echo Keine passenden Dateien gefunden! & goto :eof 
09.
copy "%Erste%" "%Sammel%" 
10.
for /f "skip=1 delims=" %%i in ('dir /b /od "%Dateien%"') do >>"%Sammel%" more +%Skip% "%%i" 
11.
 
12.
Set /p ersteZeile=<batch.csv 
13.
echo %ersteZeile%;Infoüberschrift>Gesamt.csv 
14.
for /f "skip=1 delims=" %%i in (batch.csv) do @echo %%i;Information>>Gesamt.csv


Das scheint auch soweit gut zu funktionieren, allerdings werde ich die Zeile mit dem Protokoll nicht los, so dass "Infoüberschrift" noch in dieser landet.

Wenn du mir da also den letzten Stups geben könntest wäre das super!

Liebe Grüße
One
Bitte warten ..
Mitglied: bastla
27.11.2015 um 22:27 Uhr
Hallo sirOne!

Naja, wie schon kurz beschrieben kopiert die Zeile 9 die gesamte "erste" Datei - daher müsstest Du diese Zeile ersetzen durch
>"%Sammel%" more +1 "%Erste%"
um die erste Zeile der ersten Datei zu überspringen ...

Grüße
bastla

P.S.: Konsequenter Weise solltest Du auch in den Zeilen 12 und 14 die Variable %Sammel% verwenden (macht den Batch leichter wartbar, da Du für eine Änderung des Dateinamens diesen nur einmalig in Zeile 3 eintragen müsstest). Auch für die "Gesamt.csv" würde ich aus dem gleichen Grund zur Verwendung einer Variablen raten ...
Bitte warten ..
Mitglied: sirOne
27.11.2015 um 23:44 Uhr
Hallo bastla!

Ich ärgere mich ein wenig, da ich genau diese Zeile schon im Script hatte, allerdings "more+1" geschrieben habe und nichte "more +1". Leider habe ich es nicht mit Leerzeichen ausprobiert und somit noch einen Fehler erhalten. Die Syntax ist mir einfach nicht geläufig.

Jetzt funktioniert es jedenfalls so wie gedacht und ich werde mir in Summe einiges an Arbeit sparen, also riesen Dank für deine schnelle und kompetente Hilfe!

Lieben Gruß
One
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Batch & Shell
gelöst Textdateien TXT in allen Verzeichnissen suchen und zusammenfassen (19)

Frage von chgs2011 zum Thema Batch & Shell ...

Microsoft
Surface Studio im ersten Kurztest

Link von runasservice zum Thema Microsoft ...

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

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

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