2017-09-29 3 views
0

Ich möchte alles nach dem ersten Wort in jeder Zeile dieses Textdokuments entfernen. Es funktioniert für einfache Zeichenentfernung, funktioniert aber nicht, wenn ich versuche, das "|" der Textdatei.Wie alles nach dem ersten Wort zu entfernen?

enter image description here

Ich versuche, den folgenden Code zu verwenden:

setlocal enableextensions disabledelayedexpansion 

set /p txtfile=Text File Name: 
    Echo. 
set /p "search=Search for: " 
    Echo. 
set /p "replace=Replace to: " 

    for /f "delims=" %%i in ('type "%txtfile%.txt" ^& break ^> "%txtfile%.txt" ') do (
     set "line=%%i" 
     setlocal enabledelayedexpansion 
     >>"%txtfile%.tmp" echo(!line:%search%=%replace%! 
     endlocal 
    ) 

    ren "%txtfile%".tmp "%txtfile%".txt 

pause 

Aber der folgende Fehler erscheint:

enter image description here

+0

Bitte geben Sie die Beispieldaten als Text und nicht als Bild, so Beantworter sie einfach ihren Code zum Testen kopieren .. – aschipfl

Antwort

0

Das Problem ist das Pipe-Zeichen |, das aufgrund der sofortigen Erweiterung der Variablen %search% ausgeführt werden soll.

Eine mögliche Behelfslösung ist eine Zwischen variable Zuordnung zu verwenden (set "line=..."), die Anführungszeichen erlaubt, so dass das Rohr nicht mehr erkannt wird, und dann in Ihrem echo Kommandozeile nur verzögert Expansion zu verwenden - wie folgt aus:

setlocal EnableExtensions DisableDelayedExpansion 

set /P txtfile="Text File Name: " 
echo/ 
set /P search="Search for: " 
echo/ 
set /P replace="Replace to: " 

for /F "delims=" %%i in ('type "%txtfile%.txt" ^& break ^> "%txtfile%.txt"') do (
    set "line=%%i" 
    setlocal EnableDelayedExpansion 
    set "line=!line:%search%=%replace%!" 
    >>"%txtfile%.txt" echo(!line! 
    endlocal 
) 

pause 
endlocal 

Eine andere Lösung verzögerte Expansion ist auch für !search! und !replace! zu verwenden; Damit dies funktioniert, können Sie nicht direkt Nest Erweiterung verzögert, so benötigen Sie eine for /F Schleife zu verwenden, die Verschachtelung zu tun - wie folgt aus: Linie

setlocal EnableExtensions DisableDelayedExpansion 

set /P txtfile="Text File Name: " 
echo/ 
set /P search="Search for: " 
echo/ 
set /P replace="Replace to: " 

for /F "delims=" %%i in ('type "%txtfile%.txt" ^& break ^> "%txtfile%.txt"') do (
    set "line=%%i" 
    setlocal EnableDelayedExpansion 
    for /F "delims=" %%j in ("!search!=!replace!") do (
     >>"%txtfile%.txt" echo(!line:%%j! 
    ) 
    endlocal 
) 

pause 
endlocal 

Statt Umleitung (>>) jede einzelne Ausgabe einzeln Sie könnte auch die ganze for /F Schleife durch >, leiten aber dann müssen Sie eine andere Datei als die, die Sie lesen verwenden - siehe diese (zeigt nur die erste Variante von oben):

setlocal EnableExtensions DisableDelayedExpansion 

set /P txtfile="Text File Name: " 
echo/ 
set /P search="Search for: " 
echo/ 
set /P replace="Replace to: " 

> "%txtfile%.tmp" (
    for /F "usebackq delims=" %%i in ("%txtfile%.txt") do (
     set "line=%%i" 
     setlocal EnableDelayedExpansion 
     set "line=!line:%search%=%replace%!" 
     echo(!line! 
     endlocal 
    ) 
) 

move /Y "%txtfile%.tmp" "%txtfile%.txt" > nul 

pause 
endlocal 

Dies ist ein pproach ist im Hinblick auf die Leistung viel besser, insbesondere bei großen Eingabedateien.

+0

Hallo! es funktionierte fast perfekt, aber es hat Schwierigkeiten beim Speichern des Endergebnisses, siehe: https://imgur.com/9PWtq0a –

+0

Ich vermute, dass dieser Fehler durch 'ren' verursacht wird, da die Datei'% txtfile% .txt' bereits existiert; eigentlich müssen Sie keine Datei umbenennen, ersetzen Sie einfach ">>"% txtfile% .tmp "' in der Schleife durch '>>"% txtfile% .txt "' ... – aschipfl

+0

Danke, ich habe es gelöst! Das Problem war in einem Teil, dass er die Informationen der .txt an die gleiche ".txt" weitergegeben hat, so dass die Datei zum Zeitpunkt des Speicherns bereits existierte. Also musste ich die Informationen einfach in eine ".tmp" Datei schreiben, um danach zu einer ".txt" Datei zu wechseln. –

0

Nach einigen vorherigen Codes zu verstehen, das ich löse endlich das Problem mit diesem Code:

@Echo off 

setlocal EnableExtensions DisableDelayedExpansion 

set /P txtfile="Text File Name: " 
echo/ 
set /P search="Search for: " 
echo/ 
set /P replace="Replace to: " 

for /F "delims=" %%i in ('type "%txtfile%.txt" ^& break ^> %txtfile%.tmp') do (
    set "line=%%i" 
    setlocal EnableDelayedExpansion 
    set "line=!line:%search%=%replace%!" 
    >> %txtfile%.tmp echo(!line! 
    endlocal 
) 

ren %txtfile%.tmp CleanText.txt 

pause 
endlocal 
Verwandte Themen