Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Загрузить XML фалы в таблицу БД / 15 сообщений из 15, страница 1 из 1
11.10.2017, 15:03
    #39534757
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
Добрый день.

Есть задача: Загрузить XML фалы в таблицу БД.



Подскажите, как это можно реализовать с помощью postgres ?



Задачу разбил на две части:

1) прочитать фалы из дирректории по заданной маске.

2) загрузить файлы в таблицу.



Сейчас больше интересует второе.
...
Рейтинг: 0 / 0
11.10.2017, 16:11
    #39534819
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
...
Рейтинг: 0 / 0
16.10.2017, 16:29
    #39536981
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
vyegorovЛичинка DBA,

https://www.postgresql.org/docs/current/static/sql-copy.html

Спасибо.

Пробую так:
Код: sql
1.
COPY test_xml FROM 'C:\xml\test.xml';



Когда создаю табличку
Код: sql
1.
CREATE TABLE test_xml(xml text);


Заливается 148 строк вместо 1 xml документа.

Когда создаю как xml
Код: sql
1.
CREATE TABLE test_xml(xml xml);


Выдает ошибку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
ОШИБКА:  invalid XML content
CONTEXT:  COPY test_xml, строка 1, колонка xml: "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"
********** Ошибка **********

ОШИБКА: invalid XML content
SQL-состояние: 2200N
Контекст: COPY test_xml, строка 1, колонка xml: "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"
...
Рейтинг: 0 / 0
16.10.2017, 16:46
    #39536994
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
Личинка DBA,

Вы не разобрались с командой COPY. Поэтому и получаете всякую фигню.

Обратите внимание на опцию FORMAT.
...
Рейтинг: 0 / 0
17.10.2017, 11:25
    #39537362
Bsplesk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
copy ? причем тут copy? она создана для загрузки данных из "большого" файла с множеством записей, а xml часто грузится как один "blob", ну пусть будет copy.

Создадим тестовую табличку:

Код: plsql
1.
2.
3.
4.
5.
6.
create table curs_valut (
	id serial not null,											
	date_currency timestamp with time zone NOT NULL DEFAULT now(),
	currency_rate xml not null,
	primary key (id) 
);	



Для примера обратимся к сайту cbr.ru, и получим курсы (в виде xml-файлов/и заменим code-page на UTF-8[БД допустим у нас в UTF-8]) валют за декабрь 2014 (месяц очередной девальвации с последующей деноминацией в РФ)

Код: plsql
1.
$ for i in 0{1..9} {10..31}; do curl -H "Content-Type: text/xml" http://www.cbr.ru/scripts/XML_daily.asp?date_req=$i/12/2014 | iconv -f=cp1251  -t=UTF-8 | sed -e 's/windows-1251/UTF-8/g' | sed 's/^[ \t]*//' | tr -d '\r\n'   > ex$i.xml ; done



Выше немного "магии", т.к. dbcopy загружает по строкам, то преобразуем в строку.

Пробуем загрузить в БД:
Код: plsql
1.
2.
\copy curs_valut (currency_rate) FROM '/home/test_load_xml/ex01.xml'
COPY 1



Проверяем:
Код: plsql
1.
select xpath('//ValCurs/@Date', currency_rate) textcol from curs_valut;



Получаем:
Код: php
1.
2.
3.
textcol      |
-------------|
{29.11.2014} |



p.s. использована shell/linux.
Под win аналогично легко написать на vbs.
...
Рейтинг: 0 / 0
18.10.2017, 11:04
    #39537904
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
Bsplesk,

Спасибо.

С этим разобрался. :)
...
Рейтинг: 0 / 0
18.10.2017, 13:46
    #39538036
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
ursidoЛичинка DBA,

Вы не разобрались с командой COPY.

Обратите внимание на опцию FORMAT.


Можете подробнее написать какой формат использовать?

Что-то запутался.
...
Рейтинг: 0 / 0
18.10.2017, 14:33
    #39538077
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
в бинарном не загружается.

в csv загружается так же как в текстовом.

в текстовом вместо 1 строки загружается куча.
...
Рейтинг: 0 / 0
18.10.2017, 14:33
    #39538079
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
Наверное как-то надо избавляться от символов перевода на новую строку. но как не знаю.
...
Рейтинг: 0 / 0
18.10.2017, 14:39
    #39538089
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
Личинка DBAНаверное как-то надо избавляться от символов перевода на новую строку. но как не знаю.

copy может вырезать символы перевода на другую строку?
...
Рейтинг: 0 / 0
18.10.2017, 14:47
    #39538101
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
вопрос актуален
...
Рейтинг: 0 / 0
18.10.2017, 15:22
    #39538135
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
реализовал пока через ...
через loop криво залитые данные парьсяться и вырезаются перенос на новую строку.






надо придумать чтобы COPY сразу одной строкой впихнул XML.
...
Рейтинг: 0 / 0
20.10.2017, 10:20
    #39539357
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
Личинка DBAcopy может вырезать символы перевода на другую строку?Нет, это задача приложения.

It is strongly recommended that applications generating COPY data convert data newlines and carriage returns to the \n and \r sequences respectively.
https://www.postgresql.org/docs/10/static/sql-copy.html

Код: sql
1.
2.
3.
4.
5.
cat <<END | psql -c "copy t1 from stdin with(format csv)"
"<foo>
    <bar baz=""1""/>
</foo>"
END
...
Рейтинг: 0 / 0
20.10.2017, 10:27
    #39539363
Личинка DBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
LeXa NalBatЛичинка DBAcopy может вырезать символы перевода на другую строку?Нет, это задача приложения.

It is strongly recommended that applications generating COPY data convert data newlines and carriage returns to the \n and \r sequences respectively.
https://www.postgresql.org/docs/10/static/sql-copy.html

Код: sql
1.
2.
3.
4.
5.
cat <<END | psql -c "copy t1 from stdin with(format csv)"
"<foo>
    <bar baz=""1""/>
</foo>"
END




1) Фалы изменять НЕЛЬЗЯ, т.к. они потом идут дальше
2) в винде нет cat
...
Рейтинг: 0 / 0
24.10.2017, 13:50
    #39541053
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить XML фалы в таблицу БД
Личинка DBA1) Фалы изменять НЕЛЬЗЯ, т.к. они потом идут дальше Тогда загружайте приложением - читайте содержимое файла и вставляйте через INSERT.

Потому что COPY умеет загружать из текстового COPY формата (text) или бинарного COPY формата (binary) или общепринятого CSV формата (csv). А вы не можете (или не хотите) перед загрузкой перевести ваши данные из сырого текстового формата в текстовый COPY формат или в общепринятый CSV формат.

В вашем формате вы хотите, чтобы COPY интерпретировал содержимое входного файла целиком как единственное значение - и без квотирования (как в формате csv), и без экранирования (как в формате text). И вставил бы его одной строкой в некоторое поле некоторой таблицы. COPY так не умеет делать. Возможно, потому, что предназначается для другой задачи - загрузки большого количества строк.

Личинка DBA2) в винде нет catУ меня нет винды. Я привел пример загрузки xml в формате csv.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Загрузить XML фалы в таблицу БД / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]