46933
Goto Top

mehrere txt Dateien aber nur von der ersten Datei die erste Zeile auslesen

Halli Hallo alle zusammen.

ich hab eine Batch-Datei die mir mehrere txt Dateien ausliest.
Besser gesagt, Zeilen die mit einer bestimmten Zahl anfangen.
Diese Zeilen werden alle in eine neue txt Datei geschrieben.
Diese enthält dann halt nur die Zeilen, welche mit der bestimmten Zahl anfangen.
Soweit so gut. face-smile
Jetzt soll aber diese Datei auch noch eine Zeile mit Spaltenüberschriften beinhalten. (die fertige Datei wird nämlich nach Access verknüpft)
Die batch-Datei müßte nun eine Zeile auslesen und diese als erste Zeile in die richtige Datei schreiben.
Aber nur einmal.
Das Problem besteht darin das meine batch-Datei mir diese Zeile aus allen vorhandenen txt Dateien ausliest und diese dann in die richtige Datei schreibt.
Ich brauch sie aber nur einmal.

for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[Standortname]" %Pfad2%\*.txt') do @echo %%i >> fertig\Gesamt.txt

mit diesem Befehl habe ich versucht es zu realisieren.
Er liest mir alle Zeilen die mit Standortname beginnen aus und schreibt sie in Gesamt.txt.
Ich brauch diese Zeile aber nur einmal.
Kann mir jemand helfen?

Gruß gini

Content-Key: 58105

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

Ausgedruckt am: 29.03.2024 um 15:03 Uhr

Mitglied: bastla
bastla 03.05.2007 um 12:06:53 Uhr
Goto Top
Hallo ginivpj!

Dazu könntest Du einfach eine "Schalter"-Variable verwenden, etwa so:
@echo off & setlocal
set Geschrieben=
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[Standortname]" %Pfad2%\*.txt') do if not defined Geschrieben echo %%i >> fertig\Gesamt.txt & set Geschrieben=True  
Nur beim ersten "for"-Durchlauf existiert die Variable Geschrieben noch nicht, daher wird einmal in die Textdatei geschrieben. Welchen Wert Du danach der Variablen gibst, ist eigentlich egal, es genügt, dass sie gesetzt wird.

Grüße
bastla
Mitglied: 46933
46933 03.05.2007 um 12:30:30 Uhr
Goto Top
set Geschrieben=
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[Standortname]" %Pfad2%\*.txt') do if not defined Geschrieben echo %%i >> fertig\Gesamt.txt & set "Geschrieben=True"

hab ich so eingeschrieben.
Komischerweise gibt er mir jetzt in der ersten Zeile ein H aus!
Keine Ahnung wo das her kommt???
Aber nicht die Zeile wo der Standortname steht.
Das tokens=3 hab ich auch raus genommen.
Mitglied: bastla
bastla 03.05.2007 um 12:51:37 Uhr
Goto Top
Hallo ginivpj!

Der Fehler ist für mich nicht nachvollziehbar, da sich an der bisherigen Funktionalität ja nichts verändert haben sollte - es wird nur das "echo" vom "if not defined" abhängig gemacht.
BTW: Wozu eigentlich der Schalter /R im "findstr" - damit suchst Du eigentlich nach allen einzelnen zwischen "[" und "]" stehenden Zeichen ...

Wenn Du nur Zeilen mit "Standortname" am Anfang finden willst, müsste doch
findstr /B "Standortname" %Pfad2%\*.txt  
genügen.

Grüße
bastla
Mitglied: 46933
46933 03.05.2007 um 13:24:14 Uhr
Goto Top
Ja, hast Recht. Hab ich korrigiert.
Ich stelle mal ein paar Dateien ein wie es so aussieht.

erste.txt
Region Ost
PB Berlin
Standortname	Fehler	                11	22	33	40	63 202210011A	Lücke Muss (60)	01.02.01	30.08.01	21.08.01	05.08.02	02.10.02	
202210034A	Lücke Muss (60)	15.03.04	15.03.04	24.10.02		28.11.02 202210035A	Lücke Muss (60)	15.03.04	15.03.04	05.11.04		07.05.03	
PB Leipzig
Standortname	Fehler	                11	22	33	40	63 202210051A	Lücke Muss (60)	19.09.05	19.09.05	29.10.04		10.01.05	
Region Süd
PB München
Standortname	Fehler	                11	22	33	40	63 502210051A	Lücke Muss (60)	19.09.05	19.09.05	29.10.04		10.01.05	
zweite.txt
Region Ost
PB Berlin
Standortname	Fehler	                11	22	33	63 
202210011A	Lücke Muss (60)	01.02.01	30.08.01	21.08.01	02.10.02	
202210034A	Lücke Muss (60)	15.03.04	15.03.04	24.10.02	28.11.02 
202210035A	Lücke Muss (60)	15.03.04	15.03.04	05.11.04	07.05.03	
PB Leipzig
Standortname	Fehler	                11	22	33	63 
202210051A	Lücke Muss (60)	19.09.05	19.09.05	29.10.04	10.01.05	
Region West
PB Dortmund
Standortname	Fehler	                11	22	33	63	
305210001A	Lücke Muss (60,63)	28.08.00	05.04.02	23.10.97		
305210014B	Lücke Muss (63,80)	16.01.01	15.02.01
Das sind jetzt zwei von vielleicht zwanzig .txt
mit meiner batch Datei werden jetzt alle Datensätze aus allen txt Dateien, welche mit einer zwei beginnen in die Gesamt.txt geschrieben.
Diese sieht dann so aus:
202210011A	Lücke Muss (60)	01.02.01	30.08.01	21.08.01	05.08.02	02.10.02	
202210034A	Lücke Muss (60)	15.03.04	15.03.04	24.10.02		28.11.02 202210035A	Lücke Muss (60)	15.03.04	15.03.04	05.11.04		07.05.03	
202210051A	Lücke Muss (60)	19.09.05	19.09.05	29.10.04		10.01.05
202210011A	Lücke Muss (60)	01.02.01	30.08.01	21.08.01	02.10.02	
202210034A	Lücke Muss (60)	15.03.04	15.03.04	24.10.02	28.11.02 
202210035A	Lücke Muss (60)	15.03.04	15.03.04	05.11.04	07.05.03	
202210051A	Lücke Muss (60)	19.09.05	19.09.05	29.10.04	10.01.05	

Jetzt sollte eigentlich einmal die Spaltenüberschrift ausgelesen werden und in die erste Zeile geschrieben werden:

Standortname	Fehler	                11	22	33	40	63 
ist in Acces dann die Spaltenüberschrift

Standortname	Fehler	                11	22	33	40	63 
202210011A	Lücke Muss (60)	01.02.01	30.08.01	21.08.01	05.08.02	02.10.02	
202210034A	Lücke Muss (60)	15.03.04	15.03.04	24.10.02		28.11.02 202210035A	Lücke Muss (60)	15.03.04	15.03.04	05.11.04		07.05.03	
202210051A	Lücke Muss (60)	19.09.05	19.09.05	29.10.04		10.01.05
202210011A	Lücke Muss (60)	01.02.01	30.08.01	21.08.01	02.10.02	
202210034A	Lücke Muss (60)	15.03.04	15.03.04	24.10.02	28.11.02 
202210035A	Lücke Muss (60)	15.03.04	15.03.04	05.11.04	07.05.03	
202210051A	Lücke Muss (60)	19.09.05	19.09.05	29.10.04	10.01.05	
so sollte die Datei Gesamt.txt dann aussehen.
Jetzt ist mir jedoch aufgefallen das einige txt Dateien Spalten weniger haben.
Zum Beispiel fehlt bei der zweite.txt die Spalte 40
In der gesamt.txt ist die Spalte 40 aber vorhanden.
Nun schiebt er mir die Daten zusammen. Soll heißen, was in der zweite.txt in Spalte 63 steht wird in die Spalte 40 geschoben.
Das darf nicht sein.
Ihc schick mal mein batch code auch.
@echo off

set Pfad1=...
set Pfad2=...

If exist %Pfad1%\Gesamt.txt del %Pfad1%\Gesamt.txt
If exist %Pfad1%\wertlos.txt del %Pfad1%\wertlos.txt

for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> fertig\Gesamt.txt  
for /f "tokens=3 delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> fertig\wertlos.txt  
Ich wäre euch unheimlich dankbar wenn mir jemand bei diesem Problem helfen kann.

Gruß Gin
[Edit Biber] Auf umformatiert. [/Edit]
Mitglied: 46933
46933 03.05.2007 um 13:28:54 Uhr
Goto Top
gut, das Datum steht immer unter den Zahlen.
sieht ein wenig unübersichtlich aus
Mitglied: bastla
bastla 03.05.2007 um 13:34:22 Uhr
Goto Top
Hallo ginivpj!

Beim Posten solltest Du Code, aber auch zB Deine Beispieldaten, unter "< code>"- bzw "< /code>"-Tags setzen (ohne die Leerzeichen nach "<").

Grüße
bastla
Mitglied: Biber
Biber 03.05.2007 um 22:02:03 Uhr
Goto Top
Moin ginivpj,

ihr treibt aber auch immer eine gequirlte... ähm... Rohdatenmasse auf..*grmpfff*

Aber mit Batch geht ja bekanntlich alles....
Ich hoffe, folgender Ansatz hilft Dir weiter.
Die Schwierigkeit ist, dass in der Input-Datei (ich habe sie beim Testen "gini.txt" genannt) die einzelnen Spalten mit TABs getrennt sind. (Welches Programm auch immer so einen Shice macht).

Wenn ein Wert fehlt, stehen dort eben zwei TABS.
Auch das lässt sich handeln. Mit dem oben geposteten Beispiel als gini.txt:
@echo off & setlocal
@for /f "delims=" %%i in ('findstr /b "20221" gini.txt') do call :processLine "%%i"  
goto :eof      
:processLine
set "line=%~1"   
REM ACHTUNG ---- in der nächsten zeile ist ein TAB nach dem Doppelpunkt!!!!
set "line=%line:	=§%"  
Set "line=%line:§§=§--leer--§%"  
Set "line=%line:§§=§--leer--§%"  
@for /f "tokens=3-9 delims=§" %%i in ("%line%") do @echo [11]%%i [22]:%%j [33]:%%k [40]:%%l [63]:%%m  

...erzeuge ich folgenden Output:
>e:\schnipsel\gini
[11]01.02.01 [22]:30.08.01 [33]:21.08.01 [40]:05.08.02 [63]:02.10.02
[11]15.03.04 [22]:15.03.04 [33]:24.10.02 [40]:--leer-- [63]:28.11.02
[11]15.03.04 [22]:15.03.04 [33]:05.11.04 [40]:--leer-- [63]:07.05.03
[11]19.09.05 [22]:19.09.05 [33]:29.10.04 [40]:--leer-- [63]:10.01.05
[11]15.03.04 [22]:15.03.04 [33]:24.10.02 [40]:--leer-- [63]:28.11.02
[11]15.03.04 [22]:15.03.04 [33]:05.11.04 [40]:--leer-- [63]:07.05.03
[11]19.09.05 [22]:19.09.05 [33]:29.10.04 [40]:--leer-- [63]:10.01.05
[11]01.02.01 [22]:30.08.01 [33]:21.08.01 [40]:02.10.02 [63]:
[11]15.03.04 [22]:15.03.04 [33]:24.10.02 [40]:28.11.02 [63]:
[11]15.03.04 [22]:15.03.04 [33]:05.11.04 [40]:07.05.03 [63]:
[11]19.09.05 [22]:19.09.05 [33]:29.10.04 [40]:10.01.05 [63]:
...das heißt, ich kann die Werte in Spalte [63] auch der richtigen Spalte zuordnen.
Dort, wo ich jetzt "--leer--" reingeschieben habe, kannst Du ja etwas Sinnvolles/Verarbeitbares schreiben.

ABER: ist IMHO alles Grütze.
Der richtigere Weg für Dich MUSS sein, irgendwie (Drohung, Einschüchterung, Bestechung, Neuprogrammierung) das Inputformat von TAB-delimited auf comma-separated o.ä. umzustellen.

Mit diesen TABs ist es...hmm... etwas für Leute, die Batches richtig lieb haben.

Gruss
Biber
Mitglied: bastla
bastla 04.05.2007 um 08:53:27 Uhr
Goto Top
Hallo ginivpj!

Zur generellen Problematik der Ausgangsdaten hat, wie ich meine, Biber schon alles gesagt, daher zurück zur eigentlichen Fragestellung:
Durch die unterschiedliche Feldanzahl ändert sich auch Deine ursprüngliche Anforderung hinsichtlich der Überschrift - diese müsste jetzt eigentlich lauten: Schreib die längste mit dem Wort "Standortname" beginnende Zeile aus allen ".txt"-Dateien in "fertig\Gesamt.txt"!
Umsetzen könntest Du das (unter Zuhilfenahme eines temporären VBScripts) etwa so:
set "Len=%temp%\GetLen.vbs"  
echo WScript.Echo Len(WScript.Arguments(0))>"%Len%"  
set Header=
set /a Lang=0
for /f "tokens=3 delims=:" %%i in ('findstr /B "Standortname" %Pfad2%\*.txt') do call :ProcessHeader "%%i"  
echo %Header%>>fertig\Gesamt.txt
del "%Len%"  
goto :GetBody
:ProcessHeader
for /f %%n in ('cscript //nologo "%Len%" %1') do set /a L=%%n  
if %L% leq %Lang% goto :eof
set "Header=%~1"  
set /a Lang=%L%
goto :eof
:GetBody
::ab hier weiter mit der Verarbeitung der einzelnen Datensätze (siehe dazu Biber's Lösung) 
Kurze Erklärung: Im ":ProcessHeader"-Unterprogramm wird für jede passende Zeile zunächst (mit Hilfe des in der Datei %Len% gespeicherten VBScripts) die Länge in Zeichen festgestellt. Ist diese <= der bisher größten Länge, kann auf diese Zeile verzichtet werden, anderenfalls wird die Zeile zwischengespeichert und die jetzt neue größte Länge ebenfalls in einer Variablen festgehalten.

Nachdem alle ".txt"-Dateien untersucht wurden, enthält die Variable %Header% die Überschrift mit der größten Zeichenanzahl. Diese wird in die "Gesamt.txt" geschrieben.

Abschließend wird noch die temporäre VBS-Datei gelöscht und zur eigentlichen Verarbeitung (bei ":GetBody") weitergeleitet.

Grüße
bastla
Mitglied: 46933
46933 04.05.2007 um 10:16:06 Uhr
Goto Top
Hallo,

also erst mal danke für eure Mühen.
Mit den gequirlten Ausgangsdaten habt ihr recht face-smile
Ich bin auch funknetzplaner und kein Programmierer und verstehe diese Wünsche überhaupt nicht face-sad
Nur aus irgendeinem Grund soll ich so ein Programmchen schreiben was das macht.
Also ich habe erst mal mit einem Problem angefangen.
Diese Spaltenüberschrift hin zu bekommen.
Ich habe bastla´s vorschlag eingebaut.
Es funktioniert alles wie vorher?????
@echo off

set Pfad1=H:\privat\muss_st1\fertig
set Pfad2=H:\privat\muss_st1

set "Len=%temp%\GetLen.vbs"  
echo WScript.Echo Len(WScript.Arguments(0))>"%Len%"  
set Header=
set /a Lang=0
for /f "tokens=3 delims=:" %%i in ('findstr /B "[Standortname]" %Pfad2%\*.txt') do call :ProcessHeader "%%i"   
echo %Header% >> fertig\Gesamt.txt
del "%Len%"  
goto :GetBody
:ProcessHeader
for /f %%n in ('cscript //nologo "%Len%" %1') do set /a L=%%n  
if %L% leq %Lang% goto :eof
set "Header=%~1"  
set /a Lang=%L%
goto :eof
:GetBody

If exist %Pfad1%\Gesamt.txt del %Pfad1%\Gesamt.txt
If exist %Pfad1%\wertlos.txt del %Pfad1%\wertlos.txt

REM Guten ins Töpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> fertig\Gesamt.txt  
REM Schlechten ins Kröpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> fertig\wertlos.txt  

Was mache ich falsch?
Vielleicht hab ich es an der falschen Stelle eingebaut!
Ich verstehe die Welt nicht mehr face-sad
Mitglied: Biber
Biber 04.05.2007 um 10:50:31 Uhr
Goto Top
Moin ginivpj,

Also ich habe erst mal mit einem Problem angefangen.
Das ist durchaus vernünftig. *g

Aber noch mal konkret die Frage:
Gibt es für Dich die Möglichkeit der Einflussnahme auf das Inputdatenformat??

Wenn etwas geliefert werden würde, was zur automatisierten Weiterverarbeitung (und nicht zum Ausdrucken und Abheften) gedacht ist, dann wäre das Geeiere drastisch reduzierbar.

Gruss
Biber
Mitglied: bastla
bastla 04.05.2007 um 10:57:46 Uhr
Goto Top
Hallo ginivpj!

Deine Verwendung der Pfade ist nicht wirklilch konsequent, daher vielleicht so:
@echo off & setlocal

set Pfad1=H:\privat\muss_st1\fertig
set Pfad2=H:\privat\muss_st1
If exist "%Pfad1%\Gesamt.txt" del "%Pfad1%\Gesamt.txt"  
If exist "%Pfad1%\wertlos.txt" del "%Pfad1%\wertlos.txt"  

set "Len=%temp%\GetLen.vbs"  
echo WScript.Echo Len(WScript.Arguments(0))>"%Len%"  
set Header=
set /a Lang=0
for /f "tokens=3 delims=:" %%i in ('findstr /B "Standortname" %Pfad2%\*.txt') do call :ProcessHeader "%%i"   
echo %Header% >>"%Pfad1%\Gesamt.txt"  
del "%Len%"  
goto :GetBody

:ProcessHeader
for /f %%n in ('cscript //nologo "%Len%" %1') do set /a L=%%n  
if %L% leq %Lang% goto :eof
set "Header=%~1"  
set /a Lang=%L%
goto :eof
:GetBody

REM Guten ins Töpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> "%Pfad1%\Gesamt.txt"  
REM Schlechten ins Kröpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> "%Pfad1%\wertlos.txt"  

Grüße
bastla
Mitglied: 46933
46933 04.05.2007 um 11:21:39 Uhr
Goto Top
Auf die Dateien habe ich keinen Einfluß.
Die kommen von der Zentrale so bei uns an.
Ich habe auch nicht die leiseste Ahnung wie sie erstellt oder generiert werden.
Deshalb muß ich mich mit dem begnügen was ich kriege. Leider.

Aber mit den Spaltenüberschriften klappt es.
(Ja ich muß noch einiges lernen wenn das so weiter geht? Bin nicht so bewandert in batch)

Gut, denn Sinn mit den TAbs hab ich verstanden wie es Biber erklärt hat!
Das ist mir klar:

REM ACHTUNG ---- in der nächsten zeile ist ein TAB nach dem Doppelpunkt!!!!
set "line=%line:    =§%"  
Set "line=%line:§§=§--leer--§%"  
Set "line=%line:§§=§--leer--§%"  

Allerdings ist mir nicht verständlich:

@echo off & setlocal
@for /f "delims=" %%i in ('findstr /b "20221" gini.txt') do call :processLine "%%i"  
goto :eof      
:processLine
set "line=%~1"   

und

@for /f "tokens=3-9 delims=§" %%i in ("%line%") do @echo [11]%%i [22]:%%j [33]:%%k [40]:%%l [63]:%%m  

Vielleicht könnt ihr mir das erklären?
Und vorallem wo bringe ich das hier unter?

REM Guten ins Töpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> "%Pfad1%\Gesamt.txt"  
REM Schlechten ins Kröpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> "%Pfad1%\wertlos.txt"  
Mitglied: 46933
46933 04.05.2007 um 14:14:22 Uhr
Goto Top
Ich hab jetzt ein bißchen probiert.
Glaube habe die einzelnen Schritte von biber kapiert.
Denke auch das ich alles richtig iengebaut habe.

@echo off & setlocal

set Pfad1=H:\privat\muss_st1\fertig
set Pfad2=H:\privat\muss_st1
If exist "%Pfad1%\Gesamt.txt" del "%Pfad1%\Gesamt.txt"  
If exist "%Pfad1%\wertlos.txt" del "%Pfad1%\wertlos.txt"  

REM Schreib die längste mit dem Wort "Standortname" beginnende Zeile aus allen ".txt"-Dateien in "fertig\Gesamt.txt"!  
REM Diese Zeile dient bei der verknüpfung nach Access als Spaltenüberschrift
set "Len=%temp%\GetLen.vbs"  
echo WScript.Echo Len(WScript.Arguments(0))>"%Len%"  
set Header=
set /a Lang=0
for /f "tokens=3 delims=:" %%i in ('findstr /B "Standortname" %Pfad2%\*.txt') do call :ProcessHeader "%%i"   
echo %Header% >>"%Pfad1%\Gesamt.txt"  
del "%Len%"  
goto :GetBody
:ProcessHeader
for /f %%n in ('cscript //nologo "%Len%" %1') do set /a L=%%n  
if %L% leq %Lang% goto :eof
set "Header=%~1"  
set /a Lang=%L%
goto :eof
:GetBody

REM Schlechten ins Kröpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >> "%Pfad1%\wertlos.txt"  

REM Guten ins Töpfechen...
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\*.txt') do call :processLine "%%i" @echo %%i >> "%Pfad1%\Gesamt.txt"  
goto : eof 
:processLine
set "line=%~1"   
REM ACHTUNG ---- in der nächsten Zeile ist ein TAB nach dem Doppelpunkt!!!!
REM Hier werden Tabs für nicht vorhandene Werte gesetzt!
set "line=%line:	=§%"  
Set "line=%line:§§=§--leer--§%"  
Set "line=%line:§§=§--leer--§%"  
REM Hier werden die Spalten definiert!
REM Kommt eine dazu, nur an der entsprechenden Stelle eintragen!
for /f "tokens=3-9 delims=§" %%i in ("%line%") do @echo [11]%%i [30]:%%j [40]:%%k [60]:%%l [63]:%%m [70]:%%n [71]:%%o [80]:%%p [87]:%%q [90]:%%r [100]:%%s   

Als Output bekomme ich aber leider:

Standortname	Fehler	11	30	40	60	63	70	71	80	87	90	100 
[11]12.06.03 [30]:07.07.03 [40]:07.10.03 [60]:--leer-- [63]:27.05.04 [70]:29.07.04 [71]:18.11.04 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:26.08.97 [60]:29.08.97 [63]:12.10.97 [70]:12.11.97 [71]:05.12.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:05.11.97 [60]:20.02.98 [63]:25.02.98 [70]:30.04.98 [71]:20.12.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:07.10.03 [60]:15.05.04 [63]:27.05.04 [70]:29.07.04 [71]:26.01.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]19.06.06 [30]:13.09.06 [40]:--leer-- [60]:--leer-- [63]:--leer-- [70]:--leer-- [71]:26.02.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:12.03.99 [60]:27.04.99 [63]:05.05.99 [70]:18.06.99 [71]:16.02.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:29.07.99 [60]:24.11.99 [63]:01.12.99 [70]:10.01.00 [71]:15.01.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:10.04.06 [60]:30.03.06 [63]:--leer-- [70]:--leer-- [71]:10.04.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]15.06.06 [30]:29.06.06 [40]:--leer-- [60]:01.06.06 [63]:06.06.06 [70]:13.07.06 [71]:15.09.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:20.08.99 [60]:15.06.00 [63]:26.06.00 [70]:20.09.00 [71]:16.02.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]17.05.06 [30]:17.05.06 [40]:05.09.06 [60]:24.07.06 [63]:14.08.06 [70]:11.10.06 [71]:15.12.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:02.07.98 [60]:15.08.98 [63]:20.08.98 [70]:24.08.98 [71]:09.03.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:15.01.98 [60]:15.05.98 [63]:25.05.98 [70]:17.07.98 [71]:02.03.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]07.02.06 [30]:07.02.06 [40]:16.02.99 [60]:25.01.99 [63]:01.02.99 [70]:15.02.99 [71]:14.03.07 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]01.02.01 [30]:30.08.01 [40]:21.08.01 [60]:--leer-- [63]:02.10.02 [70]:28.05.03 [71]:22.07.03 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]15.03.04 [30]:15.03.04 [40]:24.10.02 [60]:--leer-- [63]:28.11.02 [70]:30.06.03 [71]:05.05.04 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]15.03.04 [30]:15.03.04 [40]:05.11.04 [60]:--leer-- [63]:07.05.03 [70]:28.05.03 [71]:14.05.04 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]15.03.04 [30]:15.03.04 [40]:05.11.04 [60]:--leer-- [63]:11.10.03 [70]:19.03.03 [71]:07.05.04 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]24.04.06 [30]:18.05.06 [40]:21.08.01 [60]:--leer-- [63]:07.05.03 [70]:28.05.03 [71]:25.09.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]24.04.06 [30]:18.05.06 [40]:26.04.05 [60]:--leer-- [63]:16.02.06 [70]:29.03.06 [71]:16.10.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]19.09.05 [30]:19.09.05 [40]:29.10.04 [60]:--leer-- [63]:10.01.05 [70]:11.02.05 [71]:19.07.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]20.10.03 [30]:20.10.03 [40]:24.11.04 [60]:--leer-- [63]:16.08.04 [70]:18.11.04 [71]:09.09.04 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]03.02.05 [30]:03.02.05 [40]:02.05.05 [60]:--leer-- [63]:15.01.07 [70]:01.02.07 [71]:16.11.06 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]18.07.03 [30]:27.04.04 [40]:20.08.03 [60]:--leer-- [63]:15.11.03 [70]:10.09.04 [71]:13.08.04 [80]:%p [87]:%q [90]:%r [100]:%s 
[11]21.10.03 [30]:03.05.04 [40]:07.10.03 [60]:--leer-- [63]:27.05.04 [70]:10.09.04 [71]:27.10.04 [80]:%p [87]:%q [90]:%r [100]:%s 

So sollte es aber nicht sein.
Es sollte er so aussehen:

Standortname	Fehler	11	30	40	60	63	70	71
305200080A	Lücke Muss (63)	04.04.03	03.12.03	15.01.98	24.09.04		
305201050A	Lücke Muss (71,80,87)	12.01.06	12.01.06	05.08.98	26.10.06	
305209998A	Lücke Muss (63)	20.02.03	20.02.03	23.10.97	20.02.03		 
306200057A	Lücke Muss (63)	29.04.05	29.04.05	29.04.05	29.04.05		

Was ist nun daran falsch bei mir?
Mitglied: bastla
bastla 04.05.2007 um 14:23:45 Uhr
Goto Top
Hallo ginivpj!

Gerade wollte ich dieses zum Besten geben (freue mich aber natürlich, dass Du es selbst geschafft hast):
@echo off & setlocal
@for /f "delims=" %%i in ('findstr /b "20221" gini.txt') do call :processLine "%%i"  
goto :eof      
:processLine
set "line=%~1"   
Hier werden zunächst alle Zeilen der Beispieldatei "gini.txt", die mit "20221" beginnen, an das Unterprogramm ":ProcessLine" übergeben (unter Anführungszeichen, damit die gesamte Zeile erfasst wird).
Im Unterprogramm wird die Zeile "von den Anführungszeichen befreit" (%~1) und einer Variable %line% zugewiesen, damit sie weiterverarbeitet werden kann. Auch hier sorgen wieder die Anführungszeichen für den Zusammenhalt. %1 (und nicht etwa %%i) wird verwendet, da sich das Unterprogramm wie eine weitere Batch-Datei verhält, und die Zeile das erste (und einzige) Argument beim Aufruf darstellt.

@for /f "tokens=3-9 delims=§" %%i in ("%line%") do @echo [11]%%i [22]:%%j [33]:%%k [40]:%%l [63]:%%m  
Da vorher die Tabs durch "§" ersetzt wurden, können diese jetzt zum Zerlegen des Datensatzes in einzelne Felder verwendet werden, wobei (wie auch bisher schon von Dir verwendet) das erste Feld durch den dritten Bestandteil ("token") der Zeile repräsentiert wird. Da als Variable %%i verwendet wird, werden alle weiteren Bestandteile den folgenden Buchstaben zugewiesen (j, k, ...). Die eingestreuten [11], [22], etc dienen nur zur Demonstration der Zuordnung (ersetzen also quasi die Überschrift).
Was ist nun daran falsch bei mir?
Es hängt davon ab, ob Du die Kennzeichnung der leeren Felder benötigst oder ev ein anderes Trennzeichen als TAB einsetzen willst - falls beides "nein", sollte auch Deine bisherige Lösung genügen, ansonsten:
REM Guten ins Töpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\*.txt') do call :processLine "%%i"  
REM Schlechten ins Kröpfchen...
for /f "tokens=3 delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\*.txt') do @echo %%i >>"%Pfad1%\wertlos.txt"  
goto :eof
:processLine
set "line=%~1"   
REM ACHTUNG ---- in der nächsten zeile ist ein TAB nach dem Doppelpunkt!!!!
set "line=%line:    =§%"  
Set "line=%line:§§=§--leer--§%"  
Set "line=%line:§§=§--leer--§%"  
REM ACHTUNG ---- in der nächsten zeile ist ein TAB vor dem letzten Prozentzeichen!!!!
Set "line=%line:§=	%  
echo %line%>>%Pfad1%\Gesamt.txt
Es wird jetzt am Ende das Trennzeichen wieder in TAB zurückgewandelt; an dieser Stelle kannst Du natürlich auch "," oder ";" verwenden.

Grüße
bastla
Mitglied: 46933
46933 04.05.2007 um 14:39:04 Uhr
Goto Top
Ich benötige die Kennzeichnung der Felder da die Tabelle mit Access verknüpft wird.
Das macht mich ja wahnsinnig.
Es müssen die Tabs bestehen weil ja sonst das Datum nicht wirklich unter der richtigen Spaltenzahl steht.
Mitglied: 46933
46933 04.05.2007 um 14:41:25 Uhr
Goto Top
Die Daten sind alle da.
Nur wie gesagt, sie stehen nicht richtig unter den Spaltennamen.
Und beim Verknüpfen nach Access werden die Daten überhaupt nicht berücksichtigt.
Es erscheinen nur die Spaltennamen.
Also muß ich doch die Tabs beibehalten????
Mitglied: bastla
bastla 04.05.2007 um 15:00:12 Uhr
Goto Top
Hallo ginivpj!

Nachtrag: Wenn Du von TAB auf zB ";" umstellst, muss das natürlich auch bei der Überschrift gemacht werden, also etwa
echo %Header:	=;% >>"%Pfad1%\Gesamt.txt"  
Nach dem Doppelpunkt steht auch hier ein TAB.
Ich sehe das Problem aber generell darin, dass Du versuchst, Tabellen mit verschiedenem Aufbau zusammenzufassen (in denen - entgegen Biber's Annahme - fehlende Felder nicht "freigehalten", sondern einfach ignoriert werden), etwa
Standortname    Fehler                    11    22    33    40    63
und
Standortname    Fehler                    11    22    33    63
Wenn dann zB noch
Standortname    Fehler                    11    22    40    63
dazukommt, ist das Durcheinander perfekt. Sehe ich das so richtig?

Eigentlich könnte die Lösung nur so aussehen, dass jeder einzelnen "PB"-Abschnitt (oder, wenn die Struktur einheitlich ist, auch eine gesamte Datei) für sich betrachtet und mit der passenden Überschrift in eine eigene Textdatei geschrieben und einzeln importiert wird, wodurch sich Access beim Import an den Feldnamen orientieren kann (wie ich hoffe).

Grüße
bastla
Mitglied: Biber
Biber 04.05.2007 um 19:01:56 Uhr
Goto Top
@bastla
Eigentlich könnte die Lösung nur so aussehen, ...
...oder aber, die Inhalte der Textdateien mit mal 6, mal 7 und manchmal auch 8 Spalten werden vorher auf ein einheitliches "Layout" gebracht.

Es kann ja auch kein Hexenwerk sein, per Batch eine weder in der Überschrift noch als Spalteninhalt vorhandene Spalte namens "[33]" mit anzulegen im Kopf wie auch mit Inhalt "--leer--"

Aber stressärmer wäre schon ein Einzelverarbeitung der Dateien - wenn die unterschiedliche Inhalte haben (z.B. Äpfel und Birnen), dann lassen die sich eigentlich nicht aggregieren.

@46933
Ich will nicht penetrant sein, aber... ist es für Dich absolut ausgeschlossen, am Montach mal in der Zentrale anzurufen und ein konstruktuves Telefonat einzuleiten mit den Worten: "Ich kann diese merkwürdigen beliebigen Outputdateien nicht automatisiert verarbeiten, könnt ihr mal eben was Vernünftiges erzeugen und schafft ihr das noch bis 10:30h?"

Denn Batch hat schon etwas mit "automatisierter Verarbeitung" zu tun...
Und dazu braucht man/frau ein paar feste Punkte im Raum.

Gruß
Biber
Mitglied: bastla
bastla 04.05.2007 um 20:04:50 Uhr
Goto Top
@Biber

Eigentlich könnte die Lösung nur so aussehen, ...
Ok, das "nur" ziehe ich zurück ...

...oder aber, die Inhalte der Textdateien mit mal 6, mal 7 und manchmal auch 8 Spalten werden vorher auf ein einheitliches "Layout" gebracht.
Eine entsprechende Passage hatte ich noch rechtzeitig aus meinem obigen Statement eliminiert, da ich beide der anderen Varianten bevorzugen würde.

Grüße
bastla
Mitglied: 46933
46933 07.05.2007 um 09:41:05 Uhr
Goto Top
Wenn dann zB noch

Standortname    Fehler                    11    22    40    63

dazukommt, ist das Durcheinander perfekt. Sehe ich das so richtig?

Genauso sieht es aus face-sad

Also ist es wohl besser wenn ich alle vorhandenen txt Dateien in einzelne txt Dateien auslese und diese dann einzeln mit Access verknüpfe!!

Das kann ich doch aber auch alles in einer batch Datei realisieren, oder?
Dazu kommt das ich dann ja auch aus jeder txt Datei eine Spaltenüberschrift brauche.
Meine Anforderung hinsichtlich der Überschrift müsste jetzt ja jetzt heißen: Schreib eine Zeile welche mit dem Wort "Standortname" beginnt aus "muss_st_ne21_aufbau.txt" in "fertig\muss_st_ne21_aufbau.txt"!
Also müßte ich jetzt für jede txt Datei schreiben:
Schreib eine Zeile welche mit dem Wort "Standortname" beginnt aus "muss_st_ne21_aufbau.txt" in "fertig\muss_st_ne21_aufbau.txt"!  
und dann
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\muss_st_ne21_aufbau.txt') do @echo %%i >> fertig\muss_st_ne21_aufbau.txt  

für die zweite txt Datei das gleiche????

Schreib eine Zeile welche mit dem Wort "Standortname" beginnt aus "muss_st_ne30_aufbau.txt" in "fertig\muss_st_ne30_aufbau.txt"!  
und dann
for /f "tokens=3 delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\muss_st_ne30_aufbau.txt') do @echo %%i >> fertig\muss_st_ne30_aufbau.txt  

Ist meine Überlegung korrekt?

Gruß Gini
Mitglied: 46933
46933 07.05.2007 um 12:42:20 Uhr
Goto Top
Also ich habe jetzt diesen Code

@echo off & setlocal

set Pfad1=H:\privat\muss_st1\fertig
set Pfad2=H:\privat\muss_st1
If exist "%Pfad1%\*.txt" del "%Pfad1%\*.txt"  

REM Guten ins Töpfchen...
for /f "delims=:" %%i in ('findstr /B "[Standortname]" %Pfad2%\muss_st_ne21_aufbau.txt') do @echo %%i >> fertig\muss_st_ne21_aufbau.txt  
for /f "delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\muss_st_ne21_aufbau.txt') do @echo %%i >> fertig\muss_st_ne21_aufbau.txt  
for /f "delims=:" %%i in ('findstr /B "[Standortname]" %Pfad2%\muss_st_ne20_aufbau.txt') do @echo %%i >> fertig\muss_st_ne20_aufbau.txt  
for /f "delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\muss_st_ne20_aufbau.txt') do @echo %%i >> fertig\muss_st_ne20_aufbau.txt  

REM Schlechten ins Kröpfchen...
for /f "delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\muss_st_ne21_aufbau.txt') do @echo %%i >>fertig\wertlos.txt  
for /f "delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\muss_st_ne20_aufbau.txt') do @echo %%i >>fertig\wertlos.txt  

Und er schreibt alles perfekt in in die einzelnen txt Dateien.
Ausser:::::
for /f "delims=:" %%i in ('findstr /B "[Standortname]" %Pfad2%\muss_st_ne20_aufbau.txt') do @echo %%i >> fertig\muss_st_ne20_aufbau.txt  
bei diesem Befehl schreibt er mir wieder alle vorhandenen Zeilen mit dem Anfang "Standortname" in die entsprechende Datei.
Jetzt hab ich diese Zeile wieder mehrmals in den Dateien.
Ich will sie aber doch nur einmal.
Mitglied: 46933
46933 07.05.2007 um 12:55:37 Uhr
Goto Top
OK.
Nach dem basteln habe ich folgenden Code gefunden der mir alles in einzelne Dateien schreibt mit nur einer Spaltenüberschrift.

@echo off & setlocal

set Pfad1=H:\privat\muss_st1\fertig
set Pfad2=H:\privat\muss_st
set Geschrieben=
If exist "%Pfad1%\*.txt" del "%Pfad1%\*.txt"  

REM Guten ins Töpfchen...

for /f "delims=:" %%i in ('findstr /B "Standortname" %Pfad2%\muss_st_ne21_aufbau.txt') do if not defined Geschrieben @echo %%i >> fertig\muss_st_ne21_aufbau.txt & set Geschrieben=True  
for /f "delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\muss_st_ne21_aufbau.txt') do @echo %%i >> fertig\muss_st_ne21_aufbau.txt  
for /f "delims=:" %%i in ('findstr /B "Standortname" %Pfad2%\muss_st_ne20_aufbau.txt') do if not defined Geschrieben @echo %%i >> fertig\muss_st_ne20_aufbau.txt & set Geschrieben=True  
for /f "delims=:" %%i in ('findstr /B /R "[2]" %Pfad2%\muss_st_ne20_aufbau.txt') do @echo %%i >> fertig\muss_st_ne20_aufbau.txt  

REM Schlechten ins Kröpfchen...
for /f "delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\muss_st_ne21_aufbau.txt') do @echo %%i >>fertig\wertlos.txt  
for /f "delims=:" %%i in ('findstr /V /B /R "[2]" %Pfad2%\muss_st_ne20_aufbau.txt') do @echo %%i >>fertig\wertlos.txt  

Nur mal als Feedback!!!
Ist das die beste Lösung vom Code her???

Danke

Gini
Mitglied: 46933
46933 07.05.2007 um 13:12:14 Uhr
Goto Top
Sorry, das ich nerve.
So ganz richtig funktioniert es doch noch nicht.
Die erste Datei wird korrekt ab gearbeitet.
REM Guten ins Töpfchen...

for /f "delims=:" %%i in ('findstr /B "Standortname" %Pfad2%\muss_st_ne21_aufbau.txt') do if not defined Geschrieben @echo %%i >> fertig\muss_st_ne21_aufbau.txt & set Geschrieben=True  

So wie ich es brauche.
Aber die danach folgenden nicht.
Die Datensätze werden zwar in die entsprechende Datei geschrieben, jedoch ohne Spaltenüberschrift?
Es muß mit diesem Befehl zusammen hängen:

for /f "delims=:" %%i in ('findstr /B "Standortname" %Pfad2%\muss_st_ne20_aufbau.txt') do if not defined Geschrieben @echo %%i >> fertig\muss_st_ne20_aufbau.txt & set Geschrieben=True  

Und warum?
Müssen diese dann anders sein?
Mitglied: bastla
bastla 07.05.2007 um 17:34:04 Uhr
Goto Top
Hallo ginivpj!

Nachdem die Variable %Geschrieben% erstmals einen Wert erhalten hat, wird keine weitere Überschrift in die Zieldatei geschrieben - daher müsstest Du vor dem Bearbeiten der zweiten Datei mit
set Geschrieben=
die Variable wieder löschen. Allerdings hast Du etwa 20 Dateien erwähnt, und die wirst Du doch nicht alle einzeln im Batch anführen wollen?!

Wenn alle in "H:\privat\muss_st1" enthaltenen Textdateien bearbeitet werden sollen, könntest Du das etwa so lösen:
@echo off & setlocal

set Pfad1=H:\privat\muss_st1\fertig
set Pfad2=H:\privat\muss_st1

If exist "%Pfad1%\*.txt" del "%Pfad1%\*.txt"  

for %%f in ("%Pfad2%\*.txt") do call :ProcessFile "%%f"  
goto :eof

:ProcessFile
set Geschrieben=
REM Guten ins Töpfchen...
for /f "delims=:" %%i in ('findstr /B "Standortname" %1') do if not defined Geschrieben @echo %%i >> "%Pfad1%\%~nx1" & set Geschrieben=True  
for /f "delims=:" %%i in ('findstr /B /R "[2]" %1') do @echo %%i >> "%Pfad1%\%~nx1"  

REM Schlechten ins Kröpfchen...
for /f "delims=:" %%i in ('findstr /V /B /R "[2]" %1') do @echo %%i >>"%Pfad1%\wertlos.txt"  
goto :eof
Durch die Schleife vorneweg werden alle Textdateien der Reihe nach an das Unterprogramm ":ProcessFile" weitergereicht, wo sie wie bisher zerlegt und in eine passende Zieldatei geschrieben werden (%~nx1 bedeutet: Nimm von der übergebenen Datei (%1 im Unterprogramm) nur den Namen und die Extension, also den Dateityp).

Grüße
bastla
Mitglied: 46933
46933 08.05.2007 um 11:23:36 Uhr
Goto Top
Super!
Es hat alles geklappt.
Das Problem ist gelöst.
Ich möchte mich für die schnelle Hilfe von euch bedanken.
Macht weiter so.

Gruß Gini