2017-02-15 2 views
1

У меня есть текстовый файл для импорта в следующем формате:PostgreSQL 9.5: Пропустить первые две строки в текстовом файле

columA | columnB | columnC 
----------------------------------------- 
1  |  A   | XYZ 
2  |  B   | XZ 
3  |  C   | YZ 

Я могу пропустить первую строку с помощью:

WITH CSV HEADER; 

в копии команда, но застряла, пропуская вторую строчку.

+0

'COPY FROM 'file'', или' COPY FROM STDIN'? –

+0

@NickBarnes, 'COPY FROM file'. Вот что я использую 'COPY data_table FROM 'X: \ File.txt' с разделителем '|' CSV HEADER; '. – MAK

ответ

2

Если вы используете COPY FROM 'filename', вместо этого вы можете использовать COPY FROM PROGRAM для вызова некоторой команды оболочки, которая удаляет заголовок из файла и возвращает остальные.

В Windows:

COPY t FROM PROGRAM 'more +2 "C:\Path\To\File.txt"' 

В Linux:

COPY t FROM PROGRAM 'tail -n +3 /path/to/file.txt' 

Если вы пытаетесь отправить локальный файл на удаленный сервер, вы можете сделать что-то подобное через psql, например:

tail -n +3 file.txt | psql -c 'COPY t FROM STDIN' 
+0

Ничего себе !! Огромное спасибо. – MAK

+0

Это работает только тогда, когда сервер может напрямую обращаться к файлу. Если файл находится на другом компьютере (то есть клиент, обращающийся к серверу через psql или библиотеку/фреймворк), это не сработает. – Patrick

+0

@Patrick: Спасибо, определенно стоит упомянуть. Я добавил пример psql на стороне клиента. Если вы запускаете 'COPY FROM STDIN' через клиентскую библиотеку, вы, возможно, просто установите позицию потока самостоятельно, прежде чем передавать ее. –

0

Команда COPY может пропустить только первую строку. Самое простое решение - вручную удалить вторую строку перед импортом, но если это невозможно, вам придется использовать «грязный» трюк.

Вы создаете таблицу, которая имеет один столбец типа varchar и импортирует текстовый файл в эту таблицу. После импорта вы запускаете функцию PL/pgSQL для чтения всех строк в таблице (за исключением строк заголовка, очевидно) и извлекаете информацию, которую хотите вставить в таблицу назначения, например, с помощью функции regexp_matches() или regexp_split_to_array(). Вы также можете автоматизировать весь процесс, используя триггер после вставки в таблицу импорта, если вам нужно импортировать много файлов с той же проблемой.

Смежные вопросы