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

Cassava Editor サポート掲示板

スレッド一覧に戻る返信

[884] 重複確認について

みかん [2025/01/10 13:16:35]

重複確認について。
12列目と14列目に重複がない場合に行を削除するという
マクロを組むことは可能でしょうか。

Re: [884] 重複確認について

みかん [2025/01/10 17:21:39]

// 12列目と14列目の値の組み合わせを記録するオブジェクトを初期化(プロトタイプなし)
let seen = Object.create(null);

// データの最終行から2行目までを逆順に処理
for (let row = Bottom; row >= 2; row--) {
    // 12列目と14列目の値を取得し、文字列として正規化(トリムと小文字化)
    let col12 = String(cell(12, row)).trim().toLowerCase();
    let col14 = String(cell(14, row)).trim().toLowerCase();

    // 12列目と14列目の組み合わせをキーとして連結
    let key = col12 + '|' + col14;

    // デバッグ用にキーをコンソールに出力
    console.log(`Processing row ${row}: key = "${key}"`);

    // 既に同じ組み合わせが存在する場合、その行を削除
    if (seen.hasOwnProperty(key)) {
        console.log(`Duplicate found. Deleting row ${row}`);
        DeleteRow(row);
    } else {
        // 新しい組み合わせの場合、オブジェクトに追加
        seen[key] = true;
        console.log(`Adding key "${key}" to seen`);
    }
}

若干1行残ってしまうのですが、
チャットGPTに出させたコードです。
どこがおかしいか全くわからず断念しました。

ジェネレーターでDLして使ったのですが、
例えば別のPCから挙動確認しようとしても。
L1 C1のエラーが起きます。

どの様にりようしたらいいでしょうか。

Re: [884] 重複確認について

あすかぜ [2025/01/10 22:30:23]

貼りつけていただいたコードを、Cassava Editor で動作するように書き直してみました。
こちらを試してみてください。
https://www.asukaze.net/soft/cassava/macro/asukaze/bbs884_20250110.cms

・Object.create() は使えないので {} としてください。
・a.hasOwnProperty(b) は使えないので b in a としてください。
・String() は使えないので str() としてください(.trim() に続ける場合は不要です)。
・console.log() は使えません。
・テンプレート文字列(`...`)は使えません。

このマクロは、「12列目と14列目が同じ内容であるような行が複数ある場合、最後の 1 行だけを残してそれ以外を削除する」
という挙動になっています。「重複がない場合に行を削除」とは違うかもしれませんが、大丈夫でしょうか。

また、このマクロは Ver.2.3 以降のみで動作する書き方となっています。
古いバージョンを使っている場合、最新版への更新をお願いします。

Re: [884] 重複確認について

みかん [2025/01/12 13:55:53]

お返事ありがとうございます。

実行させていただいたのですが、
やはり一行残ってしまいました。

元データ

 12列目 14列目

 1大阪 田中太郎
 2大阪 田中太郎
 3東京 田中太郎
 4大阪 田中次郎
 5大阪 田中太郎
 6大阪 田中三郎
 7香川 田中太郎
 8大阪 田中太郎
 9京都 田中太郎
10大阪 田中太郎

 ↓ (実行)

1、3、4、6、7、9、10 行目
が残ります。


1、3、4、6、7、9のは差異があるのでOKなのですが、
10が残ってしまうので困っています。


確認頂けると幸いです。
宜しくお願いいたします。

Re: [884] 重複確認について

みかん [2025/01/12 14:10:22]

すみません。まさに指摘いただいている挙動なので、
変えてもらえると助かります。

>このマクロは、「12列目と14列目が同じ内容であるような行>が複数ある場合、最後の 1 行だけを残してそれ以外を削除>する」
>という挙動になっています。「重複がない場合に行を削除」>とは違うかもしれませんが、大丈夫でしょうか。

Re: [884] 重複確認について

みかん [2025/01/12 14:20:09]

何度もすみません。

実行できました。ありがとうございます。

このコードをリンクにしてもらえると幸いです。

// (12列目,14列目)の組み合わせ回数を記録するためのオブジェクト
counts = {};

// ■第一段階: 上から走査してカウント
for (row = 2; row <= Bottom; row++) {
    col12 = cell(12, row).trim().toLowerCase();
    col14 = cell(14, row).trim().toLowerCase();
    key   = col12 + "|" + col14;

    // カウントアップ
    if (key in counts) {
        counts[key] = counts[key] + 1;
    } else {
        counts[key] = 1;
    }
}

// ■第二段階: 下から走査して削除
for (row = Bottom; row >= 2; row--) {
    col12 = cell(12, row).trim().toLowerCase();
    col14 = cell(14, row).trim().toLowerCase();
    key   = col12 + "|" + col14;

    // もし2回以上出現している組み合わせなら削除
    if (counts[key] > 1) {
        DeleteRow(row);
    }
}

Re: [884] 重複確認について

あすかぜ [2025/01/12 21:28:32]

上のコードをそのまま .cms ファイルにしたリンクです。
https://www.asukaze.net/soft/cassava/macro/mikan/bbs884_20250112.cms

Windows 上では、.cms ファイルは「メモ帳」などのテキストエディタで編集してください。

このマクロも前回のマクロも、処理の対象が 2 行目からデータ末尾までとなっています。
1 行目のデータも処理対象としたい場合には、

for (row = 2; row <= Bottom; row++) {

for (row = 1; row <= Bottom; row++) {
に、

for (row = Bottom; row >= 2; row--) {

for (row = Bottom; row >= 1; row--) {
に、

それぞれ変更してください。

Re: [884] 重複確認について

みかん [2025/01/13 22:45:20]

何とかできました。
ご助言ありがとうございます

// ▼(12,14)列目の「最初に出現した行」を覚えておくマップ
firstRowForKey = {};

// ▼第1段階: 上から下へ走査して「最初に出現した行」を記録
for (r = 1; r <= Bottom; r++) {
    col12 = cell(12, r).trim().toLowerCase();
    col14 = cell(14, r).trim().toLowerCase();
    key   = col12 + "|" + col14;

    // まだ記録されていなければこの行番号を覚える
    // (すでにあれば何もしない → 先に出た行が「最初」)
    if (!(key in firstRowForKey)) {
        firstRowForKey[key] = r;
    }
}

// ▼第2段階: 下から上へ走査して「最初に出現した行以外」を削除
for (r = Bottom; r >= 1; r--) {
    col12 = cell(12, r).trim().toLowerCase();
    col14 = cell(14, r).trim().toLowerCase();
    key   = col12 + "|" + col14;

    // 「このキーの最初の行」ではない場合は削除
    if (r != firstRowForKey[key]) {
        DeleteRow(r);
    }
}

Re: [884] 重複確認について

あすかぜ [2025/01/14 21:21:18]

解決したようでよかったです。

スレッド一覧に戻る返信