集計の前に、入力のルールを決める
AIへ「CSVをいい感じに集計して」と頼む前に、列名と数え方を決めます。ここでは投稿ネタのcategory列を使い、行の数をカテゴリ別に数えます。売上の計算や会計処理は扱いません。
入力はUTF-8のカンマ区切りCSVで、先頭行にcategoryが必要です。前後の空白を取り、空欄は「未分類」にまとめます。同じ内容の行も、それぞれ一件として数えます。重複の除去はしません。
Python 3が必要です。準備はファイル一覧ツールの記事でも説明しています。
1.3行の入力で結果を確かめる
作業フォルダにcount_categories.pyとideas.csvを置きます。ideas.csvは次の内容で、UTF-8のプレーンテキストとして保存してください。
title,category 告知文の型,SNS プロフィール改善,SNS 次回の記事案,
同じフォルダをターミナルで開き、次を実行します。
python count_categories.py ideas.csv
category-counts.csvが生成されます。期待する結果は「SNSが2件、未分類が1件」で、合計3件です。並び順に関係なく件数を確認してください。既存の出力ファイルは上書きしません。
2.集計コードと、止まる条件
import csv
import sys
from collections import Counter
from pathlib import Path
source = Path(sys.argv[1])
counts = Counter()
with source.open(encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
if not reader.fieldnames or "category" not in reader.fieldnames:
raise SystemExit("category 列が必要です")
for line, row in enumerate(reader, start=2):
if None in row or any(v is None for v in row.values()):
raise SystemExit(f"{line} 行目の列数がヘッダーと違います")
category = row["category"].strip() or "未分類"
counts[category] += 1
output = Path("category-counts.csv")
with output.open("x", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(["category", "count"])
for category, count in sorted(counts.items()):
if category.startswith(("=", "+", "-", "@")):
category = "'" + category
writer.writerow([category, count])
print(f"合計 {sum(counts.values())} 件を {output} に保存しました")
category列がない場合と、行の列数が合わない場合は停止します。文字列中のカンマや改行はCSVの引用符の規則に従う必要があります。Excelなどから書き出したデータも、区切り文字や文字コードを確認してから使います。
カテゴリ名が数式と解釈されるのを避けるため、特定の記号で始まる値にアポストロフィを付けて出力します。元CSVの値は変更しません。
3.文字化けや、件数が合わないとき
UnicodeDecodeError:入力の文字コードがUTF-8以外かもしれません。元ファイルを保管し、表計算ソフトで「CSV UTF-8」などの形式へ保存したコピーを使います。文字を無視して読み込む設定で解決したことにしないようにします。
件数が想定と違う:「SNS」と「sns」は別カテゴリです。大文字小文字や表記ゆれ、意図しない空行・重複を確認します。
カテゴリ名の「SNS」「sns」を同じものとして集計したいです。 対応表で正規化する実装にしてください。 未定義のカテゴリはそのまま残し、処理した総行数も表示してください。 元CSVの上書きや、重複行の自動削除はしないでください。
制作環境で、合計件数、空欄、列不足、不正な行、既存出力がある場合を確認しています。本番データへ使う前に、少数のコピーで期待結果と照合してください。
参照した公式資料
製品の仕様や利用条件は変更される場合があります。操作や導入の前に、公式ページも確認してください。記事内の作業例・指示文・サンプルは本サイトが作成しています。