[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]
解決したようでよかったです。