joindy
Goto Top

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

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

Content-Key: 133508

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

Printed on: April 20, 2024 at 00:04 o'clock

Member: bastla
bastla Jan 14, 2010 at 21:38:30 (UTC)
Goto Top
Hallo Joindy und willkommen im Forum!

Etwa so (wobei sich die Reihenfolge aus dem Dateidatum ergibt):
@echo off & setlocal
set "Dateien=D:\Datei*.txt"  
set "Sammel=D:\Sammel.txt"  
set /a Skip=5

set "Erste="  
for /f "delims=" %%i in ('dir /b /o-d "%Dateien%" 2^>nul') do set "Erste=%%i"  
if not defined Erste echo Keine passenden Dateien gefunden! & goto :eof
copy "%Erste%" "%Sammel%"  
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
Member: Joindy
Joindy Jan 14, 2010 at 22:27:46 (UTC)
Goto Top
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
Member: bastla
bastla Jan 14, 2010 at 22:49:00 (UTC)
Goto Top
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
Member: AS-N00
AS-N00 May 15, 2012 at 13:04:25 (UTC)
Goto Top
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
Member: bastla
bastla May 17, 2012 at 21:31:09 (UTC)
Goto Top
Hallo AS-N00!

Geschwindigkeitsrekorde lassen sich so wohl eher nicht aufstellen, aber funktionieren sollte es:
@echo off & setlocal
set "Ordner=D:\"  
set "Dateien=Datei*.txt"  
set "Sammel=Sammel.txt"  
set /a Skip=5

pushd "%Ordner%"  
set "Erste="  
for /f "delims=" %%i in ('dir /b /o-d /a-d "%Dateien%" 2^>nul') do set "Erste=%%i"  
if not defined Erste (echo Keine passenden Dateien gefunden! & popd & goto :eof)
copy "%Erste%" "%Sammel%">nul  
for /f "skip=1 delims=" %%i in ('dir /b /od /a-d "%Dateien%"') do (  
    for /f "skip=%Skip% delims=" %%a in ('findstr /n "^" "%%i"') do (  
        set "Zeile=%%a"  
        setlocal enabledelayedexpansion
        echo(!Zeile:*:=!
        endlocal
    )
)>>"%Sammel%"  
popd
Grüße
bastla
Member: sirOne
sirOne Nov 27, 2015 at 12:36:37 (UTC)
Goto Top
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.

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
Member: bastla
bastla Nov 27, 2015 at 15:22:34 (UTC)
Goto Top
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:
@echo off & setlocal
set "QuellOrdner=D:\Dein Ordner"  
set "Dateien=Datei*.txt"  
set "Sammel=D:\Sammel.txt"  
del "%Sammel%" 2>nul  
pushd "%QuellOrdner%"  
for /f "delims=" %%i in ('dir /b /od "%Dateien%"') do >>"%Sammel%" more +1 "%%~i"  
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
Member: sirOne
sirOne Nov 27, 2015 at 16:36:41 (UTC)
Goto Top
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:

Protokollunsinn des Programms aus welchem sie stammen
Überschriften1;Überschriften2;Überschriften3;Überschriften4;usw.
Data1;Data2;Data3;Data4;usw.
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:

@echo off & setlocal
set "Dateien=D:\Data\Quelle*.csv"  
set "Sammel=batch.csv"  
set /a Skip=2

set "Erste="  
for /f "delims=" %%i in ('dir /b /o-d "%Dateien%" 2^>nul') do set "Erste=%%i"  
if not defined Erste echo Keine passenden Dateien gefunden! & goto :eof
copy "%Erste%" "%Sammel%"  
for /f "skip=1 delims=" %%i in ('dir /b /od "%Dateien%"') do >>"%Sammel%" more +%Skip% "%%i"  

Set /p ersteZeile=<batch.csv
echo %ersteZeile%;Infoüberschrift>Gesamt.csv
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
Member: bastla
bastla Nov 27, 2015 at 21:27:47 (UTC)
Goto Top
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 ...
Member: sirOne
sirOne Nov 27, 2015 at 22:44:55 (UTC)
Goto Top
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
Member: Lothar180
Lothar180 Aug 07, 2019 at 12:25:52 (UTC)
Goto Top
Hallo Zusammen

Sorry, dass ich einen alten Thread wieder aufmache. Ich stehe vor demselben Problem und wäre unendlich froh, wenn mir jemand von euch helfen könnte. Leider muss ich zugeben, dass ich absolut keine Ahnung von Programmierung etc habe. Deshalb war ich so frech und habe mir den Code aus diesem Thread kopiert:

@echo off & setlocal
set "Ordner=I:\PATU-S\03_H1_Mgmt\Commercial\Pricing\PreisdatenSAP\"
set "Dateien=I:\PATU-S\03_H1_Mgmt\Commercial\Pricing\PreisdatenSAP\KONDA*.txt"
set "Sammel=I:\PATU-S\03_H1_Mgmt\Commercial\Pricing\PreisdatenSAP\KONDA_PATU_H.txt"
set /a Skip=5

pushd "%Ordner%"
set "Erste="
for /f "delims=" %%i in ('dir /b /o-d /a-d "%Dateien%" 2^>nul') do set "Erste=%%i"
if not defined Erste (echo Keine passenden Dateien gefunden! & popd & goto :eof)
copy "%Erste%" "%Sammel%">nul
for /f "skip=1 delims=" %%i in ('dir /b /od /a-d "%Dateien%"') do (
for /f "skip=%Skip% delims=" %%a in ('findstr /n "^" "%%i"') do (
set "Zeile=%%a"
setlocal enabledelayedexpansion
echo(!Zeile:*:=!
endlocal
)
)>>"%Sammel%"
popd


Leider funktioniert dies nicht wirklich. Als kleines Beispiel habe ich zwei txt Dateien erstellt mit folgenden Werten drin:

txt Datei 1:
KOTABNR KSCHL VKORG VTWEG SPART ZZPARY3 ZZKDMAT DATAB DATBI KBETR KONWA KPEIN KMEIN LOEVM_KO
Zeile1 X X X X Z Z Z Z Z Z Z Z Z
Zeile2 Z Z Z Z Z Z Z Z Z Z Z Z Z

txt Datei 2:

KOTABNR KSCHL VKORG VTWEG SPART ZZPARY3 ZZKDMAT DATAB DATBI KBETR KONWA KPEIN KMEIN LOEVM_KO
Zeile 3 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 4 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 5 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 6 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 7 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 8 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 9 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 10 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 11 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 12 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 13 Y Y Y Y Y Y Y Y Y Y Y Y Y

Führe ich nun die Batch datei aus kommt folgendes heraus:

KOTABNR KSCHL VKORG VTWEG SPART ZZPARY3 ZZKDMAT DATAB DATBI KBETR KONWA KPEIN KMEIN LOEVM_KO
Zeile1 X X X X Z Z Z Z Z Z Z Z Z
Zeile2 Z Z Z Z Z Z Z Z Z Z Z Z ZZeile 7 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 8 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 9 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 10 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 11 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 12 Y Y Y Y Y Y Y Y Y Y Y Y Y
Zeile 13 Y Y Y Y Y Y Y Y Y Y Y Y Y

- natürlich hat es "tabs" zwischen den Buchstaben und Text...

Vielen Dank im voraus face-smile


Liebe Grüsse
Livio
Member: bastla
bastla Aug 07, 2019 at 14:12:31 (UTC)
Goto Top
Hallo Lothar180 und willkommen im Forum!

Soferne es um die fehlende Zeilenschaltung vor "Zeile 7 Y Y ..." gehen sollte, könntest Du es nach der Zeile
copy "%Erste%" "%Sammel%">nul
mit folgender zusätzlichen Zeile versuchen:
>>"%Sammel%" echo.

Ansonsten wäre eine etwas konkretere Fehlerbeschreibung sinnvoll ...

Grüße
bastla
Member: Lothar180
Lothar180 Aug 09, 2019 at 08:23:59 (UTC)
Goto Top
Hallo bastla

Vielen Dank für die rasche Antwort.
Das Problem liegt darin, dass die Zeile 7 unterhalb von Zeile 2 platziert werden muss. Ein weiteres Problem liegt darin, dass die ersten fünf Zeilen nicht unten angehängt werden.

Deshalb habe ich folgendes Probiert:

set /a Skip=5 habe ich zu set /a Skip=1 geändert. Und zusätzlich dein Vorschlag mit der >>"%Sammel%" echo. reinkopiert.

Nun stehe ich vor einem weiteren Problem. Ich habe die Dateien als Beispiel etwas einfacher dargestellt.

Datei 1: KONDA_1.txt

Diese Überschrift bleibt bei allen txt Files dieselbe
Zeile 1 Zeile 1 Zeile 1 Zeile 1
Zeile 2 Zeile 2 Zeile 2 Zeile 2
Zeile 3 Zeile 3 Zeile 3 Zeile 3
Zeile 4 Zeile 4 Zeile 4 Zeile 4

Datei 2: KONDA_2.txt

Diese Überschrift bleibt bei allen txt Files dieselbe
Zeile 1.1 Zeile 1.1 Zeile 1.1 Zeile 1.1
Zeile 2.1 Zeile 2.1 Zeile 2.1 Zeile 2.1
Zeile 3.1 Zeile 3.1 Zeile 3.1 Zeile 3.1
Zeile 4.1 Zeile 4.1 Zeile 4.1 Zeile 4.1

Nun führe ich folgende batch-Datei aus

@echo off & setlocal
set "Ordner=I:\PATU-H\03_H1_Mgmt\Commercial\Pricing\PreisdatenSAP\"  
set "Dateien=I:\PATU-H\03_H1_Mgmt\Commercial\Pricing\PreisdatenSAP\KONDA*.txt"  
set "Sammel=I:\PATU-H\03_H1_Mgmt\Commercial\Pricing\PreisdatenSAP\KONDA_PATU_H.txt"  
set /a Skip=1

pushd "%Ordner%"  
set "Erste="  
for /f "delims=" %%i in ('dir /b /o-d /a-d "%Dateien%" 2^>nul') do set "Erste=%%i"  
if not defined Erste (echo Keine passenden Dateien gefunden! & popd & goto :eof)
copy "%Erste%" "%Sammel%">nul  
>>"%Sammel%" echo.  
for /f "skip=1 delims=" %%i in ('dir /b /od /a-d "%Dateien%"') do (  
    for /f "skip=%Skip% delims=" %%a in ('findstr /n "^" "%%i"') do (  
        set "Zeile=%%a"  
        setlocal enabledelayedexpansion
        echo(!Zeile:*:=!
        endlocal
    )
)>>"%Sammel%"  
popd

Das Ergebnis ist nun folgendes. Es generiert mir ein neues File mit (was auch gut ist) mit folgendem Inhalt:

Diese Überschrift bleibt bei allen txt Files dieselbe
Zeile 1.1 Zeile 1.1 Zeile 1.1 Zeile 1.1
Zeile 2.1 Zeile 2.1 Zeile 2.1 Zeile 2.1
Zeile 3.1 Zeile 3.1 Zeile 3.1 Zeile 3.1
Zeile 4.1 Zeile 4.1 Zeile 4.1 Zeile 4.1
Zeile 1 Zeile 1 Zeile 1 Zeile 1
Zeile 2 Zeile 2 Zeile 2 Zeile 2
Zeile 3 Zeile 3 Zeile 3 Zeile 3
Zeile 4 Zeile 4 Zeile 4 Zeile 4
Zeile 1.1 Zeile 1.1 Zeile 1.1 Zeile 1.1
Zeile 2.1 Zeile 2.1 Zeile 2.1 Zeile 2.1
Zeile 3.1 Zeile 3.1 Zeile 3.1 Zeile 3.1
Zeile 4.1 Zeile 4.1 Zeile 4.1 Zeile 4.1
Zeile 1 Zeile 1 Zeile 1 Zeile 1
Zeile 2 Zeile 2 Zeile 2 Zeile 2
Zeile 3 Zeile 3 Zeile 3 Zeile 3
Zeile 4 Zeile 4 Zeile 4 Zeile 4

Die Überschrift bleibt nur eimal, was auch gewünscht ist. Nun kopiert es mir einfach alles doppelt. Kannst du mir da helfen? Ich hoffe die Fehlerbeschreibung reicht. Und Sorry für meine aufwendige Beschreibung und Verhalten - bin aber aktuell bemüht mich in die Thematik einzulesen.


Liebe Grüsse
Livio
Member: bastla
bastla Aug 09, 2019 at 12:32:59 (UTC)
Goto Top
Hallo Lothar180!

Wenn Deine Sammeldatei nicht mehr im gleichen Ordner wie die anderen Dateien liegt oder ihr Name nicht mit "KONDA" beginnt sollte das funktionieren ...

Grüße
bastla
Member: Lothar180
Lothar180 Aug 12, 2019 at 07:08:14 (UTC)
Goto Top
Hallo bastla


Du bist mein Held! Vielen Dank es hat alles super geklappt. Meine Mitarbeiter werden sich freuen - endlich kein manuelles Zusammentragen der Dateien mehr face-smile

Nochmals herzlichen Dank und guter Start in die Woche.


Gruss
Lothar