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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qバッチでテキストファイルから任意の行のみ取得したい

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数Textに入れる(set Text=222)
4.変数Textを使用し色々処理をする
-----------------------------------------
コレを繰り返します。
2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。
n行目を全て取り出す方法がわかれば行けると思うのですが、
どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数T...続きを読む

Aベストアンサー

No3ですが、たぶん提示したスクリプトを見ると、ある事に気がつくはず?

findstr /n /r "." a.txt | findstr /r "^3:"

で3行目を表示してくれます。え!? それだけ。そうなんです

ただ、あと、先頭の”3:” をどうやって切り離すか? と言う問題にぶつかる。さらにファイルに先頭に”3:”があった場合、どうするのか? さらに、findstr の正規表現の動作が??? 表示すれるのはいいが、変数にどうやってセットするのか?

となる。結局 for 文を使いまわす事になります。

まあ、適当に改変して、上記の問題を解決してください。

Qnslookupを5分おきに実行するバッチファイルの作成

初めまして。
システムの運用・管理を行っている者です。
よろしくお願い致します。
このたび、windows上で動作するバッチファイルの作成を初めて行うのですが、ネット上で色々調べても解決へなかなか向かいません。
以下の内容のバッチファイルの作成です。

nslookupコマンドを5分間隔で実行する。

以上です。
バッチファイルの作成の仕方などはもちろんわかっているのですが、どのように記述すればよいのかわかりません。
ご教授下さい。よろしくお願い致します。

Aベストアンサー

標準のコマンドには、一定時間待つというコマンドがありません。
なので、そういうコマンドをインストールするか作る必要があります。
VBScript を使うとSleep というコマンドが使えますから、
バッチから呼び出すようにするか、
VBScript で「nslookupコマンドを5分間隔で実行する。」
とするようにすればいいと思います。

参考URL:http://okwave.jp/kotaeru.php3?qid=1573768

Qtxtファイルから特定の文字列が書かれた行だけを取得や削除するソフト

txtファイルで
特定の文字列が書かれた行だけを
取得や削除するソフトや方法を探しています。
フリーで無いなら、シェアウェアなどになってもかまいません

例えば
(12)と書かれた文字列がある行だけを抜きだしたり
逆に(12)と書かれた文字列がある行だけを削除したり
したいです。

そのソフトの操作方法も教えてくださると助かります。

では、回答を心よりお待ちしております。

Aベストアンサー

NoEditor
http://www.vector.co.jp/soft/winnt/writing/se300436.html

というフリーのテキストエディタをインストールすると、YokkaGrepというソフトがセットでインストールされます。

検索ディレクトリ、検索文字列(正規表現も可)、ファイル名(ワイルドカードで複数のファイルの検索も可)などをセットして検索できます。

検索結果をテキストファイルやcsvファイルに出力することや、検索文字列を含む行を削除などの機能もあります。

grepで検索すると、他にも似たような機能のソフトがあると思いますが、NoEditor付属のYokkaGrepは、お勧めです。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Qバッチファイル 文字列にスペースがある場合

for /f %%A in ('dir /b /s c:\a aa*.pdf') do copy "%%A" D:\

これはcドライブのa aaというフォルダ名の中を検索するコードですが、
フォルダ名にスペースがあるため、うまく動きません。

"a aa"のように""で囲ってみましたが、駄目でした。

どうすれば良いのか、教えていただきたいので、お願いします。

Aベストアンサー

for /f %%A in ('dir /b /s c:\"a aa"\*.pdf') do echo copy "%%A" D:\
のようにecho でどのようなコマンドが実行されているか確認しましょう。

この記述ではdirコマンドで表示されるパスの中に空白があるため %%A には空白までの文字列しか代入されません。
以下のように修正して試してみてください。

for /f "delims=" %%A in ('dir /b /s c:\"a aa"\*.pdf') do copy "%%A" D:\

QDOSのバッチで、テキストファイル中の文字を置換したい

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
:この1行下の acb=xyz に置換前と置換後の文字列を指定する。
set l=%line:abc=xyz%
echo %l%>>%fname%
goto :EOF

:end
======================

これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。

これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に

set mae=abc
set ato=xyz

の2行を加え、変数に値を設定するようにしました。

ところが、次の1行の書き変え方がわかりません。

set l=%line:abc=xyz%



set l=%line:%abc%=%xyz%%

のように変えてみましたが、うまく動きません。

どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
...続きを読む

Aベストアンサー

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つの%に置き換えられます。

例)echo 10割は100%%
10割は100%


◆今回の場合

call set l=%%line:%mae%=%ato%%%
↓実行されるときに以下のように置き換えられます。
call set l=%line:abc=xyz%

置き換え後に call 文が実行されます。このcall文の記述だと set l=%line:abc=xyz% という1行のバッチを呼び出しているのと同等の動作になります。従って環境変数lineに入っている文字列のabcがxyzに置き換えられた結果が環境変数lに代入されます。
call文でワンクッション置いて、先に環境変数の mae と ato (と%%)だけ評価(環境変数の中身に置き換え)するようにしています。

◆単純に set l=%line:%mae%=%ato%% とした場合なぜうまくいかないか

set文の右辺の各要素を分けて書くと

%line:%(line: という環境変数の中身)→そんな変数は定義していないので空に置き換え

mae

%=%(= という環境変数の中身)→そんな変数は定義できないので空に置き換え

ato

%% → % に置き換え

と解釈されて
環境変数lには maeato% という文字列が代入されてしまいます。


余談ですがバッチ実行時にどのように置き換えられるか見たい場合は、
バッチ先頭のecho offの行を取って実行するとよく分かります。

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つ...続きを読む

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

Q特定のフォルダ内のある種類のファイルをすべてコピーし格納する方法

WINDOWSマシン使用。
あるフォルダ(AAA)の中に、複数のフォルダやファイルを含み、またそのフォルダは、
は、下位のフォルダやファイルを含むという関係が続きます。階層は4くらい。
この中の各所にあるフォルダにはwordのファイルやその他のファイルを含んで
います。
このwordのファイルだけをすべて選択しコピーして、別のフォルダ(BETU)へ
入れたい。
簡単に行なう方法、あるいはツールなどあれば紹介をお願いします。

Aベストアンサー

はじめまして。

コマンドプロンプトで
for /f "tokens=*" %i in ('dir /b /s AAA\*.doc') do copy "%i" "BETU"
を実行すれば4階層以上深くても可能です。

※"%i" "BETU"と"でくくるのは、ディレクトリ名に空白がある場合エラーとなるのを防ぐためです。

AAAもBETUもフルパスで記述すればコマンド実行ディレクトリは何処でも構いません。

Qバッチでファイルの内容の比較結果からgotoしたい

「もし、A.txtの中に記述されている内容が、B.txtの中に記述されている内容と等しい時、
AAAにジャンプし、
そうでない場合、BBBにジャンプする」
と言うようなコマンドを書きたいのですが、行き詰まっています。

リダイレクトや比較演算子を使用して作ろうと考えていたのですが、
$>type A.txt
では正常に表示される文字列も、
A.txtとB.txtをtypeして両者がequかどうか条件分岐させようとするとうまく行きませんでした。

何か良い方法はないでしょうか?

Aベストアンサー

FCコマンドを使うと、
比較しているファイルが一致していれば%errorlevel%が0、
比較しているファイルが不一致ならば%errorlevel%が2になります。

これをつかえば分岐が書けます。

とりあえずサンプルとして
fc a.txt b.txt
if %errorlevel%==0 goto AAA
if %errorlevel%==2 goto BBB
goto END
:AAA
echo 一致
goto END
:BBB
echo 不一致
:END
といったところでしょうか

Qバッチファイルで2つ以上の変数を連結し、1つの変数にしたい。

Windows2000でバッチファイルを作っています。
バッチファイルが受け取る2つのパラメータを %1 %2とすると、
それを連結して、新たな変数 A を作りたいのですが、どのようにすれば良いのでしょうか。

Aベストアンサー

SETで変数にパラメータをセットすればOKだと思います。

例)
SET A=%1%2
echo %A%


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報