[前の記事]« ファイル内の文字列1行分を環境変数にセットする方法[FOR+SET]
[次の記事]ディレクトリ内のファイル数を環境変数にセットするには »

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

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

バッチファイルでtxtの編集は可能?


972) Batchファイルでtxtの編集 アニマルG 2002/12/05(木) 17:18


アニマルGと申します。
以前レスを頂いた者ですが、また皆さんにレスを頂きに参りました。
                ヨロシク(゜0゜)(。_。)ペコッ

質問内容は、タイトル通りですが、Batchファイルでテキストファイ
ルの編集は、可能ですか?

具体的には、バイト指定で項目の編集などが出来れば良いのですが、DOSコマンドだけでは、到底私には無理に思えます。

どなたか、ご存知の方ご教授願います。
環境:WIN2000(SP2)

宜しくお願いします。

989) Re:Batchファイルでtxtの編集 SYSOP 2002/12/06(金) 18:31


>質問内容は、タイトル通りですが、Batchファイルでテキストファイ
>ルの編集は、可能ですか?

>具体的には、バイト指定で項目の編集などが出来れば良いのですが、DOSコマンドだけでは、到底私には無理に思えます。

「バッチファイルでテキスト編集ができるか」という表題そのものにしては、ぼくの感覚からすれば答えは「当然、可能」です。というより、そういう作業に向いているのがコマンド・プロンプトの世界のいいところだと思います。

 ただ、後段の「DOSコマンドだけでは」という部分がもし「標準で提供されているコマンドの範囲でできるかどうか」という意味であれば (WindowsNT系ではfor /f コマンドが使えるので、条件によっては可能だったりもしますけど)、できない場合もけっこうあると思います。それは本当にケースバイケースです。

 でも、そもそもバッチ処理では、標準のコマンドだけで仕事を完結させる必然性自体がなにもありません。どこかから拾ってきたオンラインソフトでも自作ソフトでも、必要な処理に必要なら、それをバッチファイルに組み込んで使えばよいわけです。
 オンラインソフトは、たとえば下記サイトなどでいろいろ見つかると思います。(どれがご質問の要求仕様に沿っているかはぼくにはなんともいえませんが……)

 http://www.vector.co.jp/vpack/filearea/dos/util/text/index.html

YanaKen

[個人homepage  ]http://homepage3.nifty.com/yanaken/
[@pay導入について]http://bbs1.nifty.com/mes/cf_wrent/FPCU_B017/

this article refers Vector Soft Library..

995) Re2:Batchファイルでtxtの編集 アニマルG 2002/12/09(月) 11:04


SYSOPさん、いつも分かりやすいレス、ありがとうございます。

>「バッチファイルでテキスト編集ができるか」という表題そのもの
>にしては、ぼくの感覚からすれば答えは「当然、可能」です。とい
>うより、そういう作業に向いているのがコマンド・プロンプトの世
>界のいいところだと思います。
> ただ、後段の「DOSコマンドだけでは」という部分がもし「標準
>で提供されているコマンドの範囲でできるかどうか」という意味で
>あれば(WindowsNT系ではfor /f コマンドが使えるので、条件に
>よっては可能だったりもしますけど)、できない場合もけっこうあ
>ると思います。それは本当にケースバイケースです。
> でも、そもそもバッチ処理では、標準のコマンドだけで仕事を完
>結させる必然性自体がなにもありません。どこかから拾ってきたオ
>ンラインソフトでも自作ソフトでも、必要な処理に必要なら、それ
>をバッチファイルに組み込んで使えばよいわけです。

大変失礼致しました、それでは質問の仕方をもっと具体的に言い換え
てみますと、ある固定フォーマットのテキストファイルを3件読み込
んで1件に編集したいバッチファイルを作りたいのです。

この固定フォーマットのテキストファイルは、先頭1バイト目から9
バイトにキーワード(X)が入っていて、先頭から155バイト離れ
た場所に取り出したい項目データ(Y)が有ります。

このファイルを読込んで、1件目のデータの1バイト目から9バイト
にXがあれば、Yを出力ファイルの1バイト目から9バイトにセット
し、また、2件目のデータの1バイト目から9バイトにXがあれば、
Yを出力ファイルの10バイト目から9バイトにセットし、また、
3件目のデータの1バイト目から9バイトにXがあれば、Yを出力
ファイルの19バイト目から9バイトにセット。

基本的に、3件を1件に編集したいのです。
また、WIN2000のネイテイブ・コマンドだけにこだわっている訳では
ありません。
SYSOPさんにお教え頂いたVECTORで少し探してみます。

有難うございました。

996) Re3:Batchファイルでtxtの編集 SYSOP 2002/12/09(月) 14:14


アニマルGさん

 えっと、続きは新しい掲示板のほうで、ということでどうぞよろしく……。
 
 ⇒http://bbs.nifty.com/nbbin/nb_wrent/fpcu_bbso-0034621

SYSOP YanaKen

[個人homepage  ]http://homepage3.nifty.com/yanaken/
[@pay導入について]http://bbs1.nifty.com/mes/cf_wrent/FPCU_B017/

7) Batchファイルでtxtの編集(続き) アニマルG 2002/12/12(木) 16:14


SYSOPさん、いつも分かりやすいレス、ありがとうございます。

>「バッチファイルでテキスト編集ができるか」という表題そのもの
>にしては、ぼくの感覚からすれば答えは「当然、可能」です。とい
>うより、そういう作業に向いているのがコマンド・プロンプトの世
>界のいいところだと思います。
> ただ、後段の「DOSコマンドだけでは」という部分がもし「標準
>で提供されているコマンドの範囲でできるかどうか」という意味で
>あれば(WindowsNT系ではfor /f コマンドが使えるので、条件に
>よっては可能だったりもしますけど)、できない場合もけっこうあ
>ると思います。それは本当にケースバイケースです。
> でも、そもそもバッチ処理では、標準のコマンドだけで仕事を完
>結させる必然性自体がなにもありません。どこかから拾ってきたオ
>ンラインソフトでも自作ソフトでも、必要な処理に必要なら、それ
>をバッチファイルに組み込んで使えばよいわけです。

大変失礼致しました、それでは質問の仕方をもっと具体的に言い換え
てみますと、ある固定フォーマットのテキストファイルを3件読み込
んで1件に編集したいバッチファイルを作りたいのです。

この固定フォーマットのテキストファイルは、先頭1バイト目から9
バイトにキーワード(X)が入っていて、先頭から155バイト離れ
た場所に取り出したい項目データ(Y)が有ります。

このファイルを読込んで、1件目のデータの1バイト目から9バイト
にXがあれば、Yを出力ファイルの1バイト目から9バイトにセット
し、また、2件目のデータの1バイト目から9バイトにXがあれば、
Yを出力ファイルの10バイト目から9バイトにセットし、また、
3件目のデータの1バイト目から9バイトにXがあれば、Yを出力
ファイルの19バイト目から9バイトにセット。

基本的に、3件を1件に編集したいのです。
また、WIN2000のネイテイブ・コマンドだけにこだわっている訳では
ありません。
SYSOPさんにお教え頂いたVECTORで少し探してみます。

有難うございました。

11) Re:Batchファイルでtxtの編集(続き) SYSOP 2002/12/14(土) 13:48


アニマルGさん、こんにちは。

 要するに下記のような処理だという理解でよろしいでしょうか。

 ①テキストファイルAを読み込み用にオープンする。
 ②テキストファイルBを新規書き出し用にオープンする。
 ③以下を3回繰り返す。
  ④テキストファイルAを1行読む。
  ⑤その行頭9バイトの内容を検索語を照合。
   ⑥A 検索語と一致していたら、
    その行の155バイト目から9バイト分の内容を、テキストファイルBに
    (行末に改行を付加せず)書き出す。
   ⑥B 一致していないなら、スペースを9バイト分テキストファイルBに
    (行末に改行を付加せず)書き出す。
 ⑦3回の繰り返しが終了したら、2つのファイルを閉じる。

 ⑤~⑥あたりは、データ間がスペースやカンマなどで区切られている形式なら"FOR /Fコマンドなどで対応できる範囲"に近そうですが、"155バイト目から読み出す"だと難しそうですね。

 ぼくだったらどうするか……といえば、このような機能に合致したツール類を個別に探すみたいな方向ではなく、上記①~⑦までの処理内容に関して独立したプログラムを書いて、それをバッチファイルに組み込むようなかたちにするだろうなと思います。

 で、「どういう言語でそのプログラムを書くか」については、AWK、WSH、C、Pascal、BASIC……などなど、何であれファイル入出力ができ てテキスト処理関係の関数を持っているものなら用は足りるんじゃないかと思いますので、書店でプログラミング言語関係の入門書をあさってみて、とっつきや すそうなものにトライしてみる、というのがいいんではないでしょうか。

YanaKen

[個人homepage  ]http://homepage3.nifty.com/yanaken/
[@pay窓口    ]http://pay.nifty.com/pay/servlet/pr?i=BDKQ048560
[@pay導入について]http://bbs1.nifty.com/mes/cf_wrent/FPCU_B017/



16) Re2:Batchファイルでtxtの編集(続き) アニマルG 2002/12/16(月) 17:53


YanaKenさん、ごんばんわ。
いつも丁寧にレスして頂き感謝しております。
ご返事が遅くなって大変申し訳ありません。

YanaKenさんにお教え頂いたVectorには、これぞ言うツールが
いまいち見つかりませんでした。

> ぼくだったらどうするか……といえば、このような機能に合致したツール類を個別に探すみたいな方向ではなく、上記①~⑦までの処理内容に関して独立したプログラムを書いて、それをバッチファイルに組み込むようなかたちにするだろうなと思います。

> で、「どういう言語でそのプログラムを書くか」については、AWK、WSH、C、Pascal、BASIC……などなど、何であれファイル入出力がで きてテキスト処理関係の関数を持っているものなら用は足りるんじゃないかと思いますので、書店でプログラミング言語関係の入門書をあさってみて、とっつき やすそうなものにトライしてみる、というのがいいんではないでしょうか。

私自身オープン系のプログラマーではないので、perlを少々かじって
いる程度です。

また、その処理をさせたいのが、商用のサーバーでperl自身は入って
おりません。(私自身当サーバーの管理者の為、perlはインストした
くありません。)

java2は、全くの初心者です。
でも、がんばってjava2を少し勉強してみようと思います。
色々ご相談に乗って頂いて有難う御座います。
又、ピンチになったらご相談させて頂きます。

27) Re3:Batchファイルでtxtの編集(続き) allb 2002/12/18(水) 22:55


こんにちは、通りがかりの者です。
コマンドプロンプトのみで頑張ると、こんな感じになりますね。
下の例は、C:\temp\input.txt を読み、1~9文字内に"KWD"が含
まれる時、155から9文字を C:\temp\kekka.txt に出力します。
また、複数件の結果を横並びにして1件で出力します。
尚、最後から3行目の SET DAT=%DAT%
は、後ろに空白を9個入力しています。
------------
@ECHO OFF
FOR /F "tokens=1* " %%X IN (C:\temp\input.txt) DO call :judge %%X
ECHO %DAT%>C:\temp\kekka.txt
EXIT
:judge
SET REC=%1
ECHO %REC:~0,9% | FIND "KWD"
IF NOT ERRORLEVEL 1 (
SET DAT=%DAT%%REC:~154,9%
) ELSE (
SET DAT=%DAT%
)
:eof
------------
ただし、%REC:~0,9% などの文字列の切出しは、文字数指定であり、
全角でも半角でも1文字と判定されるため混在データなら注意が必要
ですね。また、上記の例では、入力ファイルのどのレコードも"KWD"
が無いとき
ECHO %DAT%>C:\temp\kekka.txt がうまく動きません。もう少し工
夫をして下さいね。
以上、何かのお役にたてれば幸いです。

168) Re4:Batchファイルでtxtの編集(続き) NATSUMI 2003/02/26(水) 15:18


バッチファイルで、Aのファイルの3行目に、Bのファイルの「XXX」という文字を含む行を検索して挿入した形のものをCというファイルに出力する…といった作業をしたいのですが、方法がわかりません。
FIND、FOR、COPYなどを使用すればできそうな気がするのですが、方法を教えてください。

169) Re5:Batchファイルでtxtの編集(続き) YanaKen 2003/02/26(水) 17:37


NATUMIさん こんにちは。

 すみません、「やりたいこと」の趣旨そのものがいまひとつわかりづらいです。質問文をもう少し整理してみていただけませんか。

>Aのファイルの3行目に、
>Bのファイルの「XXX」という文字を含む行を検索して
>挿入した形のものをCというファイルに出力する

 上記のご質問内容をある程度想像で補えば、

1行目=ファイルAの3行目を抽出した文字列
2行目以降=ファイルBの「文字列XXXが含まれる行」のそれぞれの内容

 ……のような構造のファイルCを作成したい、という趣旨かなとも思いますが、もっと単純に読むならば、

「Aのファイルの3行目に文字列を挿入したものををCとして出力したい」(最終的に作成されるCの内容はほぼAとイコールで、ただし3行めのどこかにCの内容が差し込まれたものである)

 とおっしゃっているようにも読めます。で、その場合は「3行めのどの位置に挿入するのか」「複数の行が見つかった場合にどう処理するのか」など、重要な前提条件がいくつか脱落しているように見えます。

 そういうわけで、まず「やりたいこと」が十分伝わる書き方を、もうひとまわり工夫されることをお願いします。なにかと融通のきかないパソコンに「自分が やりたいこと」を正確に伝えるには、人に伝える場合よりさらに厳密さが要求されるわけで、文章レベルでの「作業(というか、要求仕様)の明確化」は、あと で実地にバッチファイルを作る上でも役立つことと思います。

 ちなみに、「ファイルの3行目をどうこう」という時点で、WindowsNT系のFORコマンドなら可能だけれど、Windows95系の標準コマンド の範囲では基本的に不可となり、オンラインソフト等での補完が必要になってきます。ですので、お使いのWindowsのバージョンも明記されることをお願 いします。

 それと……と、どうもお願いばかりになってしまいますが、「Batchファイルでtxtの編集」という、元の質問者であるアニマルGさんがおつけになったタイトルと大枠では同じであっても、「やりたいこと」の内容自体はアニマルGさんのケースとだいぶ異なるようです。
 ですので、このコメント・ツリーにぶら下げるよりは、別に新規発言としてあらためて(上に書いたようなことにも留意された上で)質問されたほうがよいように思います。よろしくご協力お願いします。

SYSOP YanaKen

[個人homepage  ]http://homepage3.nifty.com/yanaken/
[@pay窓口    ]http://pay.nifty.com/pay/servlet/pr?i=BDKQ048560
[@pay導入について]http://bbs1.nifty.com/mes/cf_wrent/FPCU_B017/


170) Re5:Batchファイルでtxtの編集(続き) Hellcat 2003/02/26(水) 21:29


 OSの前提が分かりませんが…

 「Aファイルの2行目までをCファイルに出力し、Bファイルの指定した条件に合致した行をCファイルに続けて出力し、さらにAファイルの残りの行をCファイルに出力する」ということと理解しました。

Aファイル(A.TXT)
 001
 002
 003
 004
 005

Bファイル(B.TXT)
 xxx 100
 aaa 200
 bbb 300

Cファイル(C.TXT)
 001
 002
 aaa 200
 003
 004
 005

 Window9Xの場合、標準コマンドでは無理だと思いますので、Free Softを使う方法を考えてみました。
 使うコマンドは、Unixライクツール(UXTL412C.TAR.BZ2)のHEAD,EGREP,TAILです。
 コマンドラインは、以下のとおり。

HEAD -2 A.TXT > C.TXT
EGREP "aaa" B.TXT >> C.TXT
TAIL +3 A.TXT >> C.TXT

 HEADコマンドで、A.TXTの先頭の2行をまず出力。
 EGREPコマンドで、B.TXTの"aaa"を含む行をC.TXTに追加出力。
 TAILコマンドで、A.TXTの3行目以降をC.TXTに追加出力。
 これで完了です。

 なお、EGREPコマンドは全角文字に対応していないようなことがマニュアルに書かれています。私がテストした限りでは問題はなかったのですが、抽出条件が全角文字の場合は、同梱のJEGREPコマンドを使うといいでしょう。

 EGREPの代わりに DOSコマンドで
 FIND "aaa" B.TXT >> C.TXT
とすると、空行やファイルネームが一緒に出力されてしまうので、
 TYPE B.TXT | FIND "aaa" >> C.TXT
とするとこの問題を回避できます。

 HEAD,EGREP,TAILはUnixライクツールと称するFree Softで、以下にあります。

 UXTL412C.TAR.BZ2
  http://www.vector.co.jp/soft/dl/win95/util/se010511.html

確認OS Windows95 WindowsXP


172) Re6:Batchファイルでtxtの編集(続き) NATSUMI 2003/02/27(木) 12:06


ありがとうございました。
さっそく次のように実行してみました。
 HEAD -2 A.xml > C.xml
 EGREP "XXX" B.xml >> C.xml
 TAIL +3 A.xml >> C.xml
ところが、最初のHEADで2行までをCファイルに書き込んだ時点で
エラーでとまってしまいました。
エラー内容は
”Microsoft (R)KKCFUNC バージョン1.10
Copyright (C)Microsoft Corp. 1991,1993.All right reserved
KKCFUNCが組み込まれました.
マイクロソフトかな漢字変換 バージョン2.51
(C)Copyright Microsoft Corp.1992-1993
COMMAND.COMが違います
COMMANDがロードできません.リセットしてください.”
ですがどうしてでしょうか。
A,B,C各ファイルは英数のみのファイルです。
OSは2000です。

35) Re3:Batchファイルでtxtの編集(続き) ふぇむ 2002/12/24(火) 09:09


ふぇむと申します。こういう処理には awk が向いていると思います。
もちろん perl でもいいです。DOSコマンドラインで起動できる awk や perl を使ってスクリプトを組めば、数行でできるでしょう。gawk.exe なら、インストールというほどのことはなく、その実行モジュールファイルがあればいいだけです。たとえばawkのスクリプトだと以下のような感じです。こ れを、

gawk -f スクリプト データファイル > 出力ファイル

みたいにバッチ処理で起動して出力ファイルにリダイレクトすればよいかと思います。


BEGIN { OUT=""; }
NR <= 3 {
if (substr($0,1,9) == "XXXXXXXXX") { OUT = OUT substr($0,151,9); }
else { OUT = OUT " "; }
}
END { printf("%s\n",OUT); }
  • ◆7.  Batchファイルでtxtの編集(続き) (アニマルG)   2002/12/12(木) 16:14
    •  11.  Re:Batchファイルでtxtの編集(続き) (SYSOP)   2002/12/14(土) 13:48
      •  16.  Re2:Batchファイルでtxtの編集(続き) (アニマルG)   2002/12/16(月) 17:53
        •  27.  Re3:Batchファイルでtxtの編集(続き) (allb)   2002/12/18(水) 22:55
          •  168.  Re4:Batchファイルでtxtの編集(続き) (NATSUMI)   2003/02/26(水) 15:18
            •  169.  Re5:Batchファイルでtxtの編集(続き) (YanaKen)   2003/02/26(水) 17:37
            •  170.  Re5:Batchファイルでtxtの編集(続き) (Hellcat)   2003/02/26(水) 21:29
              •  172.  Re6:Batchファイルでtxtの編集(続き) (NATSUMI)   2003/02/27(木) 12:06
        •  35.  Re3:Batchファイルでtxtの編集(続き) (ふぇむ)   2002/12/24(火) 09:09
 
 


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

 

カテゴリー一覧

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


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

資料書籍

About

2002年12月05日 16:13に投稿されたエントリーのページです。

ひとつ前の投稿は「ファイル内の文字列1行分を環境変数にセットする方法[FOR+SET]」です。

次の投稿は「ディレクトリ内のファイル数を環境変数にセットするには」です。

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

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