rakuten-bulk-control-csv
楽天RMSの一括登録/一括除外/一括更新用CSV(コントロールカラム,商品管理番号 の2列フォーマット)を作成するスキル。商品DL CSV・商品管理画面のコピペ・Excel・PDFなどから商品管理番号を抽出し、Shift-JIS+LF改行で出力する。「一括除外リスト作って」「楽天の除外CSV」「コントロールカラムnで」「2800円以下の商品をdで」「在庫0の商品を一括削除」「商品管理番号抜いてshift-jsで」「このフォーマットで」など、楽天RMSの商品一括処理用CSVを作るタスクで必ずこのスキルを使う。コントロールカラム値(n=新規/d=削除/u=更新)と抽出条件(全件・価格・在庫・販売状態など)をユーザー指示に応じて柔軟に切り替える。 【ALSEL独自スキル】株式会社ALSEL が、19年・5,000社超の EC 支援で得たノウハウをもとに開発したオリジナルスキルです。
SKILL.md 本文
楽天RMS 一括処理CSV作成
楽天RMSの商品一括処理(一括登録・一括除外・一括更新)に投入する2列CSVを作成する。
出力フォーマット(厳守)
| 項目 | 値 |
|---|---|
| ヘッダー | コントロールカラム,商品管理番号 |
| エンコード | Shift-JIS(CP932) |
| 改行 | LF(楽天サンプルファイルがLFのため。CRLFにしない) |
| カラム区切り | 半角カンマ |
| 出力先 | /mnt/user-data/outputs/items_<purpose>.csv |
ヘッダーは全角カンマ・余分なスペース不可。バイト一致が必要。
コントロールカラム値
ユーザー指示が最優先。明示がなければ目的から判断し、迷ったら聞く。
n= 新規登録d= 削除u= 更新
「一括除外リスト」と言われた場合、RPP除外商品リストへの新規登録なら n、既存商品の削除なら d。文脈で判断できなければユーザーに確認。
商品管理番号の抽出
入力フォーマットに応じて適切な列・位置を読む。他の番号と混同しないことが最重要。
パターンA: 楽天DL CSV(商品一括ダウンロード)
- 列名:
商品管理番号(商品URL) - 元ファイルはShift-JISで保存されているのでそれで読む
- 親行(価格・在庫が空)+ SKU行 の構造になっていることがある
import pandas as pd
df = pd.read_csv(path, encoding='shift_jis', dtype=str)
ids = df['商品管理番号(商品URL)']
パターンB: 商品管理画面のコピペ(テキスト/Markdown/HTML表)
各商品ブロックの先頭にある 長い数字(7〜8桁、10000xxx や 1000xxx) が商品管理番号。
その直後にある別の数字(500013、300055 など)は商品番号で別物。混同禁止。
構造例:
通常商品
10000684 ← これが商品管理番号 ✅
500013 ← これは商品番号 ❌
ビニール紙垂中 ← 商品名
商品管理番号は数字以外の文字(例: ac2066-ac10-set、burtle-ac-series-fullset-006)の場合もある。先頭の識別子を素直に取る。
パターンC: Excel貼付・スプレッドシート
ヘッダー行から商品管理番号列を特定して抽出。
フィルタ条件
ユーザー指示に応じて切り替える。
| 指示の例 | 処理 |
|---|---|
| 「全部」「全件」「このまま」 | フィルタなし(全商品) |
| 「2800円以下」 | 販売価格 ≤ 2800 |
| 「3000円未満」 | 販売価格 < 3000 |
| 「在庫0」「在庫切れ」 | 在庫数 = 0 |
| 「在庫1個以下」 | 在庫数 ≤ 1 |
| 「販売中のみ」 | 販売状態 = 販売中 |
| 「ROAS300%未満」など複合 | 別データと突合(要確認) |
SKU構造の扱い: 楽天DL CSVで価格フィルタする場合、同一商品管理番号内に複数SKU(=複数価格)がある。デフォルトは「最安値で判定」。「全SKUが条件に該当する場合のみ」など特殊指示があれば従う。判断に迷う商品が出たら必ずユーザーに確認。
処理フロー
- 入力確認: ファイル形式とエンコード、商品リストの構造を把握
- 抽出: 商品管理番号と必要な属性(価格・在庫など)を取り出す
- フィルタ: 指示の条件で絞る
- 重複除去: ユニーク化しつつ入力の出現順を維持(楽天側で扱いやすい)
- 出力: Shift-JIS LF改行で書き出す
- 検証: バイトレベルでフォーマットを確認
出力スニペット
import csv, os
os.makedirs('/mnt/user-data/outputs', exist_ok=True)
out_path = '/mnt/user-data/outputs/items_<purpose>.csv'
with open(out_path, 'w', encoding='shift_jis', newline='') as f:
w = csv.writer(f, lineterminator='\n')
w.writerow(['コントロールカラム', '商品管理番号'])
for item_id in item_ids:
w.writerow([control_value, item_id])
検証チェックリスト
出力後、必ず以下をバイトレベルで確認してから完了報告する。
with open(out_path, 'rb') as f:
raw = f.read()
crlf = raw.count(b'\r\n')
lf_only = raw.count(b'\n') - crlf
assert crlf == 0, f"CRLFが混入: {crlf}件"
raw.decode('shift_jis') # デコード可能か
- ✅ CRLFが0件、LFのみ
- ✅ Shift-JISでデコード可能
- ✅ 件数 = ユニーク件数(重複なし)
- ✅ ヘッダーが正確に
コントロールカラム,商品管理番号
完了報告フォーマット
ユーザーには以下を簡潔に伝える。
- 件数(ユニーク件数)
- コントロールカラム値(
n/d/u) - エンコード(Shift-JIS)
- 改行コード(LF)
- 適用したフィルタ条件
- 抽出元から見て注意した点(SKU集約方法、迷った商品など)
冗長な説明は不要。たけさん向けは特に簡潔に。
ライセンス: MIT
詳細情報
- 作者
- 株式会社ALSEL
- ライセンス
- MIT
- 最終更新
- 2026/5/13