Python Postgresql: игнорирование последнего столбца из CSV-файла - PullRequest
2 голосов
/ 31 марта 2011

У меня проблема с импортом файла CSV.Я использую команду COPY FROM из postgresql, чтобы скопировать файл CSV в таблицу с двумя столбцами.

У меня есть файл CSV в следующем формате;

"1";"A"
"2";"B"
"3";"C";"CAD450"
"4";"D";"ABX123"

Я хочу импортировать все эти строки файла CSV в таблицу, но я хочу пропустить все дополнительные добавленные столбцы.

В настоящее время я пропускаю любые строки, содержащие дополнительные столбцы, например, здесь пропускаются столбцы "1";"C";"CAD450" и "1";"D";"ABX123", и я импортирую только первые два столбца.Но я хочу скопировать все эти четыре строки в мою таблицу.Так есть ли способ, где я могу игнорировать последний столбец и скопировать все четыре строки в мою таблицу, как это

"1";"A"
"1";"B"
"1";"C"
"1";"D"

Ответы [ 4 ]

2 голосов
/ 31 марта 2011

Пропустить его через cut или awk (как предложено выше) проще, чем использовать python / psycopg.

cat csv_file.csv | cut -d';' -f1,2 | psql -u USER DATABASE -c "COPY table FROM STDIN WITH DELIMITER ';';"

2 голосов
/ 31 марта 2011

Предварительно обработайте файл с помощью awk, чтобы удалить лишние столбцы:

awk -F';' '{print $1 ";" $2 }' > new_file.csv
1 голос
/ 31 марта 2011

Множество способов решения проблемы.
Я бы, наверное, сделал что-то вроде этого:

import csv
import psycopg2
dr = csv.DictReader(open('test.csv','rb'), 
                    delimiter=';',
                    quotechar='"',
                    fieldnames=['col1','col2']) # need not specify other cols
CONNSTR = """
  host=127.0.0.1 
  dbname=mydb
  user=me
  password=pw
  port=5432"""
cxn = psycopg2.connect(CONNSTR)
cur = cxn.cursor()
cur.execute("""CREATE TABLE from_csv (
               id serial NOT NULL,
               col1 character varying,
               col2 character varying,
               CONSTRAINT from_csv_pkey PRIMARY KEY (id));""")
cur.executemany("""INSERT INTO from_csv (col1,col2) 
                   VALUES (%(col1)s,%(col2)s);""", dr)
cxn.commit()
1 голос
/ 31 марта 2011
with open("file.csv","r") as f:
    t=[line.strip().split(";")[:2] for line in f]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...