Приведение столбца при использовании COPY FROM для импорта данных из CSV - PullRequest
0 голосов
/ 24 апреля 2020

Используя PostgreSQL 12, я пытаюсь импортировать данные из CSV в следующем формате:

country,state,county,lat,lng,type,measure,beds,population,year,source,source_url
US,AK,ketchikan gateway,63.588753,-154.493062,ICU,1000HAB,3.928701,13745,2018,arcgis,https://services1.arcgis.com/Hp6G80Pky0om7QvQ/arcgis/rest/services/Hospitals_1/FeatureServer/0
US,AK,kodiak island,63.588753,-154.493062,ACUTE,1000HAB,,n,2018,arcgis,https://services1.arcgis.com/Hp6G80Pky0om7QvQ/arcgis/rest/services/Hospitals_1/FeatureServer/0

Обратите внимание, что в поле "заполнение" второго ряда вместо n указано пустое значение. Моя цель состоит в том, чтобы импортировать CSV, чтобы столбец "population" был BIGINT, а "n" был заменен на NULL. Мое текущее решение:

CREATE TABLE temp_table
(
    country CHAR(2),
    state CHAR(2),
    county VARCHAR(255),
    lat DOUBLE PRECISION,
    lng DOUBLE PRECISION,
    type VARCHAR(11),
    measure VARCHAR(255),
    beds DOUBLE PRECISION,
    pop VARCHAR(255),
    year SMALLINT,
    source VARCHAR(255),
    source_url VARCHAR(255)
);

COPY temp_table 
FROM 'C:\\Users\\mconr\\Downloads\\global-hospital-beds-capacity-for-covid19\\hospital_beds_USA_v1.CSV' 
WITH (DELIMITER ',', FORMAT CSV, HEADER TRUE);

SELECT country, state, county, lat, lng, type, measure, beds, CAST (NULLIF (pop, 'n') AS BIGINT) AS population, year, source, source_url 
INTO USA
FROM temp_table;

DROP TABLE temp_table;

Мое текущее решение состоит в том, чтобы создать временную таблицу, в которой «население» равно VARCHAR (255), импортировать данные, создать новую таблицу из инструкции SELECT, которая заменяет «n» с NULL и приводит столбец к BIGINT, затем удаляет временную таблицу. Однако это кажется немного неэффективным, так как я создаю и удаляю промежуточную таблицу. Кто-нибудь знает лучший способ сделать это?

1 Ответ

0 голосов
/ 24 апреля 2020

Вы можете установить параметр NULL в 'n', но тогда это нарушит другие случаи, когда нулевые поля представляются обычным способом (пустой строкой без кавычек), а не 'n'. COPY не позволяет вам устанавливать NULL для каждого столбца.

Ваш текущий метод мне подходит, я бы выбрал его первым (кроме исправления генератора этого файла, который может быть вне вашего контроля). Вы также можете написать что-нибудь с помощью Perl или awk или sed, которое отредактирует файл в виде потока, чтобы превратить ', n,' в ',,' и подключить его к КОПИРОВАНИЮ с помощью функции ПРОГРАММА, но это кажется сложным и подвержен ошибкам, и я сомневаюсь, что прирост эффективности был бы таким большим.

Это выглядит как одна из тех преждевременных оптимизаций, которая является root для большинства зла. Это действительно значимая проблема?

...