import csv import sqlite3 from datetime import datetime from collections import namedtuple Character = namedtuple('Character', ['id', 'characterName', 'playerName', 'role', 'creationDate', 'status']) Game = namedtuple('Game', ['id', 'title', 'status', 'fix', 'event', 'postdate', 'gamemaster', 'payouteb', 'payoutip', 'payoutloot']) Link = namedtuple('Link', ['gameId', 'gameTitle', 'characterId', 'characterName']) def extractCharacterFromRow(counter, row): return Character( counter, row['Character'], row['Player'], row['Role'], int(datetime.strptime(row['Approval Date'],'%m/%d/%Y').timestamp()) if row['Approval Date'] else 0, row['Status']) def extractGameFromRow(counter, row): return Game( counter, row['Game Title'], row['Game Status'], row['Fix'], row['Event'], int(datetime.strptime(row['Game Date'],'%d-%b-%Y').timestamp()) if row['Game Date'] else 0, row['GM'], row['Payout (EB)'], row['Payout (IP)'], row['Payout (Loot)']) def loadCharacters(characterFileName): characters = [] characterNameToId = {} with open(characterFileName) as csvFile: reader = csv.DictReader(csvFile) counter = 1 for row in reader: character = extractCharacterFromRow(counter, row) if character.characterName: characters.append(character) characterNameToId[character.characterName] = counter counter += 1 return characters, characterNameToId def loadGames(gameFileName): games = [] gameTitleToId = {} with open(gameFileName) as csvFile: reader = csv.DictReader(csvFile) counter = 1 for row in reader: game = extractGameFromRow(counter, row) if game.title: games.append(game) gameTitleToId[game.title] = counter counter += 1 return games, gameTitleToId def loadAppsAndPicks(characterNameToId, gameTitleToId, gameFileName): apps = [] picks = [] with open(gameFileName) as csvFile: reader = csv.DictReader(csvFile) for row in reader: gameTitle = row['Game Title'] if (gameTitle): gameId = gameTitleToId[gameTitle] for i in range(1,7): characterName = row['Character {} (Player)'.format(i)] if characterName: characterId = characterNameToId[characterName] picks.append(Link(gameId, gameTitle, characterId, characterName)) for i in range(7,11): characterName = row['Character {}'.format(i)] if (characterName): characterId = characterNameToId[characterName] picks.append(Link(gameId, gameTitle, characterId, characterName)) for i in range(1,51): characterName = row['Applicant {}'.format(i)] if characterName and characterName in characterNameToId: characterId = characterNameToId[characterName] apps.append(Link(gameId, gameTitle, characterId, characterName)) return apps, picks def main(): characters, characterNameToId = loadCharacters("Character Data.csv") games, gameTitleToId = loadGames("Game Data.csv") apps, picks = loadAppsAndPicks(characterNameToId, gameTitleToId, "Game Data.csv") with sqlite3.connect('testdb.db') as connection: cursor = connection.cursor() for character in characters: cursor.execute(""" REPLACE INTO Characters (characterName, id, playerName, role, creationDate, status) VALUES (?, ?, ?, ?, ?, ?) """, [character.characterName, character.id, character.playerName, character.role, character.creationDate, character.status]) for game in games: cursor.execute(""" REPLACE INTO Games (id, title, status, fix, event, postdate, gamemaster, payoutEB, payoutIP, payoutLoot) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, [game.id, game.title, game.status, game.fix, game.event, game.postdate, game.gamemaster, game.payouteb, game.payoutip, game.payoutloot]) for app in apps: cursor.execute(""" REPLACE INTO Apps (gameId, gameTitle, characterId, characterName) VALUES (?, ?, ?, ?) """, [app.gameId, app.gameTitle, app.characterId, app.characterName]) for pick in picks: cursor.execute(""" REPLACE INTO Picks (gameId, gameTitle, characterId, characterName) VALUES (?, ?, ?, ?) """, [pick.gameId, pick.gameTitle, pick.characterId, pick.characterName]) if __name__ == "__main__": main()