[前の記事]« 「イベントログの各行のデータを変数に割り当ててコマンドを実行」をテキストファイルの行数分繰り返したい
[次の記事]多数のサブディレクトリ内のファイルを一括コピーするには »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FOR /F」索引へ

「テキストファイルの特定行から複数の文字列を抽出して処理実行」を行数分繰り返したい

1577.
複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す
2007年01月05日(金) 17時53分
くま
たびたびの投稿ですみません。

今回の質問は、複合技です。

テキストの特定行から1行を読み込み、複数の文字列を、変数に入れ、処理実行し、これを行がなくなるまで繰り返すというものです。

テキストの中身は、
1行目-----------
2行目文字列(説明文)
3行目文字列(説明文)
4行目-----------
5行目タイトル      タイトル      タイトルタイトル
6行目 aaa          bbbb          ccc     dddd
以降同じ

こんな感じです。

処理としては、
6行目がスタートで、
6行目の「aaa」を変数iに、「bbbb」をjに、「ccc」をkに、「dddd」をlに入れ、
コマンドXXXの引数として、XXX 'aaa' 'bbbb' 'ccc' 'dddd'
と入れ
そして、「aaa」については、「aaa1」の場合「yyyy」を引数にセットし、
「aaa2」の場合「zzzz」をセットします。
その後、実行し、
7行目の処理に移行します。
最終行の判別も、微妙に分からないので、
出来たら、教えてください。

・・DOSバッチで作らないでいいなら、簡単なんですが・・・
1581.
Re:複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す
2007年01月06日(土) 08時56分
ラシャン
こんな感じでどうでしょう?
-----------------------------------------------------------
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-4 skip=5" %%i in (test.txt) do (
if "%%l"=="" goto :EOF
set CHK=%%i
if "%%i"=="aaa1" set CHK=yyyy
if "%%i"=="aaa2" set CHK=zzzz
XXX '!CHK!' '%%j' '%%k' '%%l'
rem XXX '%%i' '%%j' '%%k' '%%l' '!CHK!'
)
-----------------------------------------------------------


>そして、「aaa」については、「aaa1」の場合「yyyy」を引数にセットし、
>「aaa2」の場合「zzzz」をセットします。

条件に一致した場合に引数を置換するのか、追加するのかが不明でしたので
置換であればそのまま、追加であれば8行目を削除して9行目の「rem 」を
消して下さい。


>最終行の判別も、微妙に分からないので、
>出来たら、教えてください。

6行目から最終行まで、ずっと同じパターンであれば判別の必要は無いです。

最終行が違うパターンで、引数として渡したくないということであれば
例のように「%%l」が空であれば処理を抜けるとか、最終行に決まった文字列が
あれば、それを使って判別してもいいかもしれません。

1591.
Re:複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す
2007年01月09日(火) 10時08分
くま
ありがとうございます。
こうやってみると、分かりやすかったです。


>こんな感じでどうでしょう?
>-----------------------------------------------------------
>@echo off
>setlocal enabledelayedexpansion
>for /f "tokens=1-4 skip=5" %%i in (test.txt) do (
>if "%%l"=="" goto :EOF
>set CHK=%%i
>if "%%i"=="aaa1" set CHK=yyyy
>if "%%i"=="aaa2" set CHK=zzzz
>XXX '!CHK!' '%%j' '%%k' '%%l'
>rem XXX '%%i' '%%j' '%%k' '%%l' '!CHK!'
>)
>-----------------------------------------------------------
>
>
>>そして、「aaa」については、「aaa1」の場合「yyyy」を引数にセットし、
>>「aaa2」の場合「zzzz」をセットします。
>
>条件に一致した場合に引数を置換するのか、追加するのかが不明でしたので
>置換であればそのまま、追加であれば8行目を削除して9行目の「rem 」を
>消して下さい。
>
>
>>最終行の判別も、微妙に分からないので、
>>出来たら、教えてください。
>
>6行目から最終行まで、ずっと同じパターンであれば判別の必要は無いです。
>
>最終行が違うパターンで、引数として渡したくないということであれば
>例のように「%%l」が空であれば処理を抜けるとか、最終行に決まった文字列が
>あれば、それを使って判別してもいいかもしれません。
>


1594.
Re:複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す
2007年01月09日(火) 18時01分
くま
!AAA!の遅延展開が、どうも難しく、時間も少ないので、
別の方法でいくことにして、
別途、時間を作ってやることにしました。
ありがとうございました。


一応、別の方法として
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-4 skip=5" %%i in (test.txt) do (
if "%%l"=="" goto :EOF
if "%%i"=="aaa1" (XXX 'yyyy' '%%j' '%%k' '%%l')
if "%%i"=="aaa2" (XXX 'zzzz' '%%j' '%%k' '%%l')
)
こんな感じで、直接はXXXを発行するようにしました。
ちょっと不恰好ですが、
余裕のあるスケジュールでもなかったので、
教えていただいた方法は、別の時間を作って、
勉強させていただきたいと思います。
有難う御座いました。

>コマンドラインに置き換えです。
>なので、そのまま、CHKをIFで置き換えて、
>XXX '!CHK!' '%%j' '%%k' '%%l'
>になります。
>
>早速テストしてみましたが、質問です。
>tokens1が日本語の場合でも出来るのでしょうか?
>たとえば、”エラー”や、”警告”とかです。
>あと、「!CHK!」は、「%CHK%」と違うのでしょうか?
>
>
>>こんな感じでどうでしょう?
>>-----------------------------------------------------------
>>@echo off
>>setlocal enabledelayedexpansion
>>for /f "tokens=1-4 skip=5" %%i in (test.txt) do (
>>if "%%l"=="" goto :EOF
>>set CHK=%%i
>>if "%%i"=="aaa1" set CHK=yyyy
>>if "%%i"=="aaa2" set CHK=zzzz
>>XXX '!CHK!' '%%j' '%%k' '%%l'
>>rem XXX '%%i' '%%j' '%%k' '%%l' '!CHK!'
>>)
>>-----------------------------------------------------------
>>
>>
>>>そして、「aaa」については、「aaa1」の場合「yyyy」を引数にセットし、
>>>「aaa2」の場合「zzzz」をセットします。
>>
>>条件に一致した場合に引数を置換するのか、追加するのかが不明でしたので
>>置換であればそのまま、追加であれば8行目を削除して9行目の「rem 」を
>>消して下さい。
>>
>>
>>>最終行の判別も、微妙に分からないので、
>>>出来たら、教えてください。
>>
>>6行目から最終行まで、ずっと同じパターンであれば判別の必要は無いです。
>>
>>最終行が違うパターンで、引数として渡したくないということであれば
>>例のように「%%l」が空であれば処理を抜けるとか、最終行に決まった文字列が
>>あれば、それを使って判別してもいいかもしれません。
>>
>
>


1598.
有難う御座います。
2007年01月10日(水) 11時16分
くま
有難う御座いました。
教えていただいたソースを参考に作ってみました。

FOR /f "tokens=1-5 skip=9" %%i in (test.txt) do (
IF %%i=="" EXIT 0
IF "%%i"=="aaa1" (XXX 'aaa' 'yyyy' 'ccc' 'dddd' '%%m' >>log.txt)
IF "%%i"=="aaa2" (XXX 'aaa' 'zzzz' 'ccc' 'dddd' '%%m' >>log.txt)

不恰好だと思いますが、今の自分で理解説明できるのは、
この程度が精一杯かと^^;;;

あと、おそらく基本中の基本と思うのですが、
リダイレクトで、
test.bat>test.log 2>&1
で、標準エラー込みの出力がされると思うのですが、
ちょっと物足りないというか、
コマンド上でのエラー(たとえばFINDで見つからないときとか)の
エラーは、表示されないのでしょうか?
テストしてみると出てないのですが・・・
あと、ログ側に、環境変数 test.batが、宣言されていませんとでるのですが、
なにか抜けてますでしょうか?・・・




>こんな感じでどうでしょう?
>-----------------------------------------------------------
>@echo off
>setlocal enabledelayedexpansion
>for /f "tokens=1-4 skip=5" %%i in (test.txt) do (
>if "%%l"=="" goto :EOF
>set CHK=%%i
>if "%%i"=="aaa1" set CHK=yyyy
>if "%%i"=="aaa2" set CHK=zzzz
>XXX '!CHK!' '%%j' '%%k' '%%l'
>rem XXX '%%i' '%%j' '%%k' '%%l' '!CHK!'
>)
>-----------------------------------------------------------
>
>
>>そして、「aaa」については、「aaa1」の場合「yyyy」を引数にセットし、
>>「aaa2」の場合「zzzz」をセットします。
>
>条件に一致した場合に引数を置換するのか、追加するのかが不明でしたので
>置換であればそのまま、追加であれば8行目を削除して9行目の「rem 」を
>消して下さい。
>
>
>>最終行の判別も、微妙に分からないので、
>>出来たら、教えてください。
>
>6行目から最終行まで、ずっと同じパターンであれば判別の必要は無いです。
>
>最終行が違うパターンで、引数として渡したくないということであれば
>例のように「%%l」が空であれば処理を抜けるとか、最終行に決まった文字列が
>あれば、それを使って判別してもいいかもしれません。
>


1599.
Re:有難う御座います。
2007年01月10日(水) 11時39分
otn
>リダイレクトで、
>test.bat>test.log 2>&1
>で、標準エラー込みの出力がされると思うのですが、
>ちょっと物足りないというか、
>コマンド上でのエラー(たとえばFINDで見つからないときとか)の
>エラーは、表示されないのでしょうか?

FINDで見つからないのは別にエラーではないです。
ERRORLEVEL が1になるのでエラーじゃないかといわれると反論できませんが、他のOSではリターンコードとか完了コードとか終了コードとか呼ばれており非ゼロは必ずしもエラーを意味しません。
見つからないときにメッセージを出したければERRORLEVELで判断して自分で出すしかない。

>あと、ログ側に、環境変数 test.batが、宣言されていませんとでるのですが、
>なにか抜けてますでしょうか?・・・

echoをoffにしないで表示されるコマンドを見ればわかると思います。

「set test.bat」を実行すると、
「環境変数 test.bat が定義されていません」
が出ますが、これかな?
1603.
Re:有難う御座います。
2007年01月10日(水) 17時10分
くま
リダイレクトについては、判りました。
それぞれ、メッセージを付加しなきゃいけないと言う事で、
echo "○○○○○">XXX.txt
として書き込みました。
有難う御座います。

まだ微妙なのは、環境変数の方です。
ECHO ONにしても、出てこなかったのですが・・・

あ、環境はXPです。

>>リダイレクトで、
>>test.bat>test.log 2>&1
>>で、標準エラー込みの出力がされると思うのですが、
>>ちょっと物足りないというか、
>>コマンド上でのエラー(たとえばFINDで見つからないときとか)の
>>エラーは、表示されないのでしょうか?
>
>FINDで見つからないのは別にエラーではないです。
>ERRORLEVEL が1になるのでエラーじゃないかといわれると反論できませんが、他のOSではリターンコードとか完了コードとか終了コードとか呼ばれており非ゼロは必ずしもエラーを意味しません。
>見つからないときにメッセージを出したければERRORLEVELで判断して自分で出すしかない。
>
>>あと、ログ側に、環境変数 test.batが、宣言されていませんとでるのですが、
>>なにか抜けてますでしょうか?・・・
>
>echoをoffにしないで表示されるコマンドを見ればわかると思います。
>
>「set test.bat」を実行すると、
>「環境変数 test.bat が定義されていません」
>が出ますが、これかな?


1604.
新たな質問・・すみません
2007年01月10日(水) 17時17分
くま
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-4 skip=5" %%i in (test.txt) do (
if "%%l"=="" goto :EOF
if "%%i"=="aaa1" (XXX 'yyyy' '%%j' '%%k' '%%l')>xyz.txt
if "%%i"=="aaa2" (XXX 'zzzz' '%%j' '%%k' '%%l')>xyz.txt
)

上記の形で作ってみたのですが、
文章上では、%%iがnullになったら、抜ける。。だと思うのですが、
叩いてみると、下のIF2つは、存在する分、全部を出力してくれるのですが、
「if "%%l"=="" goto :EOF」は、判別していないことがわかりました。
試しに、"%%i"==""の上に、
「if "%%l"=="" echo 通ってる?」と書いてみると、
見事、出ませんでした。
もしかして、私の書き方が間違っているのでしょうか?
他に、goto :EOFを、goto :GGGとして、
:GGGに飛ばすことは出来ないのでしょうか?
実際にテストしてみたのですが、飛ばないんです。。。
1605.
Re:新たな質問・・すみません
2007年01月11日(木) 09時26分
ラシャン
ちょっと説明不足でしたね^^;
if "%%l"=="" goto :EOF については、最終行の判断とあったので
例えば以下のように、最終行に不要な区切り線や文字列があった場合
コマンドに対して変な引数が送られないようにする為に加えてました。

 1行目-----------
 2行目文字列(説明文)
 3行目文字列(説明文)
 4行目-----------
 5行目タイトル      タイトル      タイトルタイトル
 6行目 aaa          bbbb          ccc     dddd
  ・
 ・
 ・
20行目-----------


例の場合は、4つ目のトークンが空だった場合は終了します。
逆に言うと、4つ目のトークンに何かしらセットされていれば
最後まで処理が進むということです。

6行目以降がずっと同じパターンであれば、当然4つ目は空ではないので
「if "%%l"==""」の処理が動くことは無いです。

基本的に「ここで止まって!」と条件をつけて指定行で処理を止めない限りは
最終行まで処理して終わります。
最終行を判断させないと無限ループになるということは無いです。
1608.
Re:新たな質問・・すみません
2007年01月11日(木) 14時17分
くま
なるほど、この説明でした、わかりました。すみません^^;

えと・・この仕組みを理解した上で、質問なんですが、
最終行まで実行させたあとに、「EXIT 0」させたいのと、
ログファイルに「正常終了」の文字列を吐き出させたいのですが、
なにかいい方法ありませんでしょうか?
説明にもあった通りに、「終わり」・・・
文字通り終わってしまうんです。。。

最初、FOR文の次行に、GOTO NORMALEND として、
飛ばせて、

:NORMALEND
echo NORMALEND
echo 正常終了>>tracelog.txt
EXIT 0

として、やりたかったのですが、どうにも、うまく飛びません。
CALLにしても同じでした。。。
たびたびで申し訳ありませんが、御教授お願いします。



>ちょっと説明不足でしたね^^;
>if "%%l"=="" goto :EOF については、最終行の判断とあったので
>例えば以下のように、最終行に不要な区切り線や文字列があった場合
>コマンドに対して変な引数が送られないようにする為に加えてました。
>
> 1行目-----------
> 2行目文字列(説明文)
> 3行目文字列(説明文)
> 4行目-----------
> 5行目タイトル      タイトル      タイトルタイトル
> 6行目 aaa          bbbb          ccc     dddd
>  ・
> ・
> ・
>20行目-----------
>
>
>例の場合は、4つ目のトークンが空だった場合は終了します。
>逆に言うと、4つ目のトークンに何かしらセットされていれば
>最後まで処理が進むということです。
>
>6行目以降がずっと同じパターンであれば、当然4つ目は空ではないので
>「if "%%l"==""」の処理が動くことは無いです。
>
>基本的に「ここで止まって!」と条件をつけて指定行で処理を止めない限りは
>最終行まで処理して終わります。
>最終行を判断させないと無限ループになるということは無いです。


1612.
Re:新たな質問・・すみません
2007年01月13日(土) 16時22分
ラシャン
「正常終了」=「最後まで処理が終わった」ということでいいですか?
そうであれば、こんな感じでどうでしょう?

aaa.bat-------------------------------------------------
@echo off
call bbb.bat
if "%ERRORLEVEL%"=="0" echo 正常終了>log.txt
if "%ERRORLEVEL%"=="1" echo 異常終了>log.txt
--------------------------------------------------------

bbb.bat-------------------------------------------------
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-4 skip=5" %%i in (test.txt) do (
if "%%l"=="" exit /b 1
if "%%i"=="aaa1" (XXX 'yyyy' '%%j' '%%k' '%%l')>xyz.txt
if "%%i"=="aaa2" (XXX 'zzzz' '%%j' '%%k' '%%l')>xyz.txt
)
exit /b 0
--------------------------------------------------------

1613.
Re:新たな質問・・すみません
2007年01月15日(月) 06時56分
ラシャン
補足です。
aaa.batを実行すると結果が出力されます。
「EXIT 0」とすると、CMD.exe自体が終了するので
他のプログラム等でプロセス終了コードを使いたい
ということでなければ「EXIT /B 0」を使って
ERRORLEVELに終了コードをセットします。

「/B」を使うとバッチが終了してしまう為
aaa.batからbbb.bat呼び出すようにして、aaa.bat内で
最後まで処理されたかチェックするようにしました。

bbb.batも%%lが空だった場合「EXIT /B 1」で
終了コードをセットするようにしてます。
1614.
Re:新たな質問・・すみません
2007年01月15日(月) 16時28分
くま
補足まで有難うございました。
該当のコマンドラインについては、自分では難解でしたので、
交渉の末、除外することが出来ました。

1ファイルで作成という制約が、かなり厳しかったです;;


で、落ち着いたなと思ったら、こんどは、
eventqueryで出力したテキストから、並べ替えをしろ・・・と。。。。(--;

取得方法は、すでに教えていただき、
for /f "tokens=1-4 skip=5" %%i in~~~
の方法で取得できるのはOKなんですが、
出力したテキストの内容で、Descriptionという項目が取得できるのですが、
これを、1つのtokensで得る方法・・・
なにかいい方法ありませんでしょうか?・・・
Descriptionは、9番目なので、%%aから振っていくと、
%%iになり、
%%iから、%%zまでをスペースを挟んで、ソースに書き込んでしまえば、
結果的にはOKだと思うのですが、
%%zとかは、無かった場合、除外する旨を、変数ごとに、書き込まないといけないかと思ってます。。
で・・・あるtokensからCR/LFまでを一括で取る手法があれば、
教えていただけたらと思います。

他に、便利な手法があれば、そちらでもかまいません。
お願いします。

取得したいテキストの中身は、
eventqueryで、/vのオプションをつけて、システムの警告と、エラーになります。
その中で必要な項目は、
Typeと、Date Timeと、Sourceと、Descriptionです。
tokensで割り振ると、1,3,4,5番目と、9番目以降です。


>補足です。
>aaa.batを実行すると結果が出力されます。
>「EXIT 0」とすると、CMD.exe自体が終了するので
>他のプログラム等でプロセス終了コードを使いたい
>ということでなければ「EXIT /B 0」を使って
>ERRORLEVELに終了コードをセットします。
>
>「/B」を使うとバッチが終了してしまう為
>aaa.batからbbb.bat呼び出すようにして、aaa.bat内で
>最後まで処理されたかチェックするようにしました。
>
>bbb.batも%%lが空だった場合「EXIT /B 1」で
>終了コードをセットするようにしてます。


1615.
Re:新たな質問・・すみません
2007年01月15日(月) 17時56分
ラシャン
アスタリスクを使うと可能です。
こんな感じでどうでしょう?
--------------------------------------------------------
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-8* skip=5" %%i in (test.txt) do (
if "%%l"=="" exit
if "%%i"=="aaa1" (XXX 'yyyy' '%%i' '%%k' '%%l')>xyz.txt
if "%%i"=="aaa2" (XXX 'zzzz' '%%i' '%%k' '%%l')>xyz.txt
)
--------------------------------------------------------

ちなみに、中身はこんな感じ
[%%i=Type][%%k=Date][%%l=Time][%%m=Source][%%q=Description]
1616.
Re:新たな質問・・すみません
2007年01月17日(水) 10時34分
くま
アスタリスクは、試してみたんですが・・・
使い方が間違っていた様です^^;

有難うございます。

>アスタリスクを使うと可能です。
>こんな感じでどうでしょう?
>--------------------------------------------------------
>@echo off
>setlocal enabledelayedexpansion
>for /f "tokens=1-8* skip=5" %%i in (test.txt) do (
>if "%%l"=="" exit
>if "%%i"=="aaa1" (XXX 'yyyy' '%%i' '%%k' '%%l')>xyz.txt
>if "%%i"=="aaa2" (XXX 'zzzz' '%%i' '%%k' '%%l')>xyz.txt
>)
>--------------------------------------------------------
>
>ちなみに、中身はこんな感じ
>[%%i=Type][%%k=Date][%%l=Time][%%m=Source][%%q=Description]


 


 

1577.複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す くま 07/01/05(金) 17:53
1581.Re:複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す ラシャン 07/01/06(土) 08:56
1591.Re:複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す くま 07/01/09(火) 10:08
1592.(削除されました)
1594.Re:複合技 テキストの特定行から、1行を抽出し、複数の文字列を変数に入れ、行がなくなるまで繰り返す くま 07/01/09(火) 18:01
1598.有難う御座います。 くま 07/01/10(水) 11:16
1599.Re:有難う御座います。 otn 07/01/10(水) 11:39
1603.Re:有難う御座います。 くま 07/01/10(水) 17:10
1604.新たな質問・・すみません くま 07/01/10(水) 17:17
1605.Re:新たな質問・・すみません ラシャン 07/01/11(木) 09:26
1608.Re:新たな質問・・すみません くま 07/01/11(木) 14:17
1612.Re:新たな質問・・すみません ラシャン 07/01/13(土) 16:22
1613.Re:新たな質問・・すみません ラシャン 07/01/15(月) 06:56
1614.Re:新たな質問・・すみません くま 07/01/15(月) 16:28
1615.Re:新たな質問・・すみません ラシャン 07/01/15(月) 17:56
1616.Re:新たな質問・・すみません くま 07/01/17(水) 10:34
 
 


カテゴリー「FOR /F」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2007年01月05日 13:36に投稿されたエントリーのページです。

ひとつ前の投稿は「「イベントログの各行のデータを変数に割り当ててコマンドを実行」をテキストファイルの行数分繰り返したい」です。

次の投稿は「多数のサブディレクトリ内のファイルを一括コピーするには」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
 
このブログについて | 運営:有限会社メディアポート