Zeilen aus TXT Datei auslesen und in neue einfügen
Hallo Zusammen,
ich habe eine TXT Datei mit vielen hundert Zeilen. Jetzt soll mir im optimalfall eine Batchdatei jede einzelne Zeile dieser TXT Datei in eine neue TXT schreiben.
Mein Problem ist nur, es gibt hier ähnliche Lösungsansätzte mit For und findstr nur kann ich
mir daraus nichts zusammenreimen. Wenn jemand von euch vielleicht kurz Zeit findet und mir eine solche
Batch zeigt bzw. wie eine solche mit For und findstr in meinem Fall aufgebaut wäre?
folgendes hab ich mir schon zusammengecopyundpastet
for /f "tokens=1,2 delims=:" %%i in ('findstr /n "." importmanuell.txt') do @for /f %%x in ('set /a %%i %%') do @if %%x==0 %j>>new.txt"
Danke + Gruß
ich habe eine TXT Datei mit vielen hundert Zeilen. Jetzt soll mir im optimalfall eine Batchdatei jede einzelne Zeile dieser TXT Datei in eine neue TXT schreiben.
Mein Problem ist nur, es gibt hier ähnliche Lösungsansätzte mit For und findstr nur kann ich
mir daraus nichts zusammenreimen. Wenn jemand von euch vielleicht kurz Zeit findet und mir eine solche
Batch zeigt bzw. wie eine solche mit For und findstr in meinem Fall aufgebaut wäre?
folgendes hab ich mir schon zusammengecopyundpastet
for /f "tokens=1,2 delims=:" %%i in ('findstr /n "." importmanuell.txt') do @for /f %%x in ('set /a %%i %%') do @if %%x==0 %j>>new.txt"
Danke + Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 155344
Url: https://administrator.de/contentid/155344
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo killinator007!
Wenn ich Deinen Batchansatz allerdings richtig interpretiere, war das doch eher so gemeint, dass pro Zeile (Leerzeilen ausgenommen) eine neue Datei erstellt werden soll - im (hinsichtlich der Benennung der neuen Dateien) einfachsten Fall daher:
Grüße
bastla
Jetzt soll mir im optimalfall eine Batchdatei jede einzelne Zeile dieser TXT Datei in eine neue TXT schreiben.
Liest sich zunächst wie die Beschreibung eines "copy
" ...Wenn ich Deinen Batchansatz allerdings richtig interpretiere, war das doch eher so gemeint, dass pro Zeile (Leerzeilen ausgenommen) eine neue Datei erstellt werden soll - im (hinsichtlich der Benennung der neuen Dateien) einfachsten Fall daher:
for /f "tokens=1* delims=:" %%i in ('findstr /v "^$" importmanuell.txt^|findstr /n "^"') do >%%i.txt echo %%j
bastla
habe ein powershellscript version erstellt.
die dateien habe ich einfach nur durchnummeriert
gruß michael
# **************************************************************
# 1fileToAnyFile
#
# einmal auf der powershell ausgeführt werden
# "Set-ExecutionPolicy Unrestricted"
# **************************************************************
#
# **************************************************************
# * Erstellt M.N. - POWERSHELL / Entwicklung 19.11.2010 *
# *
# **************************************************************
$ErrorActionPreference = 'SilentlyContinue'
$QUELLE = "c:\Temp"
$EXTENSION = "*.tif"
$ZIEL = "C:\Temp"
$FILE = "logfile2.txt"
$ZAEHLER = 1
$TEXT = Get-Content $QUELLE\$FILE
foreach ($i in $TEXT) {
echo "$ZAEHLER : $i"
$i > $ZIEL\$ZAEHLER.txt
$ZAEHLER = $ZAEHLER+1
}
gruß michael
Zitat von @bastla:
for /f "tokens=1* delims=:" %%i in ('findstr /v "^$"
> importmanuell.txt^|findstr /n "^"') do >%%i.txt echo %%j
>
Der Code funktioniert bei mir sehr gut als Batch, allerdings würde ich gern die Dateinamen abhängig von einem bestimmten Zeileninhalt machen. Zum Beispiel:
Inhalt der Ursprugngsbatch.txt:
8354203747293620173/Erster.Text.temp
72629ß1897826322032/Zweiter-Text.temp
0246834072309222044/3ter-oder100er-text.temp
nun kommt die der wunderbare code zum einsatz (vielen dank schonmal dafür!!!): for /f "tokens=1* delims=:" %%i in ('findstr /v "^$" Ursprugngsbatch.txt^|findstr /n "^"') do >%%i.txt echo %%j
der dateiinhalt ist für mich passend:
Inhalt der 1.txt:
8354203747293620173/Erster.Text.temp
usw.
aber ich brauche den entsprechenden dateinamen dazu:
Erster.Text.txt
also jeweils die Zeichenfolge zwischen "/" und ".temp" aus der jeweiligen Textdatei.
wenn das irgendwie möglich sein sollte, wäre ich sehr dankbar für einen tip. ich bin anfänger auf diesem gebiet und google konnte mir bisher leider noch nicht weiterhelfen
Hallo meinzelmax und willkommen im Forum!
Soferne alle Deine Zeilen nach dem selben Schema zusammengesetzt sind (es also jeweils genau ein Trennzeichen "/" und einen wegzulassenden Teil ".temp" am Ende gibt), sollte das (ungetestet) so gehen:
Kurze Erklärung:
Es werden alle Zeilen der "Ursprungsbatch.txt" anhand des Trennzeichens "/" aufgeteilt, sodass die Variable %%i den Teil vor dem ersten Trennzeichen (=token #1) und %%j jenen zwischen erstem und zweitem (das es aber nicht geben sollte) Trennzeichen (=token #2) enthält.
Mit der Schreibweise ("
Anhand dieses Namens wird im aktuellen Ordner (Du könntest aber natürlich auch einen Pfad davor angeben, also etwa
Grüße
bastla
Soferne alle Deine Zeilen nach dem selben Schema zusammengesetzt sind (es also jeweils genau ein Trennzeichen "/" und einen wegzulassenden Teil ".temp" am Ende gibt), sollte das (ungetestet) so gehen:
for /f "usebackq tokens=1-2 delims=/" %%i in ("D:\Ein Ordner\Ursprugngsbatch.txt") do >%%~nj.txt echo %%i/%%j
Es werden alle Zeilen der "Ursprungsbatch.txt" anhand des Trennzeichens "/" aufgeteilt, sodass die Variable %%i den Teil vor dem ersten Trennzeichen (=token #1) und %%j jenen zwischen erstem und zweitem (das es aber nicht geben sollte) Trennzeichen (=token #2) enthält.
Mit der Schreibweise ("
%%~nj
") wird %%j als Dateipfad betrachtet und nur der reine Namensanteil isoliert (siehe dazu "for /?
") - es wird also alles ab dem letzten "." (= Dateityp) weggelassen.Anhand dieses Namens wird im aktuellen Ordner (Du könntest aber natürlich auch einen Pfad davor angeben, also etwa
>"D:\Ein anderer Ordner\%%~nj"
schreiben) eine entsprechend benannte Datei erstellt, in welche beide Teile der Zeile samt Trennzeichen (daher %%i/%%j
) geschrieben werden.Grüße
bastla
hallo bastla,
vielen dank erstmal. das klapp gut. wie du aber geschrieben hast, darf nur ein "/" enthalten sein. bei einigen datensätzen ist das jedoch nicht so, wie ich grad festgestellt habe. es gibt zum manchmal sogar 5 oder 6 stück, sorry das ist mir vorhin leider entgangen.
trotzdem vielen dank.
die endung ist allerdings immer die selbe. ich werde mal versuchen, ob ich das darüber hinkriege. ich müsste als von der endung ".temp" bis zum ersten "/" zurücklesen. weisst du, über welchen befehl das gehen könnte?
gruß mmax
vielen dank erstmal. das klapp gut. wie du aber geschrieben hast, darf nur ein "/" enthalten sein. bei einigen datensätzen ist das jedoch nicht so, wie ich grad festgestellt habe. es gibt zum manchmal sogar 5 oder 6 stück, sorry das ist mir vorhin leider entgangen.
trotzdem vielen dank.
die endung ist allerdings immer die selbe. ich werde mal versuchen, ob ich das darüber hinkriege. ich müsste als von der endung ".temp" bis zum ersten "/" zurücklesen. weisst du, über welchen befehl das gehen könnte?
gruß mmax
Hallo meinzelmax!
Wenn der Dateiname zwischen dem ersten und zweiten "/" zu finden wäre, dann:
- ansonsten wäre eine genauere Beschreibung der möglichen Zeilenstruktur (bzw konkrete Beispiele) hilfreich ...
[Edit] Um von .temp bis zum ersten "/" zurückzulesen könnte das so gehen:
[/Edit]
Grüße
bastla
Wenn der Dateiname zwischen dem ersten und zweiten "/" zu finden wäre, dann:
for /f "usebackq delims=" %%i in ("D:\Ein Ordner\Ursprugngsbatch.txt") do for /f "tokens=2 delims=/" %%a in ("%%i") do >%%~na.txt echo %%i
[Edit] Um von .temp bis zum ersten "/" zurückzulesen könnte das so gehen:
@echo off & setlocal
set "Ausgangsdatei=Ursprungsbatch.txt"
set "Kennung=.temp"
set "Endung=txt"
for /f "usebackq delims=" %%i in ("%Ausgangsdatei%") do for /f "tokens=1* delims=/" %%a in ("%%i") do set "Name=%%b" & call :ProcessLine "%%i"
goto :eof
:ProcessLine
call set "Rest=%%Name:*%Kennung%=%%"
call set "Dateiname=%%Name:%Kennung%%Rest%=%%"
>%Dateiname%.%Endung% echo %~1
goto :eof
Grüße
bastla
konkrete beispiele sind die hier:
835420/o.doc/i20/000/Erster.Text.temp
~274534:00/uc/Zweiter-Text.temp
dd/e83/023744/jsl/102/Dritter-Text.temp
das ist also schon ziemlich heterogen und der gewünschte dateiname liegt nicht zwischen zwei "/" sondern zwischen einem "/" und einem ".temp".
danke für deine mühe!
835420/o.doc/i20/000/Erster.Text.temp
~274534:00/uc/Zweiter-Text.temp
dd/e83/023744/jsl/102/Dritter-Text.temp
das ist also schon ziemlich heterogen und der gewünschte dateiname liegt nicht zwischen zwei "/" sondern zwischen einem "/" und einem ".temp".
danke für deine mühe!
Hallo meinzelmax!
Soferne der Dateiname immer nach dem letzten "/" folgt, etwa so:
Da Windows auch mit "/" anstatt "\" als Trennzeichen zwischen Pfad und Dateiname zurechtkommt, wird hier einfach die gesamte Zeile als Dateipfad interpretiert und daraus der Dateiname (ohne Typ ".temp") extrahiert.
Grüße
bastla
Soferne der Dateiname immer nach dem letzten "/" folgt, etwa so:
@echo off & setlocal
set "Ausgangsdatei=Ursprungsbatch.txt"
set "Endung=txt"
for /f "usebackq delims=" %%i in ("%Ausgangsdatei%") do >%%~ni.%Endung% echo %%i
Grüße
bastla