2011-09-11 18 views
8

Próbuję zaimportować plik rozdzielany tabulatorami do mojej bazy danych PostgreSQL. Jednym z pól w moim pliku jest pole "tytuł", które czasami zawiera rzeczywiste znaki cudzysłowu. Na przykład, mój TSV może wyglądać następująco:Zignorować cudzysłowy podczas importowania pliku CSV do PostgreSQL?

id title 
5  Hello/Bleah" Foo 

(Tak, nie tylko że znak jeden cytat w tytule).

przy próbie importu pliku do mojej bazy danych:

copy articles from 'articles.tsv' with delimiter E'\t' csv header; 

otrzymuję ten błąd, przedstawiających tę linię:

ERROR: unterminated CSV quoted field 

Jak mogę rozwiązać ten problem? Cudzysłowy nie są nigdy używane do otaczania całych pól w pliku. Próbowałem copy articles from 'articles.tsv' with delimiter E'\t' escape E'\\' csv header;, ale pojawia się ten sam błąd w tej samej linii.

Odpowiedz

4

Karta oddzielona jest domyślnym formatem instrukcji kopiowania. Traktowanie ich jako pliku CSV jest po prostu głupie. (Czy bierzesz tę ścieżkę, aby pominąć nagłówek?)

copy articles from 'articles.tsv'; 

robi dokładnie to, co chcesz.

+2

Brzmi dość prosto, ale co, jeśli dane CSV zawierają ukośniki odwrotne jako poprawną treść pola? (tak, natknąłem się na to) Domyślny format dla COPY traktuje ukośnik odwrotny jako znak escape, więc musisz użyć COPY z formatem CSV ... –

+0

Nie myślałem o tym. Tak: to ma sens. – wildplasser

6

Zakładając plik nigdy nie próbuje cytować jego pola:

Opcja chcesz to „napisał:” patrz http://www.postgresql.org/docs/8.2/static/sql-copy.html

Niestety, nie jestem pewien, jak wyłączyć przetwarzanie ofertowe całkowicie, jeden kludge to określenie postaci, która nie pojawia się w twoim pliku.

+10

Fajnie, dzięki! Próbowałem losowo "quote E" \ b'', co skończyło się działaniem. – grautur

+0

@grautur Co znaczy E '\ b'? Backspace? a co z literą "E"? "stała ciągu znaków ewakuacyjnych" - rozumiem. –

Powiązane problemy