過去の桐井戸端BBS (桐ver.5)
9401 一括処理(桐5):レコード毎に別名でテキスト書き出しするには? 沢田和明 2001/01/19-18:22
 私は、これまで桐5の会話処理だけで十分に満足してきたのですが、このたび、繰り返しがあまりに面倒な案件にぶつかり、
今ごろになって一括処理もおぼえよう、なんて思うくらいの低レベルユーザーです。
 私の持っている書籍には一括処理の説明が少ないので、こちらのサイトの過去ログで検索させていただきましたが、
うまく見つけらません。
やむをえず、このように質問させていただく次第です。
(過去に同様の質問があった場合にはお許しください)

 その繰り返しが面倒な、というのは、ある桐の表がありまして、そのレコード毎に別の名前のテキストファイルに、
順次書き出しをしたいというものです(6000件くらいあって手作業ではちょっと...)
 ファイル名は、当該表の、ある列のデータ値が自動的に入れば一番いいのですが、
連番で、0001.txt,0002.txt,0003.txt...となることでも十分です。

 考えた方法は、

  先頭行だけ選択
  テキスト書き出し(名前をつける)
  この行を削除
  選択取り消し(全行を表示)
  再度先頭行を選択
   ・・・
  繰り返し

なのですが、ファイル名の記述のしかたのところでとん挫しています。

 今は会話処理を履歴で記録してあれこれ考えているようなレベルで、一括処理自体についての理解度も低いのですが、
良いアドバイスがあればお教えください。

---(以下は余談です)---

 私は、データベース作りを目的として活用できるソフトには2系統あるように思っています。
 それは、
 (A)桐やエクセルのように全データを1ファイルに保存するもの(CSVファイル等で容易にデータのコンバート可能)
 (B)1データ1ファイル主義で、そのビューワ的な機能でもってデータベース作りをするもの、です。

 後者の場合は、テキスト群が保存されているフォルダが全体としてデータファイルの役目をします。
 私は、桐のデータを、この(B)系統のソフトに取り込んで作業してみたいのです。

 以上、長くなってすみませんでした。
9402 Re:一括処理(桐5):レコード毎に別名でテキスト書き出しするには? 幅田 2001/01/19-19:02
記事番号9401へのコメント
沢田和明さん、こんにちは。

>なのですが、ファイル名の記述のしかたのところでとん挫しています。

数値型の変数として、&位置などと宣言し、初期値は1としておきます。
文字列型の変数として、&ファイル名などと宣言します。

ファイル名は

&ファイル名=#文字列(&位置,4)+".txt"

という風にして、&位置は繰り返しの都度

&位置=&位置+1

という風に増やしていけば、
0001.txt、0002.txtというファイルを作ることができます。 

先頭行だけを選択するには
選択 行数=1
と書けばできますが、いちいち行を削除していくのはどうも気に入らないですね。

テキストを書き出すには、書き出しコマンドを使う以外に、印字コマンドを使うこともできるので、
私なら下記のようにします。

書き出す表ファイルは "データ.TBL"として、
その項目[A][B][C]を,(カンマ)区切りで1行だけ
テキスト書き出しをするには、

印字 [A]+","+[B]+","+[C]

のような書き方をします。
(ファイル名はその前に印字開始コマンドで指定しておきます。
また、印字コマンドの次に印字終了コマンドを書いておかないと、ファイルの区切りがつきません。)

位置指定 行番号=次行
で、順番に処理対象となるレコードを移していっています。

−−−−−−−−−−−−−−−−−−−−−−−−−−−

変数宣言 数値{&位置}
変数宣言 文字列{&ファイル名}
 表 "データ.TBL"

 位置指定 行番号=先頭
 &位置=1
繰り返し (.NOT #EOF)
  &ファイル名=#文字列(&位置,5)+".TXT"
   印字開始 &ファイル名
    印字 [A]+","+[B]+","+[C]
   印字終了
  &位置=&位置+1
  位置指定 行番号=次行
繰り返し終了


終了

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

9403 Re:一括処理(桐5):レコード毎に別名でテキスト書き出しするには? 宮城 2001/01/19-19:39
記事番号9401へのコメント
沢田和明さん、一括処理そのまま書いてもいいんですけど、せっかくやる気になられているのですから。

ファイル名は変数にとります。たぶんこれだけですむはず。

よって、最初は

変数宣言 固有,文字列{&ファイル名}

次に元の表(あ.TBLとします。)を開き、問題の項目([い]とします。)で整列を掛けます。

続いて、[い]で、選択 単一化を掛けます。

そして、書き出し 表,"う.TBL",{[い]}

これはインデックステーブルです。

書き出せたら、選択を解除。う.TBLを開きます。(あ.TBLと う.TBLがふたつ開いており、
編集対象表が う.TBLになっていて、なおかつその先頭行にいることに注目。)

ここから先は、ちょっとややこしいからナマで。

繰り返し(.NOT #終端行)
 代入 &ファイル名=[い]
 編集表 "あ.TBL"
 選択 [い]{&ファイル名}
 代入 &ファイル名=&ファイル名+".TXT"
 書き出し テキスト,&ファイル名,区切り=",",*
 選択解除
 編集表 "う.TBL" 
 位置指定 行番号=次行
繰り返し終了

う.TBLを先頭から1行ずつ処理していきます。[い]しかありませんがその項目値を&ファイル名に格納します。

編集対象を あ.TBLに変え、[い]の値がさっき取った変数の値と一致するものだけを選択します。

それをテキスト書き出しする。ファイル名には「.TXT」を付加しておきます。

選択を解除し、編集対象表を う.TBLに戻し、次の行に移動。

最後の部分のコメントはよくわかりませんでした。
9404 Re:一括処理(桐5):レコード毎に別名でテキスト書き出しするには? 沢田和明 2001/01/19-19:56
記事番号9402へのコメント
 幅田さん、こんにちわ。質問させていただいた沢田です。
 アドバイスありがとうございます。

 ついさっき書き込んだばかりなのに、こんなにすばやく、しかも丁寧に教えていただいて感激です。

 しかし、すごいですね、なんでこんなにすぐできちゃうんですか〜?
 私なんかから見たら、すごい神業のように思えてしまう...

 一括処理をサクサク書けてしまう方々から見れば、簡単なことなのかもしれませんが、いや私も早くそうなりたいものです。

 実は作業はこれからなので、教えていただいた一括処理、さっそくトライしてみます。
 そして解説本をにらみながら、幅田さんから教えていただいただいた一括処理の意味をよく理解できるようにいたします。

 とりいそぎお礼まで。
9405 Re:一括処理(桐5):レコード毎に別名でテキスト書き出しするには? 幅田 2001/01/19-20:09
記事番号9404へのコメント
沢田和明さんのご質問をよく読むと、ファイル名が入っている項目があるようですね。
そのファイル名で書き出しをしたい場合は変数はいらないので、変数宣言をする必要もありません。

その項目を[ファイル名]とし、
[ファイル名]には拡張子(.txt)も含んだデータとなっているとします。

−−−−−−−−−−−−−−−−−−−−−−
表 "データ.TBL"

位置指定 行番号=先頭

繰り返し (.NOT #EOF)
   印字開始 [ファイル名]
    印字 [A]+","+[B]+","+[C]
   印字終了
  位置指定 行番号=次行
繰り返し終了


終了
−−−−−−−−−−−−−−−−−−−−−−−−
前より簡単になりましたね。
9406 Re:一括処理(桐5):レコード毎に別名でテキスト書き出しするには? 沢田和明 2001/01/19-20:12
記事番号9403へのコメント
 宮城さん、こんにちは。質問した沢田です。
 幅田さんにお礼を書いている間に、宮城さんからもアドバイスいただいてしまいました。
 本当にすばやいお返事をありがとうございます。

>せっかくやる気になられているのですから。

 今ごろになって桐ver.5のやる気を出すなって言われそうですけどね(笑)

 丁寧に順をおって説明いただき、感謝します。
 すごく理解の助けになります。

 宮城さんのアドバイスは、書き出すファイル名を表の項目から引っ張ってきたいという、
私の希望を実現してくれるもののようですね。
 (って、一読しただけはこのくらいしか理解できない私...)

 幅田さんのアドバイスより、私にはさらに難解なので、さらにがんばって意味を理解したいと思います。

 まずはお礼まで。
 うまくいったら、また感想など報告したいと思います。


>最後の部分のコメントはよくわかりませんでした。

 わかりにくくてすみません。
 また頭の中を整理して、別の機会に書き込みしたいと思います。

9407 Re:一括処理(桐5):レコード毎に別名でテキスト書き出しするには? 幅田 2001/01/19-20:18
記事番号9405へのコメント
書き出す項目はすべて文字列型だということを前提としていましたが、もしもその中に
数値系のデータ型(数値や通貨等)のものがあった場合、
例えば[C]のデータ型が数値型だった場合は

印字コマンドのところを

印字 [A]+","+[B]+","+#文字列([C])

という風にいったん文字列に変換して書き出してください。

9411 項目値をファイル名に付けレコード毎にテキスト書出し 佐田 守弘 2001/01/20-00:08
記事番号9401へのコメント
沢田和明さん

既に幅田さんと宮城さんがコメントされておりますが、この種のデータ処理方法について解説しておきます。
【概論】
●レコード単位でのデータの扱い方
桐のコマンドは大きく、表全体のレコードに対して操作を行うものと、現在のレコード(処理対象行)に対して
処理を行うものがあります。
書き出しコマンドは、表全体のレコードを操作するコマンドであり、印字コマンドは処理対象行に対して操作を行う
コマンドです。
処理対象行毎に異なる処理(この場合であればレコード毎に別ファイルに書き出す)を行う場合には、
処理対象行のみを操作するコマンドを使います。
そして、これを表全体に対して繰り返す場合には、繰り返しコマンドでループを作り、その中で、
1レコードを処理したらジャンプコマンドで次の行に処理対象行を移動するといった事を繰り返します。
●印字コマンドの使い方
印字コマンドは、その名の通りプリンタデバイスにデータ出力する機能ですが、ファイル名を指定すると、
指定した名前のテキストファイルに、データを出力する事ができます。
印字コマンドは、かなり自由な出力ができるので、使い方によってはかなり強力な機能を発揮するコマンドです。
印字コマンドで出力できるコードには制限がなく、1バイトコード、2バイトコードの出力が可能です。
プリンタに対しては、原則として2バイトコードで出力されますが、「raw」を指定すれば、制御コードの出力も可能です。

印字関連のコマンドには、次のコマンドがあります
・印字開始 <ファイル名>
このコマンドが実行されると、指定したファイル名が書き出しとしてオープンされます。
・印字 <印字値の並び>
印字する値または計算式をカンマで区切って並べます。
この際に、文字列、数値が混在して並んでも構いません。印字値の間には区切り文字が入りません。
カンマなどの区切り文字を入れる場合には、「","」を印字値の並びとして記述します。
同様に、二重引用符を書き出す場合にも、引用符を印字値の並びに記述します。
1つの印字コマンドで出力した印字値の最後には、改行コード(CR/LF)が自動的に出力されます。
ただし、印字値の並びの後にコンマを付けると、改行コードは出力されません。

【レコード毎に書き出す一括処理の例】
一例として、以下の項目がある表(名簿.tbl)を想定します。
[コード][氏名][〒][都道府県][町域][番地][電話][FAX][生年月日]
そして、[コード](文字列)の名前のテキストファイルを出力するとします。
さて、御質問には「どの様な書式で書き出したいのか?」が記述されていません。
ここでは、次の様な2つのケースを想定してみます。
● コンマ区切り型のテキストファイルを出力する
CSVファイルをレコード毎に出力する場合の例です。
変数宣言 文字列{&c}
代入 &c=","
表 名簿
印字開始 [コード]
 繰り返し (.not #終端行)
  印字 [コード],&c,[氏名],&c,[〒],&c,[都道府県],&c,[町域],&c,
  印字 [番地],&c,[電話],&c,[FAX],&c,[生年月日]
  ジャンプ 行番号=+1
 繰り返し終了
印字終了
終了 表
● 他の文字列も加えて出力する
上記の表のデータを使って、次の様な出力をする場合です。
桐村松太郎様
〒123-4567 東京都港区西麻布○−○−○
電話 03-xxxx-xxxx FAX 03-xxxx-xxxx
年齢 ○○歳

この場合には上記の印字コマンドの部分を次の様に記述して下さい
 印字 [氏名],"様"
 印字 "〒",[〒],[都道府県],[町域],[番地]
 印字 "電話 ",[電話]," FAX ",[FAX]
 印字 "年齢 ",#年齢([生年月日],#日時値)," 歳"

佐田守弘(KS-00119)

9414 印字コマンド hidetake 2001/01/20-08:41
記事番号9411へのコメント
印字コマンドは、Windows版になり仕様が変更になっております。
Windows版では基本的にプリンタへの直接出力はできません。

また、Windows版になり RAW 指定も廃止になっています。
ヘルプファイルをご覧下さい。
このパラメータを指定するとエラーになると記載されています。

でも、実際は RAW 指定は廃止されておらず残っておりますが、DOS版とは仕様が異なっています。


9415 訂正>印字コマンドについて 佐田 守弘 2001/01/20-19:40
記事番号9414へのコメント
hidetakeさん、フォロー有難うございました。
hidetakeさんに補足して頂いた通りで、印字コマンドの仕様はWindows版で大幅に変更になってました。

その名前からして元来はプリンタへの出力機能だったはずですが、
Windows版桐ではプリンタへの出力の機能はサポートされなくなっております。
すなわち、印字コマンドは、ファイルへの計算式の値を出力するためのコマンドです。
#9411のコメントの中で、プリンタへ出力する機能と記述した部分は、取り消させて頂きます。

佐田守弘(KS-00119)

追伸
MS-DOSの概念ではPRN(プリンタ)もAUX(補助入出力装置)もファイルとして扱われるはずであると考えて試してみました。
でも、やはりだめでした。

9431 できました!(初心者の場合...) 沢田和明 2001/01/22-12:30
記事番号9401へのコメント
幅田さん、宮城さん、佐田さん、hidetakeさん こんにちわ。
 質問した沢田です。
 素人の質問に、何度も丁寧なレスをありがとうございました。
 まとめてのお礼になってしまいますが、お許しください。

 それはおいといて、結果を報告いたします。
 見事に希望通りのテキストに書き出すことができました!(ちょっと感動)

 教えていただいた一括処理を解読?しつつ、初心者の私は、一括処理内でいろいろ指定するのは難しいから、
対象とする表をあらかじめうまく整形しておくことにしました。

 項目を統廃合しているうちに、最終的には、書き出したい「ファイル名」と「内容」だけの2項目の表にしてしまいました。
 (「内容」の中には、後で置換するための強制改行文字を入れておきましたが)

 で、シンプルに印字コマンドで「内容」の中身をダラダラと...
 私の場合、それで十分用が足りてしまったというわけです。

--
 今回のことで、おそまきながら一括処理の便利さを知ってしまいました。
 宮城さんもおっしゃっていたように、私もちょっとやる気を出して、会話処理だけでなく一括処理でも、
桐5を活用したいと思います。
 昔、一括処理の書籍を買おうかと思って買わなかったのですが、買っときゃよかった〜!

P.S.
 佐田さんには、印字コマンド等の概説までしていただきました。
 とても助かりました。ありがとうございました。
 昔、佐田さんのテキストで桐Ver3の勉強したのを思いだしました...

戻る