バッチ (.bat) ファイルを使用して別のファイルを作成せずにテキスト ファイルを変更する

バッチ (.bat) ファイルを使用して別のファイルを作成せずにテキスト ファイルを変更する

次のテキスト ファイルがあるとします。

1234567890123456789012345678901234567890123456789012345678901234567890
_________1_________2_________3_________4_________5_________6_________7
*0000000000003000345800185000000000000002052017108018010009990
*000000000000302082890010000000000T SECTEUR SANITAIRE JIJEL  1
*000000000000306758680008500000000TIC ZIAMA MANSOURIAH       1

ヘッダーとすべての行には 62 文字が含まれています。ヘッダーの 42 の位置から見てみると、02201702現在の月、2017は年であることがわかります。48 の位置から 62 の位置 (つまり の後) には、 14 個の値 ( ) と(ゼロ)052017があります。108018010009990

最後の行には、他の行と同じではない内容が含まれています。

同じ構造のファイルが複数あるとします。ヘッダーの日付を現在の日付に設定したいとします (現在は 2019 年 8 月なので、 ではなく082019ヘッダーに取得します052017)。日付 ( 052017) の後の、後続の値 (この場合は ( 10801801000999)) を削除し、スペースに置き換えて値 (0) を保持し、ヘッダーが 62 文字を維持するようにします。この作業を行うコード (バッチ ファイル: .bat) の作成を手伝ってくれる人はいますか? 特に、テキスト ファイルが複数あり、それぞれに 5000 行以上含まれている場合はなおさらです。

答え1

次のバッチは

  • 現在のフォルダ内のファイル *.txt を反復処理します。
  • オリジナルの名前を.bak拡張子に変更します
  • ヘッダーを読み取り、変更して元の名前に書き込む
  • 保存したファイルの残りをコピーする

ちなみに、SuperUser はスクリプト作成サービスではないので、
独自の調査とコーディングの試みがもう少し必要になるかもしれません。

:: Q:\Test\2019\08\16\SU_1472064.cmd
@Echo off
:: Get MonthYear
for /f "usebackq" %%A in (`
  powershell -NoP -C "(Get-Date).ToString('MMyyyy')"
`) Do Set MonthYear=%%A

:: iterate .txt files in current folder
For /f "delims=" %%F in ('Dir /B /O-D *.txt') Do Call :sub "%%~F"
Echo Job done

Goto :Eof

:Sub filename
:: Rename original file to .bak extension
Ren %1 "%~1.bak"
:: read header line
Set /p "Header=" <"%~1.bak"
Echo 1234567890123456789012345678901234567890123456789012345678901234567890
Echo _________1_________2_________3_________4_________5_________6_________7
Echo %Header%
Set "NewHeader=%Header:~0,41%%MonthYear%              0"
Echo %NewHeader%
(Echo %NewHeader%
 More +1 "%~1.bak"
) > %1

サンプル出力:

> SU_1472064.cmd
1234567890123456789012345678901234567890123456789012345678901234567890
_________1_________2_________3_________4_________5_________6_________7
*0000000000003000345800185000000000000002052017108018010009990
*0000000000003000345800185000000000000002082019              0
Job done

関連情報