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

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



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



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

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

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



Сейчас больше интересует второе.
...
Рейтинг: 0 / 0
Загрузить XML фалы в таблицу БД
    #39534819
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Загрузить XML фалы в таблицу БД
    #39536981
Личинка DBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Загрузить XML фалы в таблицу БД
    #39536994
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Личинка DBA,

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

Обратите внимание на опцию FORMAT.
...
Рейтинг: 0 / 0
Загрузить XML фалы в таблицу БД
    #39537362
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Загрузить XML фалы в таблицу БД
    #39537904
Личинка DBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bsplesk,

Спасибо.

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

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

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


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

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

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

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

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






надо придумать чтобы COPY сразу одной строкой впихнул XML.
...
Рейтинг: 0 / 0
Загрузить XML фалы в таблицу БД
    #39539357
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
...
Рейтинг: 0 / 0
Загрузить XML фалы в таблицу БД
    #39539363
Личинка DBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Загрузить XML фалы в таблицу БД
    #39541053
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Личинка DBA1) Фалы изменять НЕЛЬЗЯ, т.к. они потом идут дальше Тогда загружайте приложением - читайте содержимое файла и вставляйте через INSERT.

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

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

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


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