[前の記事]« バッチ処理でサーバの状況報告のメールを自動送信したい
[次の記事]メモ帳の終了を待ってから次の処理に進む方法 »

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

▲カテゴリー「FOR .. IN ( ) DO..」索引へ

外部ファイルから1行ずつレコードを取得するには?

127.
外部ファイルから1行ずつレコードを取得するには?
2004年01月21日(水) 11時29分
とくてん
外部ファイル【a.txt】から1行ずつレコードを取得したいのですが、for文を使用することはわかったのですが、どのようにしたらいいかわかりません。(特にtokensがわからない)
◇条件
レコードの先頭文字が【#】と【改行】の場合は無視して最後の行になったら処理を終了する。
test.txtにはファイルのフルパスが入力されています。
特殊文字【:】や【\】が入っています。
OSはWindows2000です。
どうぞ宜しくお願いします ペコリ( --)( __)
128.
Re:外部ファイルから1行ずつレコードを取得するには?
2004年01月21日(水) 14時04分
ふぇむ
>外部ファイル【a.txt】から1行ずつレコードを取得したいのですが、for文を使用することはわかったのですが、どのようにしたらいいかわかりません。(特にtokensがわからない)

問題になる文字は、^ とか <  >  |  (  ) などのコマンドライン上意味のある文字です。特に厄介なのがエスケープ文字である ^ です。これらがあるようでしたら、 for 文での処理は早めに断念し awkその他の活用を考えたほうが有益だと思います。

おそらく1行丸ごとを1つの変数に格納されたいんだと思いますが、それは tokens=* でやればできます。空行はハナからスキップされますので、 eol=# としておくと行頭が # の行はスキップされると思います。

変数の内容をファイルのフルパスとして利用される場合、 "%VAR%" みたいに "" で囲うことで安定に利用できると思います。
129.
Re2:外部ファイルから1行ずつレコードを取得するには?
2004年01月21日(水) 15時36分
とくてん
回答ありがとうございます!

【FOR /F "eol=# tokens=* " %%a in (a.txt) do set FullPass=%%a】
このコマンドで実行できました。
しかし、変数『FullPass』にレコードが入力されるんですが、1回の処理で最後の行まで読み込んでしまいます。1行読み込むごとにサブルーチンをcallコマンドで呼び出したいのですが、どうやったらよいのでしょうか?
回答宜しくお願い致します。
130.
Re3:外部ファイルから1行ずつレコードを取得するには?
2004年01月21日(水) 16時02分
じゃく
FOR /F "eol=# tokens=* " %%a in (a.txt) do set call :sub "%%a"

:sub
set FullPass=%~1
(以下サブルーチンの処理)


過去ログにもこの手のサブルーチンを呼び出す例がありますよ。
たとえば 2) ファイルを1行ずつREADする  
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/for_in_do/3-0002.html
など。
131.
Re4:外部ファイルから1行ずつレコードを取得するには?
2004年01月21日(水) 18時16分
ふぇむ
>FOR /F "eol=# tokens=* " %%a in (a.txt) do set call :sub "%%a"

これはじゃくさんのタイプミスですね。 do set call の set は不要だと思います。

エラー時の打ち切りなども考えると、標準的な骨組みとしては例えば以下のような形がいいと思います。


setlocal ENABLEDELAYEDEXPANSION

前処理

for .... do (
call :MAIN  "%%a"  RET
!RET! を参照しての振る舞い分岐
)

後処理

goto :end

:MAIN
set ARG=%~1

メイン処理

set %~2=戻り値
goto :eof

:その他いろいろサブルーチン

処理

goto :eof

:end
endlocal
132.
Re5:外部ファイルから1行ずつレコードを取得するには?
2004年01月21日(水) 18時18分
じゃく
>>FOR /F "eol=# tokens=* " %%a in (a.txt) do set call :sub "%%a"

>これはじゃくさんのタイプミスですね。 do set call の set は不要だと思います。

ご指摘の通りです~。set を消し忘れています。
ふぇむさんフォローありがとうございました。
134.
Re6:外部ファイルから1行ずつレコードを取得するには?
2004年01月22日(木) 09時48分
とくてん
ありがとうございます。
ファイルリストを参照して毎日転送ファイルがあるかどうか
確認するバッチを作っていたのですが、以下の方法でできました
ふぇむさん、じゃくさんありがとうございましたー!(^^)

set CNT=0
FOR /F "eol=# tokens=* " %%a in (a.txt) do call :sub "%%a"

:sub
set FullPass=%~1
Dir %FullPass%
IF %ERRORLEVEL%==0 goto :EOF
IF %CNT%==0 echo "転送ミスファイル一覧">Miss.txt
IF NOT %ERRORLEVEL%==0 echo "%FullPass%">>Miss.txt
set CNT=1
135.
Re7:外部ファイルから1行ずつレコードを取得するには?
2004年01月22日(木) 10時05分
とくてん
Miss.txtてMisでいいんじゃん・・・( ̄▽ ̄;)
 

127.外部ファイルから1行ずつレコードを取得するには? とくてん 04/01/21(水) 11:29
128.Re:外部ファイルから1行ずつレコードを取得するには? ふぇむ 04/01/21(水) 14:04
129.Re2:外部ファイルから1行ずつレコードを取得するには? とくてん 04/01/21(水) 15:36
130.Re3:外部ファイルから1行ずつレコードを取得するには? じゃく 04/01/21(水) 16:02
131.Re4:外部ファイルから1行ずつレコードを取得するには? ふぇむ 04/01/21(水) 18:16
132.Re5:外部ファイルから1行ずつレコードを取得するには? じゃく 04/01/21(水) 18:18
134.Re6:外部ファイルから1行ずつレコードを取得するには? とくてん 04/01/22(木) 09:48
135.Re7:外部ファイルから1行ずつレコードを取得するには? とくてん 04/01/22(木) 10:05

 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2004年01月21日 11:49に投稿されたエントリーのページです。

ひとつ前の投稿は「バッチ処理でサーバの状況報告のメールを自動送信したい」です。

次の投稿は「メモ帳の終了を待ってから次の処理に進む方法」です。

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

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