2017-11-27 7 views
-1

なぜ私の機能をテストできないのか分かりません。私の所望の出力は、その後、ルームIDですが、同じIDのための複数の部屋がある場合、これは、ファイル内のデータの一部であるデータベースに複数の行を作成する

ID Room 
    1 SW128 SW 143 
    into 
    ID Room 
    1 SW128 
    1 SW143 

のように、新しい行にそれを置きます。

1,SW128,SW143 
    2,SW309 
    3,AA205 
    4,AA112,SY110 
    5,AC223 
    6,AA112,AA206 

でも、私の機能をテストすることはできません。誰でもこの問題を解決するのを助けてくれますか?

def create_location_table(db, loc_file): 
'''Location table has format ID, Room''' 

con = sqlite3.connect(db) 
cur = con. cursor() 
cur.execute('''DROP TABLE IF EXISTS Locations''') 
# create the table 
cur.execute('''CREATE TABLE Locations (id TEXT, Room TEXT)''') 



# Add the rows 
loc_file = open('locations.csv', 'r') 
loc_file.readline() 
for line in loc_file: 
    d = {} 
    data = line.split(',') 
    ID = data[0] 
    Room = data[1:] 
    for (ID, Room) in d.items(): 
     if Room not in d: 
      d[ID] = [Room] 
      for i in Rooms: 
       cur.execute(''' INSERT INTO Locations VALUES(?, ?)''', (ID, 
       Room)) 
    # commit and close cursor and connection 
con.commit() 
cur.close() 
con.close() 

答えて

0

問題はdは常に空のdictであること、であるので、for (ID, Room) in d.items()は何もしません。あなたがする必要があるのは、Roomをループすることです。そして、あなたはdの辞書を必要としません。

def create_location_table(db, loc_file): 
    '''Location table has format ID, Room''' 

    con = sqlite3.connect(db) 
    cur = con. cursor() 
    cur.execute('''DROP TABLE IF EXISTS Locations''') 
    # create the table 
    cur.execute('''CREATE TABLE Locations (id TEXT, Room TEXT)''') 

    # open the CSV 
    csv_content = open(loc_file, 'r') 

    for line in csv_content: 
     data = line.strip().split(',') 
     # made lowercase following PEP8, but 'id' is a built in name in python 
     idx = data[0] 
     rooms = data[1:] 
     # loop through the rooms of this line and insert one row per room 
     for room in rooms: 
      cur.execute(''' INSERT INTO Locations VALUES(?, ?)''', (idx, room)) 
      # for debug purposes only 
      print('INSERT INTO Locations VALUES(%s, %s)' % (idx, room)) 
    # commit and close cursor and connection 
    con.commit() 
    cur.close() 
    con.close() 

# call the method 
create_location_table('db.sqlite3', 'locations.csv') 

注:PEP 8に続いて、変数を小文字にしました。

EDIT:ポストの完全なコード例、

+0

コメントが拡張議論のためではありませんloc_fileパラメータを使用します。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/160137/discussion-on-answer-by-masterfloda-creating-multiple-rows-in-databases)。 – Andy

関連する問題