2013-03-29 8 views
5

Mam pytanie dotyczące polecenia COPY w PostgreSQL. Mam plik CSV, który chcę tylko skopiować niektóre wartości kolumn do mojej tabeli PostgreSQL.Polecenie COPY: kopiuje tylko określone kolumny z csv

Czy można to zrobić? Jestem zaznajomiony z użyciem polecenia COPY, aby skopiować wszystkie dane z pliku CSV do tabeli, używając nagłówka do odwzorowania na nazwy kolumn, ale w jaki sposób jest to możliwe, gdy chcę tylko niektórych kolumn?

Odpowiedz

7

Albo wstępnie przetworzyć pliku CSV lub (co pewnie zrobiłby) przywóz na tymczasową kopię tabeli docelowej i INSERT tylko wybranych kolumn w drugim etapie:

CREATE TEMP TABLE tmp AS SELECT * FROM target_table LIMIT 0; 
ALTER TABLE tmp ADD COLUMN etra_column1 text 
      , ADD COLUMN etra_column2 text; -- add excess columns 
COPY tmp FROM '/path/tp/file.csv'; 

INSERT INTO target_table (col1, col2, col3) 
SELECT col1, col2, col3 FROM tmp -- only reelvant columns 
WHERE ... -- optional, to also filter rows 

tabeli tymczasowej jest automatycznie zrzucone na koniec sesji. Jeśli przetwarzanie trwa dłużej, użyj zwykłej tabeli.

+0

Okay, super, to świetna informacja. Myślałem o wstępnym przetworzeniu pliku CSV, ale tabela tymczasowa wydaje się być znacznie łatwiejsza. Dziękuję Ci! – parchambeau

+0

Wszelkie wskazówki, czy tabela jest * ogromna * - rozmiar gigabajtów? – Chloe

+0

@Chloe: To zależy od szczegółów i wymagań. Twoja wersja PostgreS, rozmiar tabeli i pliku CSV, szerokość wiersza, ile nadmiarowych kolumn, dostępnych zasobów, uprawnienia administratora, dostęp równoległy, dane w CSV są spójne? Itd. Proponuję rozpocząć nowe pytanie ze szczegółami. dzięki za edycję, BTW, rzeczywiście byłem skupiony na wybieraniu wierszy zamiast kolumn. –

Powiązane problemy