[前の記事]« Lhaplusを使ってコマンドラインから圧縮する方法
[次の記事]IF文内でAND条件を記述するには »

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

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

テキストファイルの最初の数行だけを抽出するには

1224.
指定行の削除
2006年07月10日(月) 14時07分
たけ
WindowsXP PRO SP2で扱うテキストファイルで、特定行(1~6行)を残して、以降を削除するという方法をご存知の方がいらしたら教えてください。行数は可変です。但し、残す行は1~6行で固定です。
よろしく御願いします。
1230.
Re:指定行の削除
2006年07月11日(火) 13時37分
たけ
以下の質問をさせて頂きましたが、同一ファイルで先頭6行を残して後は削除ですが、別ファイルに先頭から6行抽出でも構いません。ご存知の方がいらしたら、よろしく御願いします。

>WindowsXP PRO SP2で扱うテキストファイルで、特定行(1~6行)を残して、以降を削除するという方法をご存知の方がいらしたら教えてください。行数は可変です。但し、残す行は1~6行で固定です。
>よろしく御願いします。


1231.
Re:指定行の削除
2006年07月11日(火) 15時08分
ぽてCCP◆fcMgMQA=
でしたら、FORと、SET /Aを調べると
目的が果たせるかと思います。
あ、あとIFも。

1232.
Re:指定行の削除
2006年07月11日(火) 15時51分
たけ
ぽてCCPさま、ありがとうございます。
SETコマンドとIFは使っているので分かるのですが、FORは自ら使用した事がないんです。ヘルプを見てもピンとこないし。「/L」オプションを使ったらできそうな気がしますが、1行ずつ読んでそれを別ファイルに書き出すというのがどうも分かりません。

SET COUNT=0
:LABEL1
set /A COUNT=%COUNT% + 1
IF %COUNT%=6 GOTO END


>でしたら、FORと、SET /Aを調べると
>目的が果たせるかと思います。
>あ、あとIFも。
>


1233.
Re:指定行の削除
2006年07月11日(火) 15時55分
ぽてCCP◆fcMgMQA=
FORは/Fオプションで1行づつ読み込めます。
過去ログなどを参照すると、いいサンプルが
ごっそりありますよ。
私も、Ver3.3Dの時代で止まっていた
DOSコマンドの知識をここで吸収しました。
1234.
Re:指定行の削除
2006年07月11日(火) 16時01分
たけ
ぽてCCP様、ありがとうございます。
ちょっと調べてみます。

>FORは/Fオプションで1行づつ読み込めます。
>過去ログなどを参照すると、いいサンプルが
>ごっそりありますよ。
>私も、Ver3.3Dの時代で止まっていた
>DOSコマンドの知識をここで吸収しました。


1235.
Re:指定行の削除
2006年07月11日(火) 16時36分
ぽてCCP◆fcMgMQA=
それでは、差し出がましいようですが少々補足情報を。

set a=A
set b=B
set c=C
set string=%a% %b% %c%
echo %string% > string.txt

で、string.txtというファイルに

A B C

という文字列が出力されます。

FORだと、空白ごとに区切られた状態で1行の内容が取得されますので
空白を補填してやる必要があるかと思います。
また、このやり方では

・空白で区切られた情報数に限界がある
・2つ以上続いた空白が認識できない

と言った不具合もありますが、これ以上を望む場合は、何かしらの
ツール、開発環境が必要かと思います。

大したお力になれませんで申し訳ありません。

1236.
Re:指定行の削除
2006年07月11日(火) 18時01分
たけ
ぽてCCP様、ありがとうございます。
ファイルのデータには幸い空白は含まれていません。
ですのでFORで何とかなると考えています。

>それでは、差し出がましいようですが少々補足情報を。
>
>set a=A
>set b=B
>set c=C
>set string=%a% %b% %c%
>echo %string% > string.txt
>
>で、string.txtというファイルに
>
>A B C
>
>という文字列が出力されます。
>
>FORだと、空白ごとに区切られた状態で1行の内容が取得されますので
>空白を補填してやる必要があるかと思います。
>また、このやり方では
>
>・空白で区切られた情報数に限界がある
>・2つ以上続いた空白が認識できない
>
>と言った不具合もありますが、これ以上を望む場合は、何かしらの
>ツール、開発環境が必要かと思います。
>
>大したお力になれませんで申し訳ありません。
>


1237.
Re:指定行の削除
2006年07月11日(火) 19時22分
otn
>FORだと、空白ごとに区切られた状態で1行の内容が取得されますので
>空白を補填してやる必要があるかと思います。
>また、このやり方では
>
>・空白で区切られた情報数に限界がある
>・2つ以上続いた空白が認識できない

デフォルトでは空白区切りですが、delimsパラメータで区切り文字を変更できます。

for /f "delims=" %%A in (filename) do 
と区切り文字を空にすると行がそのまま取れます。
1238.
Re:指定行の削除
2006年07月12日(水) 08時43分
ぽてCCP◆fcMgMQA=
そうだったんですか!
勉強になりました。
ありがとうございました。
1240.
Re:指定行の削除
2006年07月12日(水) 12時08分
たけ
こんにちは、otnさん、ぽてCCPさん。
お二方ともありがとうございます。
だいぶ、できましたが、IF文を使って処理回数(読んだ行数)をカウントすると「echo %%A」で表示される内容が「%A」になってしまいます。理由はお分かりになりますか?

del c:\aaa.txt
set COUNT=0
for /f "delims=" %%A in (c:\bbb.ini) do (
goto main
goto end

:main
set /A count=%count%+1
if %COUNT%. == 7. goto end
echo %%A >>aaa.txt
goto main
)

:end

>デフォルトでは空白区切りですが、delimsパラメータで区切り文字を変更できます。
>
>for /f "delims=" %%A in (filename) do 
>と区切り文字を空にすると行がそのまま取れます。


1241.
Re:指定行の削除
2006年07月12日(水) 13時11分
ぽてCCP◆fcMgMQA=
%%Aとする必要があるのはFORの所だけですので
単純に%を1つ減らすだけで大丈夫ですよ。
echo %A%
でOK。

蛇足ながらもう一つ。
このループですと、読み込んだファイルの1行目だけが
6回出力される事になると思います。
では、参考になりましたら幸いです。
1242.
Re:指定行の削除
2006年07月12日(水) 14時04分
たけ
ありがとうございます。ぽてCCPさん
echo %A%と記述したら「ECHO は <ON> です。」と
ファイルに書き込まれます。%A%が変数として認識されていないのでしょうか?


>%%Aとする必要があるのはFORの所だけですので
>単純に%を1つ減らすだけで大丈夫ですよ。
>echo %A%
>でOK。


>蛇足ながらもう一つ。
>このループですと、読み込んだファイルの1行目だけが
>6回出力される事になると思います。
>では、参考になりましたら幸いです。


1243.
Re:指定行の削除
2006年07月12日(水) 14時40分
ぽてCCP◆fcMgMQA=
そのメッセージが出るときは、たしか何もセットされていない
場合かと思います。

。。とすると、FORのループの中なので
%%A%になるのかな?


1244.
Re:指定行の削除
2006年07月12日(水) 15時29分
ぽてCCP◆fcMgMQA=
検証してみました。
結果、無駄な部分を削除することにより
%%Aは、要求する動作を行いました。
ただし、カウンタの部分は展開の遅延の問題により
このままでは動作しません。

そこで、CALLについて調べる事を提案します。
CALLしなくても(というか、IFを使わなくても)
FORをネストで使えばなんとかなるかもしれませんね。

間違った情報、申し訳ありませんでした。


1245.
Re:指定行の削除
2006年07月12日(水) 16時19分
otn
>こんにちは、otnさん、ぽてCCPさん。
>お二方ともありがとうございます。
>だいぶ、できましたが、IF文を使って処理回数(読んだ行数)をカウントすると「echo %%A」で表示される内容が「%A」になってしまいます。理由はお分かりになりますか?

for .... do (   ) の中でgotoすると、forから抜け出た扱いになり、%%A が無効になります。飛び先が括弧の中であってもだめです。ちょっと困った「仕様」。

set COUNT=0
for /f "delims=" %%A in (c:\bbb.ini) do (
 call :chksub
 if defined COUNT echo %%A
)>>c:\aaa.txt

goto :eof

:chksub
set /a COUNT+=1
if COUNT==7 set "COUNT="
goto :eof

テストしてませんが、こんな感じで。

サブルーチンの中でechoする方法も考えられますが、その場合、%%A は直接アクセスできないので、データをサブルーチンに引数で渡す必要があります。
1246.
Re:指定行の削除
2006年07月12日(水) 16時51分
たけ
ありがとうございます。otn様、  ぽてCCPさま
なんか、うまくいかなくてあきらめかけてます。
WSHで作成したら簡単なのでしょうが、メンテする人が居ないので何とかバッチで作成しようと考えていました。
御忙しいのに提案やヒント、検証までして頂いてすいません。

>for .... do (   ) の中でgotoすると、forから抜け出た扱いになり、%%A が無効になります。飛び先が括弧の中であってもだめです。ちょっと困った「仕様」。
>
>set COUNT=0
>for /f "delims=" %%A in (c:\bbb.ini) do (
> call :chksub
> if defined COUNT echo %%A
>)>>c:\aaa.txt
>
>goto :eof
>
>:chksub
>set /a COUNT+=1
>if COUNT==7 set "COUNT="
>goto :eof
>
>テストしてませんが、こんな感じで。
>
>サブルーチンの中でechoする方法も考えられますが、その場合、%%A は直接アクセスできないので、データをサブルーチンに引数で渡す必要があります。


1247.
Re:指定行の削除
2006年07月12日(水) 17時07分
ぽてCCP◆fcMgMQA=
んでは、もったいないので検証済みのルーチンを。

del aaa.txt
set /a cnt=0
for /f "tokens=1 delims=" %%A in (bbb.ini) do (
 if defined cnt (
   call :chk %%A
  ) else (
   goto :EOF
  )
)


:chk
echo %1 >> aaa.txt
set /a cnt+=1
if %cnt% == 6 set cnt=




1248.
Re:指定行の削除
2006年07月12日(水) 18時14分
たけ
otn様、ぽてCCPさまありがとうございました。要件を全て満たせました。
FOR自体、使った事が無かったので今でも、あまりよく理解していません。%%AがFORの外では%1で参照できるという事ですか。ちょっと私にはまだま だ、理解できそうにありません。日々、勉強ですね。でも、今回教えて頂いた事を応用していく事で色々と使い道がありそうです。



>del aaa.txt
>set /a cnt=0
>for /f "tokens=1 delims=" %%A in (bbb.ini) do (
> if defined cnt (
>   call :chk %%A
>  ) else (
>   goto :EOF
>  )
>)
>
>
>:chk
>echo %1 >> aaa.txt
>set /a cnt+=1
>if %cnt% == 6 set cnt=
>
>
>
>


1249.
Re:指定行の削除
2006年07月13日(木) 09時55分
ぽてCCP◆fcMgMQA=
差し出がましいようですが、若干の誤解を
産んでそうなので解説をば。

del aaa.txt
            :前回ログの削除(元ネタより)
set /a cnt=0
            :カウンタのリセット
for /f "tokens=1 delims=" %%A in (bbb.ini) do (
            :bbb.txt より1行読み込みDO以下を行う
            :bbb.txtがEOFになるまで繰り返す
 if defined cnt (
            :カウンタに値が入っているかのチェック
            :カウンタが開放されていればELSE
   call :chk %%A
            :サブルーチンchkを呼び出す。引数は%%A
            :引数を渡すために、通常のラベルではなく
            :ラベル名の先頭に「:」が必要
  ) else (
   goto :EOF
            :処理をEOFにジャンプさせる。
            :つまり、終了
  )
)


:chk
            :サブルーチンchkのラベル
echo %1 >> aaa.txt
            :1つめの引数%1をエコーしaaa.txtにリダイレクト
set /a cnt+=1
            :カウントアップ
if %cnt% == 6 set cnt=
            :カウンタが6を指したところで、カウンタを開放

            :以下、EOFになるのでCALL元にリターン

---------------------------------------------------------------------------
以上のような感じです。
もし、分からない事あったらお知らせください。
また、余計なお世話でしたらごめんなさい。

1250.
Re:指定行の削除
2006年07月13日(木) 15時37分
たけ
ぽてCCPさま、ありがとうございます。
余計なお世話だなんて事ありません。各パラメータの意味を理科するにはためになります。特に私の様にFORの素人には。
一点、疑問があるのですが、読み取り元のデータに「=」があった場合、「=」以降のデータが書き込まれませんでした。これは特殊記号が故の問題ですよね?文字の属性を変えないと扱えないのでしょうか?例えば事前に「"」で括って文字列とする必要があるのでしょうか?

>差し出がましいようですが、若干の誤解を
>産んでそうなので解説をば。

1251.
Re:指定行の削除
2006年07月13日(木) 17時04分
otn
>一点、疑問があるのですが、読み取り元のデータに「=」があった場合、「=」以降のデータが書き込まれませんでした。これは特殊記号が故の問題で すよね?文字の属性を変えないと扱えないのでしょうか?例えば事前に「"」で括って文字列とする必要があるのでしょうか?

少なくとも、空白 = < > ; , & | あたりは駄目ですね。他にも駄目な記号はあるかもしれません。

call :chk "%%A"
と呼ぶときに " " で囲んで、書くときに、
echo %~1
と " " をはずすことが必要です。

私が書いたように call の外で、echo %%A したほうが特殊記号については楽です。
1252.
Re:指定行の削除
2006年07月13日(木) 17時21分
たけ
ありがとうございます。otnさま。
「=」も出力できました。変数を「”」で括るとただのテキストとして扱うという事なのですか?そんな事ができるとは。しかし、人によって色々な書き方をす るのですね。正解は多数あるけど、パフォーマンスや作成時間の短縮(効率化)まで考えると、限りなく手段がありそうな気がします。

>少なくとも、空白 = < > ; , & | あたりは駄目ですね。他にも駄目な記号はあるかもしれません。
>
>call :chk "%%A"
>と呼ぶときに " " で囲んで、書くときに、
>echo %~1
>と " " をはずすことが必要です。
>
>私が書いたように call の外で、echo %%A したほうが特殊記号については楽です。


 


 

1224.指定行の削除 たけ 06/07/10(月) 14:07
1230.Re:指定行の削除 たけ 06/07/11(火) 13:37
1231.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/11(火) 15:08
1232.Re:指定行の削除 たけ 06/07/11(火) 15:51
1233.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/11(火) 15:55
1234.Re:指定行の削除 たけ 06/07/11(火) 16:01
1235.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/11(火) 16:36
1236.Re:指定行の削除 たけ 06/07/11(火) 18:01
1237.Re:指定行の削除 otn 06/07/11(火) 19:22
1238.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/12(水) 08:43
1240.Re:指定行の削除 たけ 06/07/12(水) 12:08
1241.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/12(水) 13:11
1242.Re:指定行の削除 たけ 06/07/12(水) 14:04
1243.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/12(水) 14:40
1244.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/12(水) 15:29
1245.Re:指定行の削除 otn 06/07/12(水) 16:19
1246.Re:指定行の削除 たけ 06/07/12(水) 16:51
1247.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/12(水) 17:07
1248.Re:指定行の削除 たけ 06/07/12(水) 18:14
1249.Re:指定行の削除 ぽてCCP◆fcMgMQA= 06/07/13(木) 09:55
1250.Re:指定行の削除 たけ 06/07/13(木) 15:37
1251.Re:指定行の削除 otn 06/07/13(木) 17:04
1252.Re:指定行の削除 たけ 06/07/13(木) 17:21
 
 


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

 

カテゴリー一覧

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


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

資料書籍

About

2006年07月10日 13:44に投稿されたエントリーのページです。

ひとつ前の投稿は「Lhaplusを使ってコマンドラインから圧縮する方法」です。

次の投稿は「IF文内でAND条件を記述するには」です。

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

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