graffage

絵、音楽、動画、IT、日常の関心事を書いてます。

絵、音楽、動画、IT、日常、興味のあることを徒然書いていきます。

【バッチ】テキストファイルを指定行おきにデータ抽出する

野暮用で、めっちゃ重たいテキストデータを軽量化したい要求がありました。

データ量をザックリ1/nにする = データ行をn個おきに抽出する

 
エクセルでテキストを読み込んで、INDEX関数とROW関数の組み合わせて

INDEX(*:*, ROW() * n)

の形でも抽出できます。
しかしエクセルでの読み込み+セル作業がなかなか(メモリ的に)重い作業だったため、
うまくいきませんでした。

とすればbatchでどーんとやれんもんか...と思って組んだものをメモっときます。

■フロー
  1. 処理したいファイル名を「input.txt」として、「extract.bat」を同一フォルダに入れとく
  2. 「extract.bat」実行
  3. 処理をスキップしたい行数(ヘッダ行数)を入力
  4. 抽出したい行間隔を入力(例:100行おきなら100を入力)
  5. 出力ファイル「output.txt」が新しく作成される
  6. 進捗状況は画面に出力される処理済みの行数で確認できる

 ※処理終了後はただちに入出力ファイルの移動を推奨
 ※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とします。

© graffage 2014-2022. All Rights Reserved.