killinator007
Goto Top

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ß

Content-ID: 155344

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

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

bastla
bastla 18.11.2010 um 18:52:53 Uhr
Goto Top
Hallo killinator007!
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" face-wink ...

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
Grüße
bastla
micneu
micneu 19.11.2010 um 18:55:01 Uhr
Goto Top
wie soll der dateiname jerder neu erstellten datei sein?

gruß michael
micneu
micneu 19.11.2010 um 19:16:51 Uhr
Goto Top
habe ein powershellscript version erstellt.

#   **************************************************************
#   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    
    }
die dateien habe ich einfach nur durchnummeriert

gruß michael
meinzelmax
meinzelmax 25.06.2011 um 18:53:20 Uhr
Goto Top
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 face-sad
bastla
bastla 25.06.2011 um 20:14:08 Uhr
Goto Top
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:
for /f "usebackq tokens=1-2 delims=/" %%i in ("D:\Ein Ordner\Ursprugngsbatch.txt") do >%%~nj.txt echo %%i/%%j
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 ("%%~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
meinzelmax
meinzelmax 26.06.2011 um 00:18:21 Uhr
Goto Top
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
bastla
bastla 26.06.2011 um 00:23:46 Uhr
Goto Top
Hallo meinzelmax!

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
- 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:
@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
[/Edit]

Grüße
bastla
meinzelmax
meinzelmax 26.06.2011 um 00:35:50 Uhr
Goto Top
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!
bastla
bastla 26.06.2011 um 00:44:42 Uhr
Goto Top
Hallo meinzelmax!

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  
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
meinzelmax
meinzelmax 26.06.2011 um 00:50:36 Uhr
Goto Top
genial!! es scheint für alle einträge meiner logs zu funktionieren.
vielen vielen dank!! und eine gute nacht!!