野暮用で、めっちゃ重たいテキストデータを軽量化したい要求がありました。
データ量をザックリ1/nにする = データ行をn個おきに抽出する
エクセルでテキストを読み込んで、INDEX関数とROW関数の組み合わせて
INDEX(*:*, ROW() * n)
の形でも抽出できます。
しかしエクセルでの読み込み+セル作業がなかなか(メモリ的に)重い作業だったため、
うまくいきませんでした。
とすればbatchでどーんとやれんもんか...と思って組んだものをメモっときます。
■フロー
- 処理したいファイル名を「input.txt」として、「extract.bat」を同一フォルダに入れとく
- 「extract.bat」実行
- 処理をスキップしたい行数(ヘッダ行数)を入力
- 抽出したい行間隔を入力(例:100行おきなら100を入力)
- 出力ファイル「output.txt」が新しく作成される
- 進捗状況は画面に出力される処理済みの行数で確認できる
※処理終了後はただちに入出力ファイルの移動を推奨
※2回目以降の実行でoutput.txtが残っていればoutput_bu.txtとしてバックアップ
■extract.bat
set /P STR_SKIP="最初にスキップする行数(ヘッダ行数)は?: " set /P STR_SPAN="何行おきにデータ抽出する?: " If Exist "output.txt" copy "output.txt" "output_bu.txt" del output.txt set N=0 for /f "tokens=1 skip=%STR_SKIP% delims=" %%A in (input.txt) do ( call :CHK if ERRORLEVEL 1 echo %%A>>output.txt ) goto :EOF :CHK set /a N+=1 , X=N %% %STR_SPAN% if %X%==1 exit /b 1 if %X%==0 echo %N%行目の処理完了 exit /b 0
■input.txt
header1 header2 1 10 2 20 3 30 4 40 5 50 6 60 7 70 8 80 9 90 10 100
■実行結果
最初にスキップする行数(ヘッダ行数)は?:3
何行おきにデータ抽出する?:2
2行目の処理完了
4行目の処理完了
6行目の処理完了
8行目の処理完了
10行目の処理完了
■output.txt
2 20 4 40 6 60 8 80 10 100
処理完了のechoを切れば早くなる。
けどバッチ流した後に生きてるのか死んでるのかわからんですね。うーむ
プログレスバー的なもんを実装できれば精神衛生上よろしいですが、
事足りたのでひとまずOKとします。