DBもどきの作成方法についてNo.23720
yama3yama3 さん 07/09/30 03:21
 
お世話になります。
DBの作成を考えています。
マクロでの作成をご指導お願いいたします。
シーケンシャル型になります。

tabte_aには
a1
a2
tabte_bには
b1
b2
b3
tabte_nには
n1
n2
のデータがあります。

マクロ実行後に、n×n×nの行の取得を行いたい。
a1b1n1
a1b1n2
a1b2n1
a1b2n2
a1b3n1
a1b3n2
a2b1n1
a2b1n2
a2b2n1
a2b2n2
a2b3n1
a2b3n2

ご指導をよろしくお願いいたします。

[ ]
RE:23720 DBもどきの作成方法についてNo.23728
encodingshiftjis さん 07/09/30 14:19
 
うーん、スタンド・アローンの DBに 投入して操作するのが
安定では。 SQL掲示板では 瞬時に回答が得られる例
でもあります。

Windowsの 新コマンド・プロンプト(PSH :PowerShell)
でも スクリプトできます

foreach ($_ in $(gc table_a.txt)){$a=$_;
foreach ($_ in $(gc table_b.txt)){$b=$_;
foreach ($_ in $(gc table_c.txt)){$c=$_;
$a+$b+$c
}}}

慣れてないので、5行ですが、ワンライナーで 書けるかも。

[ ]
RE:23728 DBもどきの作成方法についてNo.23729
encodingshiftjis さん 07/09/30 14:58
 
秀丸マクロでするとしたら(案)

1.table_c を再読み込み
2.taboe_b の現在行を table_cの頭に全コピー
結果を table_bbに累積
3.table_b の現在行を一つ進める
4.1.から繰り返し

1.table_bb を再読み込み
2.taboe_a の現在行を table_bbの頭に全コピー
結果を table_aaに累積
3.table_a の現在行を一つ進める
4.1.から繰り返し

[ ]
RE:23720 DBもどきの作成方法についてNo.23730
yama3yama3 さん 07/09/30 15:17
 
tableと言う表現が悪くて申し訳ございません。

tabte_a_start
a1
a2
tabte_a_end
tabte_b_start
b1
b2
b3
tabte_b_end
tabte_n_start
n1
n2
tabte_n_end
のtextデータがあります。

マクロ実行後に、n×n×nの行の取得を行いたい。
a1b1n1
a1b1n2
a1b2n1
a1b2n2
a1b3n1
a1b3n2
a2b1n1
a2b1n2
a2b2n1
a2b2n2
a2b3n1
a2b3n2
ではいかがでしょうか?
よろしくお願いいたします。


[ ]
RE:23730 DBもどきの作成方法についてNo.23731
encodingshiftjis さん 07/09/30 21:10
 
直積 とか 外部結合 を作るですから、DB を使うのが
適合しています、条件で何とかするような 「問題の拡張」にも
対応できますから。
(データ処理を テキストで操作するのに深入りしない事
これは、歴史の教訓、ある程度までできるが、それ以上は
困難さが急激に上がります
→ 最初から DBで 組み立てれば良かったと後悔します)
(最近の(メール・文書・バージョン管理)システムは内部でDBを使います。昔は
独自保存形式で管理するのが、一般的でした が)

秀丸マクロでするには、一般の プログラム言語の 発想から
エディター操作の発想に転換できるかが キー です。

a,b,c の3つのカーソル(イタレータ)を 回すのが、
わかりやすいでしょう。

1.カーソル初期化
2.3結合
3.カーソルを進める、2から繰り返し
以上、おおかたの 処理イメージ

----------
gofiletop;
searchdown "table_a_start";#cursorAini=lineno;
searchdown "table_a_end";  #cursorAend=lineno-1;
searchdown "table_b_start";#cursorBini=lineno;
searchdown "table_b_end";  #cursorBend=lineno-1;
searchdown "table_n_start";#cursorCini=lineno;
searchdown "table_n_end";  #cursorCend=lineno-1;

      #cursorA = #cursorAini;
while(#cursorA < #cursorAend)
        {#cursorA = #cursorA+1;
     movetolineno 1,#cursorA ; beginsel; golineend2;
$A=gettext2( seltopcolumn, seltoplineno, selendcolumn, selendlineno, 0);

//menu $A;
      #cursorB = #cursorBini;
while(#cursorB < #cursorBend)
        {#cursorB = #cursorB+1;
     movetolineno 1,#cursorB ; beginsel; golineend2;
$B=$A+gettext2( seltopcolumn, seltoplineno, selendcolumn, selendlineno, 0);

//menu $B;
      #cursorC = #cursorCini;
while(#cursorC < #cursorCend)
     {#cursorC = #cursorC+1;
     movetolineno 1,#cursorC ; beginsel; golineend2;
$C=$B+gettext2( seltopcolumn, seltoplineno, selendcolumn, selendlineno, 0);

//menu $C;

gofileend;
insert $C;
insertreturn;

}}}

---------------
スクリプトの 簡潔さを知った後では
こんな めんどう(細かいところに 気を使う)のを
書く 人はいないと 思う。(しかも 分野に独自で展開がきかない)
それが技術進歩というもの。

APL言語とか J言語 なら 「 AxbxC 」  とか式で書けるのもあります。

結論: 道具を不得意な分野に使うにしても、無理するな。
無理すると イタイ目にあいます。

[ ]
RE:23731 DBもどきの作成方法についてNo.23734
yama3yama3 さん 07/10/01 02:21
 
encodingshiftjis 様 ありがとうございます。

テストデータで完全に動作いたしました。
熱烈感謝!


>直積 とか 外部結合 を作るですから、DB を使うのが
>適合しています、条件で何とかするような 「問題の拡張」にも
>対応できますから。

調べましたら正に
sqlの直積、「デカルト積」「カルテシアン積」「クロス結合」「クロスジョイン」
「交差結合」
に解がありました。
SELECT * FROM table_a, table_b, table_n;

この会議室のレベルの高さに驚きと感謝で一杯でございます。
ありがとうございました。


[ ]