Pull to refresh

Comments 5

На практике оказалось удобно использовать dfb для импорта в postgres. Весьма быстро, а pgdb есть в пакетах.

Вливаем таблицу в схему данных geodata:
pgdbf ./ADDROBJ.DBF |iconv -f CP866 -t utf8|awk '{sub(«CREATE TABLE »,«CREATE TABLE geodata.»); sub("\COPY ","\COPY geodata."); sub(«timeout=60000»,«timeout=999999»); print }'|psql mydatabase
Спасибо. Не знал. Обязательно попробую. Но, исправлять несогласованность данных ФИАС все равно придется.
Пусть спустя год, но может кому пригодится.
Сейчас они стали бить файлы DBF на сотню более мелких, так что загрузить их с помощью однострочника (и тем более через excel) невозможно, пришлось его на коленке усовершенствовать до такого скрипта:
Код
#!/bin/bash

# Загрузка данных ФИАС из DBF

# Настройки
dbf_path='dbf' # Путь к каталогу с файлами
schema_name='fias.' # Схема БД (с точкой)
username='user'
password='pass'
db_mame='export'
db_host='host'
db_port='5432'


export PGUSER=$username
export PGPASSWORD=$password

# Загружается первая таблица ADDROB01 с созданием в БД
echo 'Загрузка таблицы ADDROBJ...'
pgdbf -s cp866 $dbf_path'/ADDROB01.DBF'  | awk '{sub("CREATE TABLE ","CREATE TABLE '$schema_name'"); sub("DROP TABLE IF EXISTS","DROP TABLE IF EXISTS '$schema_name'"); sub("COPY ","COPY '$schema_name'"); sub("timeout=60000","timeout=999999");  print }' | psql -h $db_host -p $db_port -d $db_mame

# Загружаются остальные в цикле
for fn in `find $dbf_path -type f -name "ADDROB*" -not -name "ADDROB01.DBF"`
do
	fn_base=`basename "$fn" `
	echo "Файл "$fn_base"..."
	fn_base=`basename -s .DBF "$fn" | sed 's@[^ ]*@\L&@g'`
	pgdbf -CD -s cp866 $fn | awk '{sub("COPY '$fn_base' FROM STDIN","COPY '$schema_name'addrob01 FROM STDIN"); print }' | psql -h $db_host -p $db_port -d $db_mame
done

#######################################

# То же самое с домами
echo 'Загрузка таблицы HOUSE...'
pgdbf -s cp866 $dbf_path'/HOUSE01.DBF'  | awk '{sub("CREATE TABLE ","CREATE TABLE '$schema_name'"); sub("DROP TABLE IF EXISTS","DROP TABLE IF EXISTS '$schema_name'"); sub("COPY ","COPY '$schema_name'"); sub("timeout=60000","timeout=999999");  print }' | psql -h $db_host -p $db_port -d $db_mame

for fn in `find $dbf_path -type f -name "HOUSE*" -not -name "HOUSE01.DBF"`
do
	fn_base=`basename "$fn" `
	echo "Файл "$fn_base"..."
	fn_base=`basename -s .DBF "$fn" | sed 's@[^ ]*@\L&@g'`
	pgdbf -CD -s cp866 $fn | awk '{sub("COPY '$fn_base' FROM STDIN","COPY '$schema_name'house01 FROM STDIN"); print }' | psql -h $db_host -p $db_port -d $db_mame
done

echo 'OK'

Огромное спасибо)
у меня сработало сразу, без танцев с бубнами)
хотя уже был готов сам такое написать, когда увидел кучу мелких файлов
Пусть два года спустя, но вдруг кому-то пригодится.
Мы сотню файлов с домами заливаем один в один, получаем сотню таблиц. Далее, делаем эти таблицы партициями одной большой таблицы. Разделение по коду региона.
addrob
-- таблица addrob сделана по образу и подобию любой таблицы по одному региону
CREATE TABLE public.addrob
(
  actstatus numeric(2,0),
  aoguid character varying(36),
  aoid character varying(36),
  aolevel numeric(2,0),
  areacode character varying(3),
  autocode character varying(1),
  centstatus numeric(2,0),
  citycode character varying(3),
  code character varying(17),
  currstatus numeric(2,0),
  enddate date,
  formalname character varying(120),
  ifnsfl character varying(4),
  ifnsul character varying(4),
  nextid character varying(36),
  offname character varying(120),
  okato character varying(11),
  oktmo character varying(11),
  operstatus numeric(2,0),
  parentguid character varying(36),
  placecode character varying(3),
  plaincode character varying(15),
  postalcode character varying(6),
  previd character varying(36),
  regioncode character varying(2),
  shortname character varying(10),
  startdate date,
  streetcode character varying(4),
  terrifnsfl character varying(4),
  terrifnsul character varying(4),
  updatedate date,
  ctarcode character varying(3),
  extrcode character varying(4),
  sextcode character varying(3),
  livestatus numeric(2,0),
  normdoc character varying(36),
  plancode character varying(4),
  cadnum character varying(100),
  divtype numeric(1,0)
) PARTITION BY LIST (regioncode);


добавляем составляющие партиции
-- добавим партиции к таблиции
ALTER TABLE addrob ATTACH PARTITION addrob01 FOR VALUES IN ('01');
ALTER TABLE addrob ATTACH PARTITION addrob02 FOR VALUES IN ('02');
ALTER TABLE addrob ATTACH PARTITION addrob03 FOR VALUES IN ('03');
...

-- так как в таблицах с домами нет поля с кодом региона, добавим его
ALTER TABLE house01 ADD COLUMN regioncode character varying(2) DEFAULT ('01');
ALTER TABLE house02 ADD COLUMN regioncode character varying(2) DEFAULT ('02');
ALTER TABLE house03 ADD COLUMN regioncode character varying(2) DEFAULT ('03');
ALTER TABLE house04 ADD COLUMN regioncode character varying(2) DEFAULT ('04');
...

-- и тоже объединим
ALTER TABLE house ATTACH PARTITION house01 FOR VALUES IN ('01');
ALTER TABLE house ATTACH PARTITION house02 FOR VALUES IN ('02');
....

Sign up to leave a comment.

Articles

Change theme settings