Двойные кавычки в конце каждой строки при записи из / в .CSV - PullRequest
0 голосов
/ 23 января 2012

Может ли кто-нибудь помочь мне удалить эти двойные кавычки в начале / конце каждой строки?

У меня есть большой CSV (800 тыс. Строк) и я хочу создать оператор вставки для передачи данных в базу данных SQL.Я знаю, что код действительно ужасен, но я никогда раньше не использовал 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'])

Ответы [ 2 ]

0 голосов
/ 24 января 2012

Вы не пишете файл CSV . Не используйте для этого csv writer, так как он, вероятно, добавляет дополнительный ascaping к вашим данным. Вместо этого используйте

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 голосов
/ 23 января 2012

Сначала 2 указателя: -
1) Используйте тройные кавычки для многострочных строк над тройными апострофами.
2) Нет необходимости ставить «\ n \» в многострочных строках.

Чтобы удалить кавычки из строки, используйте модуль регулярных выражений python вместо замены строки.

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

Или вы бы использовали полосу с персонажем, которого хотите удалить с обоих концов; только один символ за раз AFAIK: -

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

Наконец, не используйте модуль csv для вывода файла, так как он ожидает 'context'. Просто откройте файл и напишите в него.

ofile = file( 'canada_inserts.sql','w' )
ofile.write( createTableCmd + '\n' )
for row in reader:
...
   ofile.write( query + '\n' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...