sp3ll3
Goto Top

Durch Scanner erstellte .txt aufsplitten mit Batchdatei

Hallo,

ich habe einen Scanner eingerichtet, der eine Textdatei mit folgendem Inhalt auswirft:

116934;10052009;1720.TXT

116934;3033968;;20;;;;;;;;;
116934;2843021;;1;;;;;;;;;
105206;2658390;;100;;;;;;;;;
105206;4930004;;10;;;;;;;;;
106228;4981043;;5;;;;;;;;;
106228;2740105;;500;;;;;;;;;


Das erste ist die Kundennummer, das zweite die Artikelnummer und das letzte die Anzahl. Diese TXT-Datei soll jetzt aufgeteilt werden in drei Stück jeweil nachdem sich die Kundennummer ändert:


116934;10052009;1720.TXT

116934;3033968;;20;;;;;;;;;
116934;2843021;;1;;;;;;;;;

und dann halt die nächste.

Jetzt bräuchte ich eine Batch-Datei die mir das abnimmt, da es hoher aufwand ist alles einzeln einzuscannen und abzuspeichern.

Besten dank im vorraus für die Antworten

Gruß

Content-Key: 122578

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

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

Member: bastla
bastla Aug 12, 2009 at 10:43:02 (UTC)
Goto Top
Hallo Sp3ll3 und willkommen im Forum!

Dein gewünschtes Ergebnis sind 3 Dateien mit folgenden Inhalten?
Datei1:
116934;10052009;1720.TXT

116934;3033968;;20;;;;;;;;;
116934;2843021;;1;;;;;;;;;
Datei2:
105206;2658390;;100;;;;;;;;;
105206;4930004;;10;;;;;;;;;
Datei3:
106228;4981043;;5;;;;;;;;;
106228;2740105;;500;;;;;;;;;

Wenn ja: Wie sollen diese Dateien heißen?

Grüße
bastla
Member: Sp3ll3
Sp3ll3 Aug 12, 2009 at 11:08:09 (UTC)
Goto Top
ja, das ist richtig.

der Name setzt sich wie folgt zusammen:

Kundennummer;Datum(ttmmjjjj);Uhrzeit(minminstdstd)

Danke für das willkommen heißen und die schnelle antwort. face-smile
Member: bastla
bastla Aug 12, 2009 at 11:18:32 (UTC)
Goto Top
Hallo Sp3ll3!

Gemeint war eigentlich, unter welchem Namen die jeweiilige Teildatei gespeichert werden soll ...

Zusatzfrage: Wie ist bei Namenskollisionen vorzugehen (wenn also eine gleichnamige Datei bereits existieren sollte)?

Grüße
bastla
Member: Sp3ll3
Sp3ll3 Aug 12, 2009 at 11:25:28 (UTC)
Goto Top
Also die Teildatei soll das gleiche Namenformat tragen mit angepasster Kundennummer sprich:

116934;10052009;1720.TXT

105206;10052009;1721.TXT

usw..

Da jeder Kunde nur maximal einmal vorkommen kann (da die erzeugten TXT-Dateien nach Verarbeitung gelöscht werden) ist eine Namenskollision ausgeschlossen. Muss also nicht Berücksichtigt werden.

Gruß
Member: miniversum
miniversum Aug 12, 2009 at 11:51:24 (UTC)
Goto Top
Versuchs mal damit:
@echo off
set "pfad=C:\Ordner"  

FOR /F "tokens=1,* delims=;" %%i in ('dir /b "%pfad%\*.txt"') do (  
ren "%pfad%\%%i;%%j" "%%i;%%j.tmp"  
FOR /F "tokens=1,* delims=;" %%l in ('type "%pfad%\%%i;%%j.tmp"') do echo %%l;%%m>>"%pfad%\%%l;%%j"  
REM del "%pfad%\%%i;%%j.tmp"  
)
Wenn du das REM entfernst wird die ursprungsdatei gelöscht, sonst nru umbeenannt mit einem tmp als Anhang.
Member: bastla
bastla Aug 12, 2009 at 11:53:02 (UTC)
Goto Top
Hallo Sp3ll3!

Wenn die Ausgangsdatei "116934;10052009;1720.TXT" heißt und sich aufgrund der ersten Kundennummer ebenfalls der Dateiname "116934;10052009;1720.TXT" (beides tatsächlich mit enthaltenen ";" ?) ergibt, müssten die Teildateien in einen anderen Ordner geschrieben werden, oder soll die Ausgangsdatei um die nicht zugehörigen Zeilen gekürzt werden?

Falls Letzteres, dann etwa so:
@echo off & setlocal
set "AusgangsDatei=%~1"  
set "Zielordner=%~dp1"  
set "Bak=.bak"  
for /f "tokens=1* delims=;" %%i in ("%~nx1") do set "Timestamp=%%j"  

move "%AusgangsDatei%" "%AusgangsDatei%%Bak%"  
set "Zuletzt=$"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%AusgangsDatei%%Bak%"') do set "Zeile=%%j" & call :ProcessLine  

del "%AusgangsDatei%%Bak%"  
goto :eof

:ProcessLine
for /f "delims=;" %%a in ("%Zeile%") do set "KNr=%%a"  
if "%KNr%"=="%Zuletzt%" goto :WriteLine  
set "Zuletzt=%KNr%"  
set "Datei=%Zielordner%%KNr%;%Timestamp%"  

:WriteLine
>>"%Datei%" echo\%Zeile%  
goto :eof
Aufzurufen ist der Batch mit Übergabe der Ausgangsdatei, also etwa:
Aufteilen.cmd "D:\Ein Ordner\116934;10052009;1720.TXT"
Bei Bedarf lässt sich das natürlich auf Bearbeitung aller (".TXT"- ) Dateien im Ordner erweitern ...

Grüße
bastla
Member: Sp3ll3
Sp3ll3 Aug 12, 2009 at 12:39:24 (UTC)
Goto Top
Hi,

irgendwo vertue ich mich bei dem eintragen der Pfade:

Ursprungsordner: D:\TXT Splitter

Zielordner: D:\TXT Splitter\Ablage

Datei: D:\TXT Splitter\116934;10052009;1720.TXT

Mögt ihr mal eben schauen face-smile (schande über mein Haupt.. )
Member: bastla
bastla Aug 12, 2009 at 12:45:36 (UTC)
Goto Top
Hallo Sp3ll3!

Zeile 3 (zu beachten ist der abschließende "\"):
set "Zielordner=D:\TXT Splitter\Ablage\" 
Außerdem wird angenommen, dass der Zielordner bereits existiert, ansonsten noch (jedenfalls vor Zeile 9) einfügen:
if not exist "%Zielordner%" md "%Zielordner%"
Aufruf des Batches:
Aufteilen.cmd "D:\TXT Splitter\116934;10052009;1720.TXT"
Grüße
bastla
Member: bastla
bastla Aug 12, 2009 at 12:57:05 (UTC)
Goto Top
... Nachtrag: Wenn die Einzeldateien in einem anderen Ordner erstellt werden, ist das Umbenennen (und Löschen) der Ausgangsdatei nicht erforderlich, daher:
@echo off & setlocal
set "AusgangsDatei=%~1"  
set "Zielordner=%~dp1Ablage\"  

if not exist "%Zielordner%" md "%Zielordner%"  

for /f "tokens=1* delims=;" %%i in ("%~nx1") do set "Timestamp=%%j"  
set "Zuletzt=$"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%AusgangsDatei%"') do set "Zeile=%%j" & call :ProcessLine  

goto :eof

:ProcessLine
for /f "delims=;" %%a in ("%Zeile%") do set "KNr=%%a"  
if "%KNr%"=="%Zuletzt%" goto :WriteLine  
set "Zuletzt=%KNr%"  
set "Datei=%Zielordner%%KNr%;%Timestamp%"  

:WriteLine
>>"%Datei%" echo\%Zeile%  
goto :eof
In dieser Fassung wird der Zielordner automatisch als Unterordner "Ablage" des Ordners, in welchem die Ausgangsdatei liegt, erstellt und verwendet.

Grüße
bastla
Member: Sp3ll3
Sp3ll3 Aug 12, 2009 at 13:00:50 (UTC)
Goto Top
wir nähern uns dem Ende, allerdings klappts noch immer nicht wie müsste es denn komplett bei mir aussehen mit den angegebenen Pfaden?
Member: bastla
bastla Aug 12, 2009 at 13:15:00 (UTC)
Goto Top
Eigentlich wie gleich oberhalb ...

Grüße
bastla
Member: Sp3ll3
Sp3ll3 Aug 12, 2009 at 13:41:21 (UTC)
Goto Top
Er sagt mir das die angegebene Umgebungsoption nicht gefunden wurde und spuckt mir dann folgenden Teil aus:

findstr /n "^" "%AusgangsDatei%"') do set "Zeile=%%j" & call :ProcessLine

goto :eof


:ProcessLine

for /f "delims=;" %%a in
Member: bastla
bastla Aug 12, 2009 at 13:55:31 (UTC)
Goto Top
Hallo Sp3ll3!

Kann ich nicht nachvollziehen - könntest Du kurz beschreiben, wie Du getestet hast?

Bei mir funktioniert jedenfalls die (aus dem per "Quelltext" aufgerufenen Fenster kopierte) gepostete Version mit folgender Quelldatei "116934;10052009;1720.TXT":
116934;10052009;1720.TXT

116934;3033968;;20;;;;;;;;;
116934;2843021;;1;;;;;;;;;
105206;2658390;;100;;;;;;;;;
105206;4930004;;10;;;;;;;;;
106228;4981043;;5;;;;;;;;;
106228;2740105;;500;;;;;;;;;
Kannst Du das bitte mit der gleichen Vorgangsweise (den gleichen Daten) bei Dir prüfen?

Grüße
bastla
Member: Sp3ll3
Sp3ll3 Aug 12, 2009 at 14:11:04 (UTC)
Goto Top
Habe den Fehler schon gefunden, danke jetzt funktioniert es.. war ein Rechtschreibfehler.. face-smile

Besten Dank