скопировать файл фиксированной ширины через psql в таблицу PostgreSQL - Ошибка: слишком длинное значение для символа типа
У меня есть файл фиксированной ширины из переписи населения США. Это тот, который находится в zip-архиве и называется "orgeo2010.sf1". ZIP-архив - это большой файл. Я хочу прочитать этот файл в таблице в PostgreSQL 12.1. Вот как я построил стол.
create table census_2010.geo_header_sf1
(
fileid varchar(6),
stusab varchar(2),
sumlev varchar(3),
geocomp varchar(2),
chariter varchar(3),
cifsn varchar(2),
logrecno integer PRIMARY KEY,
region varchar(1),
division varchar(1),
state varchar(2),
county varchar(3),
countycc varchar(2),
countysc varchar(2),
cousub varchar(5),
cousubcc varchar(2),
cousubsc varchar(2),
place varchar(5),
placecc varchar(2),
placesc varchar(2),
tract varchar(6),
blkgrp varchar(1),
block varchar(4),
iuc varchar(2),
concit varchar(5),
concitcc varchar(2),
concitsc varchar(2),
aianhh varchar(4),
aianhhfp varchar(5),
aianhhcc varchar(2),
aihhtli varchar(1),
aitsce varchar(3),
aits varchar(5),
aitscc varchar(2),
ttract varchar(6),
tblkgrp varchar(1),
anrc varchar(5),
anrccc varchar(2),
cbsa varchar(5),
cbsasc varchar(2),
metdiv varchar(5),
csa varchar(3),
necta varchar(5),
nectasc varchar(2),
nectadiv varchar(5),
cnecta varchar(3),
cbsapci varchar(1),
nectapci varchar(1),
ua varchar(5),
uasc varchar(2),
uatype varchar(1),
ur varchar(1),
cd varchar(2),
sldu varchar(3),
sldl varchar(3),
vtd varchar(6),
vtdi varchar(1),
reserve2 varchar(3),
zcta5 varchar(5),
submcd varchar(5),
submcdcc varchar(2),
sdelem varchar(5),
sdsec varchar(5),
sduni varchar(5),
arealand integer,
areawatr integer,
name varchar(90),
funcstat varchar(1),
gcuni varchar(2),
pop100 integer,
hu100 integer,
intptlat varchar(11),
intptlon varchar(12),
lsadc varchar(2),
partflag varchar(1),
reserve3 varchar(6),
uga varchar(5),
statens varchar(8),
countyns varchar(8),
cousubns varchar(8),
placens varchar(8),
concitns varchar(8),
aianhhns varchar(8),
aitsns varchar(8),
anrcns varchar(8),
submcdns varchar(8),
cd113 varchar(2),
cd114 varchar(2),
cd115 varchar(2),
sldu2 varchar(3),
sldu3 varchar(3),
sldu4 varchar(3),
sldl2 varchar(3),
sldl3 varchar(3),
sldl4 varchar(3),
aianhhsc varchar(2),
csasc varchar(2),
cnectasc varchar(2),
memi varchar(1),
nmemi varchar(1),
puma varchar(5),
reserved varchar(18)
);
Я пытался читать из файла напрямую с помощью:
Decennial_2010=# COPY census_2010.geo_header_sf1
Decennial_2010-# FROM 'D:\projects_and_data\data\PostgreSQL\data\data\or2010.sf1\orgeo2010.sf1';
ERROR: value too long for type character varying(6)
CONTEXT: COPY geo_header_sf1, line 1, column fileid: "SF1ST OR04000000 00000014941
Когда это не сработало, я подумал, может быть, я смогу импортировать его в R (я знаю достаточно R для управления R), отредактировать его и написать новый файл FWF. Я попробовал с новым файлом и получил тот же результат.
Decennial_2010=# COPY census_2010.geo_header_sf1
Decennial_2010-# FROM 'D:/projects_and_data/data/PostgreSQL/data/data/geo_a' CSV HEADER;
ERROR: value too long for type character varying(6)
CONTEXT: COPY geo_header_sf1, line 2, column fileid: "SF1ST OR 40000 14941
Это первая строка фрейма данных, содержащая файл в R и write.fwf()
чтобы записать новый файл, который не работал. Я знаю, что должен использоватьdput(td[1,])
, но затем он печатает все уровни для всех факторов во всех строках (200000+), а затем вывод из dput()
даже не умещается во всем печатном пространстве консоли. Поэтому я просто скопирую и вставлю строку в том виде, в котором она отображается по умолчанию. Сожалею.
td[1,]
fileid stusab sumlev geocomp chariter cifsn logrecno region division state
1 SF1ST OR 40 00 0 NA 1 4 9 41
county countycc countysc cousub cousubcc cousubsc place placecc placesc tract
1 NA NA NA NA NA NA NA
blkgrp block iuc concit concitcc concitsc aianhh aianhhfp aianhhcc aihhtli
1 NA NA NA NA NA NA NA NA
aitsce aits aitscc ttract tblkgrp anrc anrccc cbsa cbsac metdiv csa necta
1 NA NA NA NA NA NA NA NA NA NA
nectasc nectadiv cnecta cbsapci nectapci ua uasc uatype ur cd sldu sldl vtd
1 NA NA NA NA NA NA NA NA NA NA NA
vtdi reserve2 zcta5 submcd submcdcc sdelem sdsec sduni arealand
1 NA NA NA NA NA NA NA 248607802255
areawatr
1 6191433228
name
1 Oregon
funcstat gcuni pop100 hu100 intptlat intptlon lsadc partflag reserve3 uga
1 A ! 3831074 1675562 43.97152 -120.6226 00 NA NA
statens countyns cousubns placens concitns aianhhns aitsns anrcns submcdns
1 1155107 NA NA NA NA NA NA NA NA
cd113 cd114 cd115 sldu2 sldu3 sldu4 sldl2 sldl3 sldl4 aianhhsc csasc cnectasc
1 NA NA NA NA NA NA NA NA NA NA NA NA
memi nmemi puma reserved
1 NA NA NA NA
library(gdata)
write.fwf(td, "D:/projects_and_data/data/PostgreSQL/data/data/geo_a", sep="")
Что нужно изменить в таблице или в исходном файле, чтобы файл копировался в таблицу в PostgreSQL?