プロが教えるわが家の防犯対策術!

WindowsXPのコマンドプロンプト(バッチ)でテキストファイル(改行あり)から100行間隔でデータを抽出する方法を教えてください。
300行ある場合、1行目、101行目、201行目を抽出したいです。宜しくお願いします。

A 回答 (4件)

@echo off


set N=0
for /f "delims=" %%A in (input.txt) do (
call :CHK
if ERRORLEVEL 1 echo %%A
)
goto :EOF
:CHK
set /a N+=1 , X=N %% 100
if %X%==1 exit /b 1
exit /b 0
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。ご説明不足もあったかと思うのですが、イメージにとても近い回答をいただきました。
以下に出来上がったものを添付いたします。他の方のお役にも立てばと思います。

@echo off
::<コメント開始>
:: 「テキストファイルからサンプリングファイルを抽出するバッチプログラム」
:: 1.目的
::   テキストファイル(SJISコードで改行ありのみ対応)のうちサンプリングで
:: ***行に1行を抽出する。
::   100行単位に指定した場合、1行目(ヘッダー行)、101行目、201行目、・・・・・
:: 2.使い方と説明
::  @echo off
::  →画面表示しない
::  del output.txt
::  →アウトプットファイルを作業前に削除
::  set N=0
::  for /f "tokens=1 delims=" %%A in (input.txt) do (
::  →tokens=1は1行を1つの塊として扱うの意味
::   delims=は区切り文字なしの意味
::   input.txtはインプットファイル
::   ネットワーク経由の場合例:\\172.16.***.***\data\input.txtなど
:: (事前にクライアントから相手の該当フォルダにアクセスできている必要がある)
::  call :CHK
::  →サブルーチンをコール(:CHKに飛ぶ)
::  if ERRORLEVEL 1 echo %%A>>output.txt
::  →サブルーチンからの戻り値が1だったらoutput.txtに書き込む
::  )
::  goto :EOF
::  →ファイルを読み終えたらEOFに行く
::
::  以下はサブルーチン
::  :CHK
::  set /a N+=1 , X=N %% 100
::  →Nに1を足し、100で割った余りをXにセットする
::  if %X%==1 exit /b 1
::  exit /b 0
::  →exitで「/b」が指定されている場合、ERRORLEVEL にその数値を設定し、
:: for文に戻る。
::<コメント終了>

del output.txt
set N=0
for /f "tokens=1 delims=" %%A in (\\172.16.***.***\data\input.txt) do (
call :CHK
if ERRORLEVEL 1 echo %%A>>output.txt
)
goto :EOF
:CHK
set /a N+=1 , X=N %% 100
if %X%==1 exit /b 1
exit /b 0

お礼日時:2011/04/28 13:09

すみません最初の1行目がなかったですね



for /f "usebackq tokens=1,* delims=:" %a in (`findstr /n /r "^" a.txt ^| findstr /r "^1: ^[0-9]*[0-9]01:"`) do @echo a=[%a] b=[%b]
    • good
    • 0
この回答へのお礼

追記ありがとうございます。

お礼日時:2011/04/28 13:05

もうちょっと汎用性あり、



デバック用
for /f "usebackq tokens=1,* delims=:" %a in (`findstr /n /r "^" a.txt ^| findstr /r "^[0-9]*[0-9]01:"`) do @echo a=[%a] b=[%b]

該当行出力
for /f "usebackq tokens=1,* delims=:" %a in (`findstr /n /r "^" a.txt ^| findstr /r "^[0-9]*[0-9]01:"`) do @echo %b

バッチファイル用
for /f "usebackq tokens=1,* delims=:" %%a in (`findstr /n /r "^" a.txt ^| findstr /r "^[0-9]*[0-9]01:"`) do @echo %%b

と言うことで、a.txtを対象となるファイル名にしてください
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。いろいろなやり方があるものですね!

お礼日時:2011/04/28 13:04

For /F "usebackq delims=: tokens=1,*" %i In ( `Findstr /N ".*" hoge.txt^|Findstr "^1: ^101: ^201:"` ) Do Echo %j



hoge.txtが抽出するファイル名。
バッチにするなら%%iと%%jに。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。いろんな方法があるものですね!

お礼日時:2011/04/28 13:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています