[あすかぜ・ねっと]あすかぜ・ねっと自作ソフトCassava > サポート掲示板

Cassava Editor サポート掲示板

スレッド一覧に戻る返信

[375] ソート時にリスト順で指定した順に並べたい

けんちんぢる [2016/10/21 16:58:08]

業務上,csvデータを直接扱うことが多く,Cassavaは列でソートもできるので重宝しております。

列を右クリックして「この列でソート」を実行すればソートされますよね。
この時,降順か昇順は選べますが,基本的には数値やコード順に並んでしまいます。

これを,指定したリストの順に並べ替えられたら素晴らしいです。
今のところ機能が無いようなのですが,できれば実現して欲しいです。

この機能を実現するマクロでもないかと探してみたのですが,見つかりませんでした。


良く利用するのは,次の様なリストです。

●会社の部署を組織図の順に並べた部署漢字リスト(部署英字リスト,部署コードリストなどのバリエーションがある)
●都道府県の名前をコード順に並べた都道府県リスト
●ローマ字を50音順に並べたリスト
●自前のマニュアルのカテゴリー順リスト


もし,上記の説明がわかりづらいようでしたら,Excelでは並び順を指定する機能があるので紹介させていただきます。

Excelでいえば,オプションの詳細設定にある「ユーザー設定リストの編集」ボタンを押すことで,並び順のリストを設定できます。もちろん,上記のリストは一通り設定して利用しております。

並べ替えを実行する際,「順序」列で「ユーザー設定リスト」を選択すると,最初から設定されている「日,月,火,水,木,金,土」とか「甲,乙,丙,丁・・・」などの他に,上記のリストが選択でき,数値やコード順でないリストの並び順にソート可能です。



よろしくお願いいたします。

Re: [375] ソート時にリスト順で指定した順に並べたい

あすかぜ [2016/10/21 23:42:24]

ご意見ありがとうございます。
ご指摘の通り、今のところユーザー定義順でソートをする機能はありません。

ユーザー定義順ソートのマクロを出力するマクロを作ってみたので、使ってみてください。
http://www.asukaze.net/soft/cassava/macro/asukaze/bbs375_20161021.cms.cms

まず、上のマクロを「.cms.cms」と 2 つ拡張子がついたファイル名で「Export」フォルダに置いてください(「Macro」フォルダではありません)。

次に、ユーザー定義順のデータファイルを作成します。CSV データで 1 列目に上から順にデータを並べてください。
例えば







という感じです。
データファイルができたら、Cassava Editor の [ファイル(F)]-[エクスポート(T)...] を実行し、
ファイルの種類を「BBS375_20161021.CMS 形式 (*.cms)」(エクスポートマクロのファイル名を変更していた場合は対応するもの)にして
「保存」を実行してください。

保存された .cms ファイルを今度は「Macro」フォルダに置きます。
次回 Cassava Editor 起動時から [オプション(O)]-[マクロ(M)] 内に対応するメニューが増えるので、
ソートしたいファイルを開いてキーとなる列の上にカーソルを合わせた状態でマクロを実行してください。
最初のデータファイルの順にデータがソートされるはずです。

なお、データファイルに含まれないキーはランダムな順序でファイルの前半に移動します。
また、同じキーを持つ行が複数ある場合も、順番は保存されません。


手順が面倒くさくてすみません。少しは役に立つでしょうか。
よろしくお願いします。

Re: [375] ソート時にリスト順で指定した順に並べたい

けんちんぢる [2017/01/01 17:44:10]

亀レスで申し訳ありません。
仕事が忙しかったこともありますが,実はすぐには実現できないだろうなと思い込んでいたモノで,レスのチェックが遅くなりました。

このようなマクロが作成できるなんで素晴らしいですね。
実行スピードもマクロとは思えず素早いですし。
手順も思ったほど面倒ではないので問題ないです。

個人的には,同じ発想で別のエディターのマクロを作ったりしたのですが,不覚にも同じようなことができるとは思っていませんでした。

ただ,肝心の実行結果と言いますか,マクロの限界と言いますか,都道府県でソートしたいと思ったのですが,エラーが出て実行されませんでした。

エラーは次の通りです。

「文字列定数は255文字以内にしてください」

ちなみに,255文字以内にすれば良いと言うことで,都道府県を半分(北海道から富山県まで)にして実行してみた結果は,最初に書いたとおり大変良好です。

如何せん「文字列定数の文字数オーバー」となると,機能的に改良していただく以外に方法がないということになってしまいますでしょうか・・・

Re: [375] ソート時にリスト順で指定した順に並べたい

あすかぜ [2017/01/01 19:01:41]

返信ありがとうございます。
「文字列定数は255文字以内」という制約を自分でも忘れていました。
この制約は定数のみの制約で計算結果では255文字以上でも大丈夫だったはずなので、
"北海道\n青森\n..."
ではなく
"北海道\n" + "青森\n" + ...
を出力するようにすれば回避できそうな気がします。

今日と明日は手元にパソコンがなく試せないのですが、あさって以降に修正版のマクロを作ってみたいと思います。

よろしくお願いします。

Re: [375] ソート時にリスト順で指定した順に並べたい

けんちんぢる [2017/01/01 21:29:51]

ちなみに,3行目を次の様に修正してみました。

list = list + replace([1,y], "\"", "\\\"") + "\\n\"" + " + \"";

すると,listが次の様に生成されるのですが,同じエラーになってしまいますね・・・

list = "\n北海道\n" + "青森県\n" + "岩手県\n" + "宮城県\n" + "秋田県\n" + "山形県\n" + "福島県\n" + "茨城県\n" + "栃木県\n" + "群馬県\n" + "埼玉県\n" + "千葉県\n" + "東京都\n" + "神奈川県\n" + "新潟県\n" + "山梨県\n" + "長野県\n" + "富山県\n" + "石川県\n" + "福井県\n" + "岐阜県\n" + "静岡県\n" + "愛知県\n" + "三重県\n" + "滋賀県\n" + "京都府\n" + "大阪府\n" + "兵庫県\n" + "奈良県\n" + "和歌山県\n" + "鳥取県\n" + "島根県\n" + "岡山県\n" + "広島県\n" + "山口県\n" + "徳島県\n" + "香川県\n" + "愛媛県\n" + "高知県\n" + "福岡県\n" + "佐賀県\n" + "長崎県\n" + "熊本県\n" + "大分県\n" + "宮崎県\n" + "鹿児島県\n" + "沖縄県\n" + "";

・・・と思ったら,マクロの置換が旨くいっていなかったようです。

最初,「共有マクロフォルダ」に入れてしまったのですが,「ユーザーマクロフォルダ」があることに気付き入れ直したら,同名だと実行されているのはどうやら最初の方のマクロでした。

マクロをまったく別の名前にしたら,上記の通りで旨く実行されました。
ありがとうございました。

ただ,マクロメニューは挙動不審のままです。
過去三台分の都道府県マクロが登録されたままになっています。

Re: [375] ソート時にリスト順で指定した順に並べたい

あすかぜ [2017/01/02 18:48:00]

はい、マクロフォルダは Cassava.exe のある場所(共有マクロフォルダ)と C:\Users\ユーザー名\AppData の中(ユーザーマクロフォルダ)の2ヶ所にあります。
どちらか片方に置いておけば動くので、不要なマクロファイルは削除してください。
メニュー項目は Cassava Editor 起動時と [マクロの検索] の実行時にしか更新されないので、マクロファイルの更新後は Cassava Editor を再起動するようにしてみてください。

よろしくお願いします。

Re: [375] ソート時にリスト順で指定した順に並べたい

けんちんぢる [2017/01/02 22:55:54]

お正月にもかかわらず,素早いレスですね。
お手数をおかけして申し訳ありません。

自宅ではWin10なのですが,「共有マクロフォルダ」を触ったときに「仮想化フォルダ」が作成されて,そこにマクロが格納されていたことを,スッカリ勘が鈍っていて忘れておりました。

仮想化フォルダ内に,該当のファイルが残っていたので,そちらをクリアしたところ,メニューが正常になりました。

Cassavaには,何も問題はありませんでした。
また,質問するかも知れませんが,よろしくお願いいたします。

Re: [375] ソート時にリスト順で指定した順に並べたい

mog [2021/04/09 19:25:00]

初めまして。お世話になります。
都度更新される住所を含んだcsvの整理に悩んでおります。

都道府県名だけのセルの場合は上記方法で上手くいきましたが、セルに(都道府県名含め)番地までの住所が丸ごと入っている場合は動作不可でした。何か方法はございませんでしょうか?
サポート掲示板をいろいろ検索してみましたが見つからずお手上げ状態です。

また、仮にソートできた場合、そのファイルから、都道府県を任意にエリア分けし(例えば東日本・西日本)、大元のファイルを残しエリア別ファイルとして別保存するようなことは可能でしょうか?

新参ながらご面倒おかけするようなお尋ねになってしまい申し訳ありませんが、どうか宜しくご教示ください。
宜しくお願いいたします。

Re: [375] ソート時にリスト順で指定した順に並べたい

大石剛司 [2021/04/09 21:23:37]

大石です。
今回も勉強のために作成してみました。

以下のデータを入力してエクスポートを実行しました。
北海道
青森県
秋田県
岩手県
沖縄県

作成されたマクロに以下の関数があります。

function compare(y1, y2, x) {
 list = "\n北海道\n青森県\n秋田県\n岩手県\n沖縄県\n";
 p1 = pos(list, "\n" + [x,y1] + "\n");
 p2 = pos(list, "\n" + [x,y2] + "\n");
 return p1 - p2;
}

この関数を以下のように変更します。

function compare(y1, y2, x) {
 list01 = "北海道";
 list02 = "青森県";
 list03 = "秋田県";
 list04 = "岩手県";
 list47 = "沖縄県";
 //
 p1 = 0;
 if(pos([x,y1], list01) > 0){
  p1 = 1;
 }
 if(pos([x,y1], list02) > 0){
  p1 = 2;
 }
 if(pos([x,y1], list03) > 0){
  p1 = 3;
 }
 if(pos([x,y1], list04) > 0){
  p1 = 4;
 }
 if(pos([x,y1], list47) > 0){
  p1 = 47;
 }
 //
 p2 = 0;
 if(pos([x,y2], list01) > 0){
  p2 = 1;
 }
 if(pos([x,y2], list02) > 0){
  p2 = 2;
 }
 if(pos([x,y2], list03) > 0){
  p2 = 3;
 }
 if(pos([x,y2], list04) > 0){
  p2 = 4;
 }
 if(pos([x,y2], list47) > 0){
  p2 = 47;
 }
 //
return p1 - p2;
}

これで並び替えは可能でした。他の県も同じように作成して下さい。

マクロ実行前
沖縄県654
秋田県789
岩手県987
青森県456
北海道123

マクロ実行後
北海道123
青森県456
秋田県789
岩手県987
沖縄県654

よろしくお願いします。

Re: [375] ソート時にリスト順で指定した順に並べたい

大石剛司 [2021/04/09 22:00:08]

大石です。

エリア指定ですが以下で可能でした。

エリア毎にマクロファイルを作成して、エリア指定の文字列を追加して、検索文字の判定も追加して下さい。

最初に元ファイルをコピーして下さい。
コピーしたファイルでマクロを実行して、結果以外の列を削除してから保存して下さい。

 // t 行 l 列から b 行 r 列までの中から、
 // 内容に list** が含まれるセルを抽出し、
 // 結果を w 列に作成します。
 // 行と桁を設定
 t = 1;
 l = 1;
 b = 5;
 r = 1;
 // 書き出し列を設定
 w = 3;
 //エリア指定
 list01 = "北海道";
 list02 = "青森県";
 list03 = "秋田県";
 list04 = "岩手県";
 //初期化
 wr = 1;
 //行範囲
 for(y = t; y <= b; y++){
  //列範囲
  for(x = l; x <= r; x++){
   //検索文字がある
   if(pos([x,y], list01) > 0){
    //セル内用をコピー
    [w, wr] = [x, y];
    //行を加算
    wr = wr + 1;
   }
   if(pos([x,y], list02) > 0){
    //セル内用をコピー
    [w, wr] = [x, y];
    //行を加算
    wr = wr + 1;
   }
   if(pos([x,y], list03) > 0){
    //セル内用をコピー
    [w, wr] = [x, y];
    //行を加算
    wr = wr + 1;
   }
   if(pos([x,y], list04) > 0){
    //セル内用をコピー
    [w, wr] = [x, y];
    //行を加算
    wr = wr + 1;
   }
  }
 }

よろしくお願いします。

Re: [375] ソート時にリスト順で指定した順に並べたい

あすかぜ [2021/04/10 09:02:16]

大石さん、ありがとうございます。

ちなみに、Cassava Editor 2.0 以降では、同梱の "lib/Array.cms" を利用することで繰り返し部分を若干簡潔に書くことができるようになりました。
参考までに私の書いたマクロもアップしておきます。

ソート用エクスポートマクロ:
https://www.asukaze.net/soft/cassava/macro/asukaze/bbs375_20210410_sort.cms.cms
エリア抽出用マクロ:
https://www.asukaze.net/soft/cassava/macro/asukaze/bbs375_20210410_filter.cms

なお、このエリア抽出用マクロでは DeleteRow(y); で実際にエリア外の行を削除していますが、この処理はかなり遅いです。
もし大きなファイルを処理しているのであれば、DeleteRow(y1, y2); で複数行をまとめて削除するようにすると高速化できるので、必要であればお知らせください。

Re: [375] ソート時にリスト順で指定した順に並べたい

大石剛司 [2021/04/10 09:25:27]

大石です。

あすかぜさん、マクロの作成ありがとうございます。大変勉強になります。
最新版では、簡潔な書き方ができますね。


「青森県北海道郡大石待ち123」という住所の場合、「北海道」と「青森県」が該当します。
マクロでは、「青森県」の判定が後方にあるので、結果は「青森県」になります。
都道府県名なので、住所のなかほどに紛れ込む事は無いと思うので、多分大丈夫かと思います。

文字列の1文字目が必ず都道府県名の先頭文字という場合は、
 if(pos([x,y1], list01) > 0){
  p1 = 1;
 }

 if(pos([x,y1], list01) == 1){
  p1 = 1;
 }
に変更して下さい。
ただし、先頭に空白等がありその後に都道府県名がある場合は、先頭の空白等を事前に削除してから判定する必要があります。

よろしくお願いします。


Re: [375] ソート時にリスト順で指定した順に並べたい

mog [2021/04/10 19:38:48]

あすかぜ様 大石様
出来ました!
悶々とした日々から少し抜け出せそうです。
やりたい作業が未だ残っていますので、掲示板の検索に励もうと思います。
本当にありがとうございました。

スレッド一覧に戻る返信