2つのデータをマージして一覧表示

  • このエントリーをはてなブックマークに追加
  • 人気ブログランキング

フェイスブックでは、「友達になる」というものがありますが、

他のSNSでも、同様の機能があります。

 

OpenPNEという国産のSNSシステムでも、

フェイスブックの「友達になる」と同様の「フレンド申請」があります。

 

個人的には、なにもしない方ですが、

某SNSでは、「フレンド申請しよう」と思いました。

 

挨拶のメッセージを兼ねてフレンド申請するわけですが、

やっぱりこのサイトを知ってもらいたいというのがあるんですね。

 

そこで、「フレンド申請」するためには、まだフレンドになっていない人に対して、

「フレンド申請」する必要があると思いました。

 

たぶんシステム側では、フレンドになっているのに

「フレンド申請」ができることはないと思いますが、

エクセル(グーグルスプレッドシート)に、

「申請中」や「申請却下」という情報を管理しながら、

「フレンド申請」しようと思いました。

 

そこで、まずはメンバーリストの収集ということで、

前回の「OpenPNEのメンバーリストを取得する」というブログを作成し、

ちょっとしたツールも作成しました。

 

前回のツールで、全メンバーリストをページ単位で

エクセル(グーグルスプレッドシート)にはりつけ、

同様に、フレンドのメンバーリストもエクセル(グーグルスプレッドシート)にはりつけ、

最終的には、フレンドか、そうでないかがわかるようにして、

そこから、フレンド申請をしようと思いました。

 

で、自分のためにツールを作りました(笑)。

ツールを作成するためには、テストデータが必要

ツールが意図した通りに動作するか検証するためには、

テストデータが必要となります。

 

そこで、簡単なデータを作成しました。

簡単な問題

かごAの中に、「りんご、ばなな、トマト、かぼちゃ、じゃがいも」が、あります。かごBの中に、「じゃがいも、トマト、レタス」があります。マージして一覧表示してください。

※「マージ」とは?

マージ(merge)とは「併合する」、「合併する」という意味であり、情報工学の用語としてよく用いられる。 広義には複数のデータベースやファイル、プログラムなどを一つにまとめる行為を意味する。 狭義には以下で述べる二つの線形リストを一つにまとめるアルゴリズムのことである。

Wikipediaより

ツールの初期画面

ツールの初期画面です

test009_zentai
デモデータが表示されます。

メインのデータは、このようになっています。

test009_main

エクセル(グーグルスプレッドシート)で、コピペすると、タブ区切りとなります。

上記データもタブ区切りとなっています。

 

左がCODE(IDやKEY)、右がデータ名です。

 

マージした場合に、メインかサブかの区別をつけるために、

メインではデータ名の最後に1をつけました。

サブのデータはこのようになっています。

test009_sub

メインと同様に、タブ区切りで、

サブの場合は、データ名の最後に2をつけました。

実行結果1

条件

CODEの型:文字型

※ほかには「数値型」があります。

有効データ項目数:2

※テストデータは2項目ですが、テストデータが5項目ある場合は、

5を選択すると、一覧にそのまま表示されます。

一覧の並び順:昇順

※ほかには、「降順」があります。

一覧の重複:重複あり(マージ状態)

※ほかには、「重複なし(メイン優先)」「重複なし(サブ優先)」があります。

結果

test009_kekka1
重複したCODE部分は、ピンクの色をつけました。

サブのデータは、水色をつけました。

実行結果2

条件

CODEの型:数値型
有効データ項目数:2
一覧の並び順:昇順
一覧の重複:重複あり(マージ状態)

※実行結果1のCODEの型を数値型にした状態

結果

test009_kekka2
※並び順は、文字型と数値型は違うので注意

データチェック部分のプログラム

<!---=================================================================
chkData
==================================================================--->
<cffunction name="chkData" access="public" returnType="void" output="no">
    <cfset var qData1 = "">
    <cfset var qData2 = "">
    <cfset var qData3 = ""> <!--- 結果用 --->

    <cfset qData1 = getData(form.d1, "1")>
    <cfset qData2 = getData(form.d2, "2")>

    <cfquery name="qData3" dbtype="query">
    select *
    from qData1
    
    union
    
    select *
    from qData2

    order by code #form.sort#, chk
    </cfquery>

    <!--- 重複チェック(CODEが重複したデータのflgに*をセット --->
    <cfset old_code = "">
    <cfloop query="qData3">
        <cfif old_code eq qData3.code>
            <cfset QuerySetCell(qData3, "flg", "*", qData3.currentRow -1)>
            <cfset QuerySetCell(qData3, "flg", "*", qData3.currentRow)>
        <cfelse>
            <cfset old_code = qData3.code>
        </cfif>
    </cfloop>

    <!--- 重複なし(メイン優先) --->
    <cfif form.jfuku eq "2">
        <cfquery name="qData3" dbtype="query">
        select *
        from qData3
        where not (flg = '*' and chk='2')
        </cfquery>
    </cfif>
    <!--- 重複なし(サブ優先) --->
    <cfif form.jfuku eq "3">
        <cfquery name="qData3" dbtype="query">
        select *
        from qData3
        where not (flg = '*' and chk='1')
        </cfquery>
    </cfif>

    <cfset request.qData = qData3>
</cffunction>
<!---=================================================================
getData
==================================================================--->
<cffunction name="getData" access="public" returnType="query" output="no">
    <cfargument name="data" type="string" required="yes">
    <cfargument name="flg" type="string" required="yes">

    <cfset var qData = "">
    <cfset var sType = "varchar">
    <cfset var sFld  = "code">

    <!--- keyの型が数値 --->
    <cfif form.kata eq 2>
        <cfset sType = "integer">
    </cfif>

    <!--- 項目,型 --->
    <cfloop index="idx" from="2" to="#form.fcnt#">
        <cfset sType = ListAppend(sType, "varchar")>
        <cfset sFld  = ListAppend(sFld,  "fld#idx#")>
    </cfloop>
    <cfset sType = ListAppend(sType, "varchar,varchar")>
    <cfset sFld  = ListAppend(sFld,  "chk,flg")>

    <!--- query生成 --->
    <cfset qData = QueryNew(sFld, sType)>

    <!--- データセット --->
    <cfloop index="line" list="#arguments.data#" delimiters="#request.CRLF#">
        <!--- タブ区切りのスペースデータを追加(データが指定項目数より少ないことを防ぐため) --->
        <cfloop index="idx" from="2" to="#form.fcnt#">
            <cfset line = ListAppend(line, " ", request.TAB)>
        </cfloop>

        <cfset QueryAddRow(qData)>

        <cfloop index="idx" from="1" to="#form.fcnt#">
            <cfset tmp = trim(ListGetAt(line, idx, request.TAB))>
            <cfif idx eq 1>
                <cfset QuerySetCell(qData, "code", tmp)>
            <cfelse>
                <cfset QuerySetCell(qData, "fld#idx#", tmp)>
            </cfif>
            <cfset QuerySetCell(qData, "chk", arguments.flg)>
        </cfloop>
    </cfloop>

    <cfreturn qData>
</cffunction>

作成したデモ

作成したデモは、こちらです。

まとめ

自分が欲しいと思ったツールを作りましたが、

案外ほかにも利用価値がありそうな気がします。

 

大量のデータであれば、データベースを使った方が、楽に処理できますが、

データベースを使うほどでもない、微妙なデータ件数であれば、

こちらのツールが役にたつかもしれません。

今後の予定

プログラムをご希望の方に公開する予定です。メルマガに登録していただけると、作業の進捗状況など、お知らせします。

  • このエントリーをはてなブックマークに追加
  • 人気ブログランキング
最近の投稿
カテゴリー
タグ
アーカイブ
プロフィール