2012-01-23 52 views
0

任何人都可以幫助我在每行的開始/結尾刪除這些雙引號嗎?雙引號在寫入/ .CSV時每行結尾處

我有一個很大的csv(800k行),並且想要創建插入語句來將數據導入到SQL DB中。我知道代碼是十分可怕的,但我從來沒有使用Python的前...任何幫助是極大的讚賞...

#Script file to read from .csv containing raw location data (zip code database) 
#SQL insert statements are written to another CSV 
#Duplicate zip codes are removed 


import csv 

Blockquote 

csvfile = open('c:\Canada\canada_zip.csv', 'rb') 
dialect = csv.Sniffer().sniff(csvfile.readline()) 
csvfile.seek(0) 
reader = csv.reader(csvfile, dialect) 
reader.next() 

ofile = open('c:\Canada\canada_inserts.csv', 'wb') 
writer = csv.writer(ofile, dialect) 

#DROP/CREATE TABLE 
createTableCmd = '''DROP TABLE PopulatedPlacesCanada  \n\ 
CREATE TABLE PopulatedPlacesCanada       \n\ 
(             \n\ 
ID INT primary key identity not null,  \n\ 
Zip VARCHAR(10),       \n\ 
City nVARCHAR(100),      \n\ 
County nvarchar(100),      \n\ 
StateCode varchar(3),      \n\ 
StateName nvarchar(100),     \n\ 
Country nvarchar(30),      \n\ 
Latitude float,       \n\ 
Longitude float,       \n\ 
PopulationCount int,      \n\ 
Timezone int,        \n\ 
Dst bit         \n\ 
)''' 
writer.writerow([createTableCmd]) 

table = 'PopulatedPlacesCanada' 
db_fields = 'Zip, City, County, StateCode, StateName, Country, Latitude, Longitude,   PopulationCount, Timezone, Dst' 
zip_codes = set() 

count = 0 

for row in reader: 
    if row[0] not in zip_codes: #only add row if zip code is unique 
    count = count + 1 
    zipCode = row[0] #not every row in the csv is needed so handpick them using row[n] 
    city = row[1].replace("\'", "").strip() 
    county = "" 
    state_abr = row[2] 
    state = row[3].replace("\'", "").strip() 
    country = 'Canada' 
    lat = row[8] 
    lon = row[9] 
    pop = row[11] 
    timezone = row[6] 
    dst = row[7] 
    if dst == 'Y': 
     dst= '1' 
    if dst == 'N': 
     dst = '0' 
    query = "INSERT INTO {0}({1}) VALUES ('{2}', '{3}', '{4}', '{5}', '{6}', '{7}', {8}, {9}, {10}, {11}, {12})".format(table, db_fields, zipCode, city, county, state_abr, state, country, lat, lon, pop, timezone, dst) 
    writer.writerow([query]) 
    zip_codes.add(row[0]) 
    if count == 100: #Go statement to make sql batch size manageable 
     writer.writerow(['GO']) 
+0

雙引號是什麼? –

回答

0

兩個指針第一: -
1)使用三重倒逗號爲多通過三重撇號的字符串。
2)不需要在多行字符串中放置「\ n \」。

要從行中刪除引號,請使用python的正則表達式模塊,而不是字符串替換。

import re 
quotes = re.compile('^["\']|["\']$') 
city = quotes.sub(row[3]) 
state = quotes.sub(row[4]) 

或者你會使用帶有你想從兩端移除的字符的strip;只有一次一個AFAIK字符: -

city = row[3].strip('"').strip("'") 
state = row[4].strip('"').strip("'") 

最後,不要使用csv模塊的文件輸出,因爲它預計,「語境」。只需打開文件並寫入。

ofile = file('canada_inserts.sql','w') 
ofile.write(createTableCmd + '\n') 
for row in reader: 
... 
    ofile.write(query + '\n') 
+0

使用'替換'恕我直言刪除引號沒有任何問題。正則表達式實際上是在這裏矯枉過正。最後一部分實際上回答了他的問題,但有些間接。 –

+0

感謝您填寫細節亞歷克斯...這固定它! – Bagsy

+0

替換沒有錯,不,但是使用它效率不高,因爲它搜索行中的每個字符,而不僅僅是開始和結束字符,正如描述的所需效果。我同意RE的有點矯枉過正,但是在事先編譯時,它們對重複的文本操作來說效率要高得多。 –

0

您並未撰寫CSV文件。不要爲它使用csv編寫器,因爲它可能會在數據中添加額外的轉換。相反,使用

ofile = file('load.sql', 'w') 
# Raw write, no newline added: 
ofile.write(...) 
# or, with newline at the end: 
print >>ofile, "foobar." 

這是CSV作家,它是將報價給您的生產線:最CSV方言期待字符串用引號包裹時,它們包含某些字符,如,;甚至空間。但是,由於您正在編寫SQL而不是CSV,因此您不需要或不需要此操作。

+0

謝謝Anony-Mousse,這是正確的路線 – Bagsy