0

データベースにロードする必要があるファイルがあります。パイプ(|)の区切り文字がありますが、各行には異なる数のパイプが含まれています。バッチ スクリプトを使用して、各行からパイプを削除し、各行に同じ数のパイプを配置するにはどうすればよいですか?

ファイルの例:

1|2|3||||||  
4|5|6|||  
7|8||||||  

各行に 5 つのパイプのみが必要で、次のようになるとします。

1|2|3|||  
4|5|6|||  
7|8||||
4

2 に答える 2

2

更新 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 | |

最初の解決策

これがあなたが望むことをする簡単な方法です。特殊文字に問題はないはずです。

制限事項

  1. 現在書かれているように、最大​​ 24 25 列しかサポートしていません。%%A to %%Y
  2. 最初の値は で始まらない場合があります]に置き換えられましfor /F "tokens=1,* delims=]" %%Y in ('type file.txt ^| find /v /n ""') do (for /F "delims=" %%Z in ('type file.txt') do (
  3. 「空の」フィールドは、各行の最後にのみ表示されます。2 番目の解決策を参照してください。
  4. ファイル内の空白行を保持しません。(これは、必要に応じて修正できます。)

保持する列の数と列を指定するだけです。たとえば、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 番目のソリューション

制限事項14のみを共有します。現在、既存の空白の列にスペースを追加して、すべての列を保持します。これらはさらにコードを変更することで削除できますが、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
于 2013-01-10T03:43:28.363 に答える
1

このプロセスを直接達成する方法はないため、各行のパイプの数をカウントするには、各文字を修正する必要があります。動作しますが、やや遅いです。

@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||||

アントニオ

于 2013-01-09T23:06:07.787 に答える