2017-09-29 12 views
0

このテキスト文書の各行の最初の単語の後のすべてを削除したいと思います。これは単純な文字の削除のために動作しますが、 "|"テキストファイルの最初の単語の後にすべてを削除するには?

enter image description here

私は次のコードを使用しようとしています:

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 

をしかし、次のエラーが表示されている:

enter image description here

+0

を回答者が自分のコードをテストするためにそれらを単にコピーすることができますので、テキストとしてではなく、画像としてのサンプルデータを挿入してください。.. – aschipfl

答えて

0

変数%search%の即時拡張のために実行しようとしているパイプ文字|が問題です。

可能仕事の前後に引用符を可能に暫定変数の代入(set "line=...")を使用することではありませんので、パイプはもはや認識され、その後、あなたのechoコマンドラインでのみ遅れ拡張を使用する - このように:

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 

もう1つの解決策は、!search!!replace!でも遅延拡張を使用することです。これが機能するためには、直接巣の拡大を遅らせることはできませんので、あなたは、入れ子に行うためにfor /Fループを使用する必要がある - このような:個別にリダイレクトする代わりに

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 

>>)ごとに単一の出力ラインを、あなたも>によって全体for /Fループをリダイレクトすることもできますが、あなたはあなたが読んものとは別のファイルを使用する必要があります - この(上からのみ第一の変形例を示す)を参照してください:

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 

このAをpproachは、特に巨大な入力ファイルの場合は、パフォーマンスの点ではるかに優れています。

+0

こんにちは!ほぼ完璧に動作しましたが、最終結果を保存するのが難しいです。https://imgur.com/9PWtq0a –

+0

このエラーは、ファイル '%txtfile%.txt'が既に存在するため、このエラーが' ren'によって発生したと思います。実際にはファイルの名前を変更する必要はありません。単純に、 '>>"%txtfile%.tmp "'を '>>"%txtfile%.txt "'で置き換えてください... – aschipfl

+0

ありがとう、私は解決しました!問題は、.txtの情報を同じ ".txt"に渡した部分にあったため、保存時にファイルがすでに存在していました。だから、情報を ".tmp"ファイルに書き込んで、後で ".txt"ファイルに移動しなければなりませんでした。 –

0

いくつかの以前のコードを理解した後、私は最終的にこのコードの問題解決:

@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 
関連する問題