[前の記事]« [NT系]ファイルの削除が成功したかどうかを検出するには
[次の記事]ERRORLEVELの戻り値がうまく検査できない »

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

▲カテゴリー「文字列の操作」索引へ

各行の先頭2バイトをチェックしてデータを複数ファイルに振り分けたい

669.
ファイルの分割
2004年07月25日(日) 08時19分
やす
バッチファイルを作成しはじめて1週間の超素人です。
こんなことは、一般的なことなのかもしれませんが、
教えてください。使用OSは、XPまたは2000です。
Source.txtファイルの内容が
10aaaaa bbbbb ccccc
10qqqqq 14www eeeee
14aaaaa bbbbb ccccc
14rrr10 ttttt uuuuu
の場合、各行の1~2バイトの文字列を判断して、
10の時、10.txtファイルを 14の時、14.txtファイルを新規に
作成したいのですがどうすればよろしいでしょうか。
よろしくお願いします。
670.
Re:ファイルの分割
2004年07月25日(日) 23時42分
ラシャン
例えばこんな感じで・・・

test1.bat
-------------------------------------------
@echo off
setlocal
for /f "tokens=*" %%a in (Source.txt) do (
set ROW=%%a
call :FNAME
)
goto :EOF

:FNAME
set NAME=%ROW:~0,2%
echo %ROW%>>%NAME%.txt
-------------------------------------------

実行結果

10.txt
----------------------
10aaaaa bbbbb ccccc
10qqqqq 14www eeeee
----------------------

14.txt
----------------------
14aaaaa bbbbb ccccc
14rrr10 ttttt uuuuu
----------------------

わたしもバッチファイル作りだして1年くらいなので
試行錯誤して、こんなのしか思いつきませんでした^^;
もっと簡単な書き方があるかも知れません・・・
672.
Re2:ファイルの分割
2004年07月26日(月) 01時10分
oo
>わたしもバッチファイル作りだして1年くらいなので
>試行錯誤して、こんなのしか思いつきませんでした^^;
>もっと簡単な書き方があるかも知れません・・・

じゃあ、わざと違う方針で考えてみました。
for %%N in (00 01 02 03 04 05 06 07 08 09) do findstr /b %%N Source.txt > %%N.txt
for /L %%N in (10,1,99) do findstr /b %%N Source.txt> %%N.txt
ですが、これだと空のファイルがいっぱい出来ちゃう。それを回避するには、
for %%N in (00 01 02 03 04 05 06 07 08 09) do call :sub %%N
for /L %%N in (10,1,99) do call :sub %%N
goto :eof
:sub
findstr /b %1 Source.txt > NUL && findstr /b %1 Source.txt > %1.txt

絶対ラシャンさんの書かれた方針が良いですね。これきっと遅いです。
setlocal enabledelayedexpansion すれば call 無しで
-------------------------------------------
@echo off
setlocal enabledelayedexpansion
del ??.txt 2>NUL  
for /f "tokens=*" %%a in (Source.txt) do (
 set ROW=%%a
 echo.%%a>>!ROW:~0,2!.txt
)
-------------------------------------------
前回実行分が残ってるかも知れなので最初に出力ファイルを消したほうがいいですけど、質問には「新規に作成」と書いてあるので、del は余計かな。del ??.txt で消しすぎになるならそこは変更。
673.
Re2:ファイルの分割
2004年07月26日(月) 13時00分
やす
>例えばこんな感じで・・・

>test1.bat
>-------------------------------------------
>@echo off
>setlocal
>for /f "tokens=*" %%a in (Source.txt) do (
>set ROW=%%a
>call :FNAME
>)
>goto :EOF

>:FNAME
>set NAME=%ROW:~0,2%
>echo %ROW%>>%NAME%.txt
>-------------------------------------------

>実行結果

>10.txt
>----------------------
>10aaaaa bbbbb ccccc
>10qqqqq 14www eeeee
>----------------------

>14.txt
>----------------------
>14aaaaa bbbbb ccccc
>14rrr10 ttttt uuuuu
>----------------------

>わたしもバッチファイル作りだして1年くらいなので
>試行錯誤して、こんなのしか思いつきませんでした^^;
>もっと簡単な書き方があるかも知れません・・・

ありがとうございました。
テストして思いどうりの結果を得ることができました。
今後もよろしくお願いします。
674.
Re3:ファイルの分割
2004年07月26日(月) 13時12分
やす
>>わたしもバッチファイル作りだして1年くらいなので
>>試行錯誤して、こんなのしか思いつきませんでした^^;
>>もっと簡単な書き方があるかも知れません・・・

>じゃあ、わざと違う方針で考えてみました。
>for %%N in (00 01 02 03 04 05 06 07 08 09) do findstr /b %%N Source.txt > %%N.txt
>for /L %%N in (10,1,99) do findstr /b %%N Source.txt> %%N.txt
>ですが、これだと空のファイルがいっぱい出来ちゃう。それを回避するには、
>for %%N in (00 01 02 03 04 05 06 07 08 09) do call :sub %%N
>for /L %%N in (10,1,99) do call :sub %%N
>goto :eof
>:sub
>findstr /b %1 Source.txt > NUL && findstr /b %1 Source.txt > %1.txt

>絶対ラシャンさんの書かれた方針が良いですね。これきっと遅いです。
>setlocal enabledelayedexpansion すれば call 無しで
>-------------------------------------------
>@echo off
>setlocal enabledelayedexpansion
>del ??.txt 2>NUL  
>for /f "tokens=*" %%a in (Source.txt) do (
> set ROW=%%a
> echo.%%a>>!ROW:~0,2!.txt
>)
>-------------------------------------------
>前回実行分が残ってるかも知れなので最初に出力ファイルを消したほうがいいですけど、質問には「新規に作成」と書いてあるので、del は余計かな。del ??.txt で消しすぎになるならそこは変更。

ありがとうございました。
ご忠告を参考にして、作成させていただきます。
675.
Re3:ファイルの分割
2004年07月26日(月) 18時16分
ラシャン
>setlocal enabledelayedexpansion すれば call 無しで
>-------------------------------------------
>@echo off
>setlocal enabledelayedexpansion
>del ??.txt 2>NUL  
>for /f "tokens=*" %%a in (Source.txt) do (
> set ROW=%%a
> echo.%%a>>!ROW:~0,2!.txt
>)
>-------------------------------------------

おおお、こういうことがやりたかったんですよ~
今まで遅延環境変数の展開というのを理解してなかったので
そのままfor文の中で処理しようとして失敗して
仕方なくcallで逃げてました(笑)

今回のは、ものすごく参考になりました~
ooさん、ありがとうございました~^^
677.
Re4:ファイルの分割
2004年07月27日(火) 00時15分
oo
>>setlocal enabledelayedexpansion すれば call 無しで
>>-------------------------------------------
>>@echo off
>>setlocal enabledelayedexpansion
>>del ??.txt 2>NUL  
>>for /f "tokens=*" %%a in (Source.txt) do (
>> set ROW=%%a
>> echo.%%a>>!ROW:~0,2!.txt
>>)
>>-------------------------------------------

>おおお、こういうことがやりたかったんですよ~
>今まで遅延環境変数の展開というのを理解してなかったので
>そのままfor文の中で処理しようとして失敗して
>仕方なくcallで逃げてました(笑)

>今回のは、ものすごく参考になりました~
>ooさん、ありがとうございました~^^

遅延環境変数については過去ログにも何度か出てますよ。
ただし、今回のようなケースでは Source.txtの中に、! が含まれていると元通り表示されません。そういうケースは多くないでしょうが、留意していないと処理結果に驚きます。
!PATH! → 展開されて表示
!ajdjjddjdj → ! だけ消える
!未定義変数名! → 空に展開される
%%aの展開後に ! ! の展開が行われるためです。
683.
Re5:ファイルの分割
2004年07月29日(木) 00時01分
ラシャン
>遅延環境変数については過去ログにも何度か出てますよ。

遅延環境変数については「これなに?」というレベルでして
前に、わたしも今回と同じようなことをやろうとして
過去ログを探していてcallを使ったものがあったので
それを参考にして作ってました。
遅延環境変数に辿り着く前にバッチが出来たので
それ以上調べなかったんですよね^^;

ちなみに、その時作ったバッチを見ると無駄な処理が多く
作り直すと4分の1くらいの行数になりそうです(笑)

>ただし、今回のようなケースでは Source.txtの中に、! が含まれていると元通り表示されません。そういうケースは多くないでしょうが、留意していないと処理結果に驚きます。
>!PATH! → 展開されて表示
>!ajdjjddjdj → ! だけ消える
>!未定義変数名! → 空に展開される
>%%aの展開後に ! ! の展開が行われるためです。

ちなみに

echo.%%a>>!ROW:~0,2!.txt

この部分なんですが、XPで実行すると「ROW」という
ファイルが出来てしまったのですが・・・

echo.%%a>>"!ROW:~0,2!.txt"

とすると正常に動作するのですが、何が原因なんでしょうか?
685.
Re6:ファイルの分割
2004年07月29日(木) 10時16分
oo
すいません。

>echo.%%a>>!ROW:~0,2!.txt

>この部分なんですが、XPで実行すると「ROW」という
>ファイルが出来てしまったのですが・・・

>echo.%%a>>"!ROW:~0,2!.txt"

>とすると正常に動作するのですが、何が原因なんでしょうか?

この部分、テスト時はラシャンさんのスクリプトに倣って
set NAME=!ROW:~0,2!
echo.%%a>>!NAME!.txt
としていました。投稿の時に、「NAMEは不要だな」と判断してしまい、投稿作成中に修正したままテストせず投稿してしまいました。

echo.%%a>>!ROW:~0,2!.txt
がまずいのは、! ! の解釈の前にリダイレクトが解釈され、その時(" "で囲まないと)カンマがセパレータになるので、 >>!ROW:~0 がリダイレクト指示と見なされるためですが、これで ROW という空のファイルが出来る理屈がよくわかりません。
echo aaa>bbb:  だと、bbb に aaa が入りますが、
echo aaa>bbb:c だと、bbb は空ですね。: はファイル名に使えない文字なので何が起こってもしょうがないのですが、不思議。

669.ファイルの分割 やす 04/07/25(日) 08:19
670.Re:ファイルの分割 ラシャン 04/07/25(日) 23:42
672.Re2:ファイルの分割 oo 04/07/26(月) 01:10
674.Re3:ファイルの分割 やす 04/07/26(月) 13:12
675.Re3:ファイルの分割 ラシャン 04/07/26(月) 18:16
677.Re4:ファイルの分割 oo 04/07/27(火) 00:15
683.Re5:ファイルの分割 ラシャン 04/07/29(木) 00:01
685.Re6:ファイルの分割 oo 04/07/29(木) 10:16
673.Re2:ファイルの分割 やす 04/07/26(月) 13:00
 
 


カテゴリー「文字列の操作」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2004年07月25日 13:23に投稿されたエントリーのページです。

ひとつ前の投稿は「[NT系]ファイルの削除が成功したかどうかを検出するには」です。

次の投稿は「ERRORLEVELの戻り値がうまく検査できない」です。

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

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