データベースにロードする必要があるファイルがあります。パイプ(|
)の区切り文字がありますが、各行には異なる数のパイプが含まれています。バッチ スクリプトを使用して、各行からパイプを削除し、各行に同じ数のパイプを配置するにはどうすればよいですか?
ファイルの例:
1|2|3||||||
4|5|6|||
7|8||||||
各行に 5 つのパイプのみが必要で、次のようになるとします。
1|2|3|||
4|5|6|||
7|8||||
データベースにロードする必要があるファイルがあります。パイプ(|
)の区切り文字がありますが、各行には異なる数のパイプが含まれています。バッチ スクリプトを使用して、各行からパイプを削除し、各行に同じ数のパイプを配置するにはどうすればよいですか?
ファイルの例:
1|2|3||||||
4|5|6|||
7|8||||||
各行に 5 つのパイプのみが必要で、次のようになるとします。
1|2|3|||
4|5|6|||
7|8||||
更新 2 番目の解決策と制限の更新を参照してください。
file.txt の内容の例
A|B|C|D|E|F|G
1|2|3|4|5|6|7
!|@|#|$|%|^|&
]1|]2|]3|]4|]5|]6|]7
|Two||Four||||Eight
!@$%^&%^*(){}|[]';/.,<>/|
Lonely||||||||||||||||||
Sep|er|ate| From| Th|e |W||orld | |
最初の解決策
これがあなたが望むことをする簡単な方法です。特殊文字に問題はないはずです。
制限事項
%%A to %%Y
]
。for /F "tokens=1,* delims=]" %%Y in ('type file.txt ^| find /v /n ""') do (
たfor /F "delims=" %%Z in ('type file.txt') do (
。保持する列の数と列を指定するだけです。たとえば、tokens=3-5,12,48-50
列 3、4、5、12、48、49、50 のみを選択します。必要な出力に一致するように変数を追加または削除してください。echo %%A^|%%B^|%%D^|%%C^|%%G^|%%E^|%%F
. 列は、echo ステートメントでも並べ替えることができることに注意してください。
@echo off
setlocal DisableDelayedExpansion
for /F "delims=" %%Z in ('type file.txt') do (
for /F "tokens=1-5 delims=|" %%A in ("%%Z") do (
echo %%A^|%%B^|%%C^|%%D^|%%E
)
)
endlocal
pause >nul
.bat ファイルの出力を新しいファイルにリダイレクトするか、echo 行Script.bat>output.txt
に追加して echo コマンドをファイルに出力することができます>>output.txt
。
出力例:
A|B|C|D|E
1|2|3|4|5
!|@|#|$|%
]1|]2|]3|]4|]5
Two|Four|Eight|| <-- Note that this line exhibits limit 3.
!@$%^&%^*(){}|[]';/.,<>/|||
Lonely||||
Sep|er|ate| From| Th
2 番目のソリューション
制限事項1と4のみを共有します。現在、既存の空白の列にスペースを追加して、すべての列を保持します。これらはさらにコードを変更することで削除できますが、OP が希望しない限り追加しません。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "delims=" %%Z in ('type file.txt') do (
set "xLine=|%%Z"
call :Parse xLine
)
endlocal
pause >nul
goto :eof
:Parse
call set "xLine=%%%~1:||=| |%%"
for /F "tokens=1-5 delims=|" %%A in ("%xLine%") do (
echo %%A^|%%B^|%%C^|%%D^|%%E
)
goto :eof
出力例:
A|B|C|D|E
1|2|3|4|5
!|@|#|$|%
]1|]2|]3|]4|]5
|Two| |Four|
!@$%^&%^*(){}|[]';/.,<>/|||
Lonely| | | |
Sep|er|ate| From| Th
このプロセスを直接達成する方法はないため、各行のパイプの数をカウントするには、各文字を修正する必要があります。動作しますが、やや遅いです。
@echo off
setlocal EnableDelayedExpansion
rem Number of desired pipes
set limit=5
for /F "delims=" %%a in (input.txt) do (
set "line=%%a"
rem Get position of last character
set last=0
for /L %%b in (12,-1,0) do (
set /A "last|=1<<%%b"
for %%c in (!last!) do if "!line:~%%c,1!" equ "" set /A "last&=~1<<%%b"
)
rem Copy each character to result, but just %limit% number of pipes
set pipes=0
set result=
for /L %%c in (0,1,!last!) do (
if "!line:~%%c,1!" neq "|" (
set "result=!result!!line:~%%c,1!"
) else (
set /A pipes+=1
if !pipes! leq %limit% set "result=!result!|"
)
)
echo !result!
)
入力行に感嘆符が含まれていると、前のプログラムは失敗します。
出力:
1|2|3|||
4|5|6|||
7|8||||
アントニオ