[932] 重複レコードの削除と個数の合算
MEHR [2026/01/11 12:12:16]
お世話になっております。
お助けください。
CSVファイルの編集に関して
2列目(注文番号)が同一 かつ 41列目(商品ID)が重複している場合
重複レコードの1番上だけ残して他重複レコードは削除
ただし42列目(注文個数)の合算を残したレコードに適用する
例)
(処理前)注文番号 商品ID 注文個数
12345 AAA 1
12345 AAA 2
12345 AAA 3
12345 BBB 3
(処理後)ECサイト注文番号 商品ID 注文個数
12345 AAA 6
12345 BBB 3
こんなのできそうですか?
AIでは無理でした
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/11 17:02:00]
すみません これ「質問」カテゴリとなります。
よろしくお願いいたします m(_ _)m
Re: [932] 重複レコードの削除と個数の合算
あすかぜ [2026/01/11 23:30:49]
次のようなマクロでどうでしょうか。
seen = {};
for (y = 1; y <= Bottom; y++) {
key = [2,y] + "\n" + [41,y];
if (key in seen) {
[42,seen[key]] += [42,y];
DeleteRow(y);
y--;
} else {
seen[key] = y;
}
}
最初に 2 列目と 41 列目の組み合わせが現れた行を保存しておき、
2 回目以降はその行を更新してから削除しています。
試してみてください。
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/12 16:54:39]
神様、ありがとうございます。
いつも助かっております。 m(_ _)m
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/14 17:19:13]
追加相談お願いします。
以下のように調整しました。
※44列目も合算
------------------------------------------------------------
seen = {};
for (y = 1; y <= Bottom; y++) {
key = [2,y] + "\n" + [41,y];
if (key in seen) {
[42,seen[key]] = ([42,seen[key]]+0) + ([42,y]+0);
[44,seen[key]] = ([44,seen[key]]+0) + ([44,y]+0);
DeleteRow(y);
y--;
} else {
seen[key] = y;
}
}
------------------------------------------------------------
要点を言えば、42列目が「個数」 44列目が「単価」となります
※現状は価格が1行目に集約されています
44列目の単価を42列目の個数で割り返した値にすることは可能でしょうか?
例)
(処理前)注文番号 商品ID 注文個数 単価
12345 AAA 1 1200
12345 AAA 2 0
12345 AAA 3 0
12345 BBB 3 500
(処理後)ECサイト注文番号 商品ID 注文個数
12345 AAA 6 200 ← 1200/6=200で計算
12345 BBB 3 500
お手すき時でいいので、お助けください m(_ _)m
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/14 17:20:11]
※補足
>>※現状は価格が1行目に集約されています
重複しているレコードの「1行目」となります。
Re: [932] 重複レコードの削除と個数の合算
あすかぜ [2026/01/14 22:12:33]
マクロを書いてみました。
data = {};
for (y = 1; y <= Bottom; y++) {
key = [2,y] + "\n" + [41,y];
if (!(key in data)) {
data[key] = {firstRow: y, quantity: 0, total: 0};
}
data[key].quantity += [42,y];
data[key].total += [42,y] * [44,y];
}
for (y = Bottom; y >= 1; y--) {
key = [2,y] + "\n" + [41,y];
if (y == data[key].firstRow) {
[42,y] = data[key].quantity;
[44,y] = data[key].total / data[key].quantity;
} else {
DeleteRow(y);
}
}
2 回 for ループを回し、1 回目に注文個数と金額の合計を取得して 2 回目でテーブルを更新するようにしてみました。
だいぶ複雑になってしまいましたが、役に立つでしょうか。
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/15 15:53:52]
ありがとうございます!
とてもいい感じに動いています。
いつも助かっております。
感謝感謝です。
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/16 10:09:52]
何度も申し訳ございません。
もう一点だけお助けください。
1行目(タイトル行)だけ処理の対象外にするには
どうすればいいでしょうか?
よろしくお願いいたします。 m(_ _)m
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/16 10:22:55]
要点を言えば 42列目と44列目のタイトル情報が
一部文字化けしてしまいます。
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/16 10:28:50]
AI使ってみました。
どうですか?
※44列目は少数以下切り捨てにしました
data = {};
// y = 2 にすることで、画面上の1行目(見出し)と2行目(変な値が入った行)を飛ばします
for (y = 2; y <= Bottom; y++) {
key = [2,y] + "\n" + [41,y];
if (!(key in data)) {
data[key] = {firstRow: y, quantity: 0, total: 0};
}
// 数値として認識させるために * 1 を追加
data[key].quantity += [42,y] * 1;
data[key].total += ([42,y] * 1) * ([44,y] * 1);
}
// こちらも y >= 2 にして、見出し行に触らせないようにします
for (y = Bottom; y >= 2; y--) {
key = [2,y] + "\n" + [41,y];
if (data[key] && y == data[key].firstRow) {
[42,y] = data[key].quantity;
[44,y] = int(data[key].total / data[key].quantity);
} else if (data[key]) {
DeleteRow(y);
}
}
MessageBox("重複処理完了 郵便番号と都道府県のチェックをお願いします");
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/16 10:39:28]
※44列目は少数以下切り捨てにしました。
↑これが原因かもしれないです 変な数値になってしまってます
42列目は項目名の頭に「0」が付いてしまいます
Re: [932] 重複レコードの削除と個数の合算
あすかぜ [2026/01/16 22:13:04]
はい、for (y = 2; y <= Bottom; y++)、for (y = Bottom; y >= 2; y--) とすれば 1 行目が処理の対象外になるはずです。
10:28 のマクロで特に問題ないように見えます。
> 変な数値になってしまってます
具体的にどのように変になっているでしょうか?
> 42列目は項目名の頭に「0」が付いてしまいます
項目名は 1 行目でしょうか?
42 列目が文字列の場合は頭に「0」が付いてしまうので、y の範囲を調整して処理対象から外してください。
もし 2 行目も処理したくないのであれば、y = 3; y >= 3; のように処理対象を 3 行目からとしてください。
よろしくお願いします。
Re: [932] 重複レコードの削除と個数の合算
MEHR [2026/01/17 15:16:56]
返信ありがとうございます。
現在は10:28のマクロで動いてる感じなので
しばらく様子見てみます。
>>具体的にどのように変になっているでしょうか?
タイトル情報が膨大なマイナス値になってました。
「-21589755468」みたいな感じで
また何かあれば相談させてください。
ご対応ありがとうございました。 m(_ _)m