photo_name.csvを作成する
A1 | A2 | A3 | A4 | A5 | |
---|---|---|---|---|---|
1 | あいうえお | かきくけこ | なにぬねの | あいうえお | かきくけこ |
2 | かきくけこ | たちつてと | さしすせそ | さしすせそ | |
3 | さしすせそ | たちつてと | |||
4 | たちつてと | なにぬねの | |||
5 | なにぬねの |
縦の1,2,3,4,5は人数 横のA1,A2,A3,A4,A5は写真の番号
A1の写真を買いたい人の名前を縦に記入 あいうえお かきくけこ さしすせそ たちつてと なにぬねの の5人
A2 かきくけこ たちつてと と順に入力しphoto_name.csvで保存
import csv from operator import itemgetter import sqlite3 with open('photo_name.csv', 'r') as fr: reader = csv.reader(fr) data = [] header = next(reader) for row in reader: for i, name in enumerate(row[1:], start=1): if name: # 番号が数字(通し番号)の場合 # data.append([name, i, 1]) # 番号が文字の場合 data.append([name, header[i], 1]) # ソート(名前・番号順) data.sort(key=itemgetter(0, 1)) with open('name_data.csv', 'w') as fw: writer = csv.writer(fw, lineterminator='\n') writer.writerows(data) # --------------- # 名前別に写真を集計 # --------------- conn = sqlite3.connect(':memory:') c = conn.cursor() # テーブル作成 # 番号が数字(通し番号)の場合 # c.execute('CREATE TABLE Photo(Name TEXT, Num INTERGER, Count INTERGER)') # 番号が文字の場合 c.execute('CREATE TABLE Photo(Name TEXT, Num TEXT, Count INTERGER)') for name, number, count in data: c.execute('INSERT INTO Photo VALUES (?,?,?)', (name, number, count)) result = c.execute("SELECT Name, GROUP_CONCAT(Num, ',') FROM Photo GROUP BY Name").fetchall() nlist = [[name, *number.split(',')] for name, number in result] with open('name_list.csv', 'w') as fw: writer = csv.writer(fw, lineterminator='\n') writer.writerows(nlist) conn.commit() conn.close()
name_data.csv
Excelのピポットテーブルで集計用
ヘッダー用に一行目に名前・番号・枚数とつけピポットテーブルを作成
行フィールドに名前 列フィールドに番号
データアイテムに枚数を設定すると集計できます。
あいうえお,A1,1
あいうえお,A4,1
かきくけこ,A1,1
かきくけこ,A2,1
かきくけこ,A5,1
さしすせそ,A1,1
さしすせそ,A4,1
さしすせそ,A5,1
たちつてと,A1,1
たちつてと,A2,1
たちつてと,A5,1
なにぬねの,A1,1
なにぬねの,A3,1
なにぬねの,A5,1
name_list.csv
個人別 購入写真番号
あいうえお,A1,A4
かきくけこ,A1,A2,A5
さしすせそ,A1,A4,A5
たちつてと,A1,A2,A5
なにぬねの,A1,A3,A5