Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Загрузка данных из файла / 6 сообщений из 6, страница 1 из 1
09.10.2007, 23:31
    #34858669
Zashibis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из файла
Доброе время суток!

Вопрос: можно ли чем-то кроме COPY загрузить данные из текстового файла формата
Код: plaintext
1.
2.
поле;поле;поле
поле;поле;поле
COPY не подходит, поскольку разделитель для него - одиночный символ, а хотелось бы двойной ";;", но это еще не так страшно, а вот разделитель между строками - исключительно перенос строки, и ничего другого туда не подсунешь.
Проблема появилась из-за того, что выгружаются данные из MS SQL Server, и некоторые текстовые поля содержат в себе знаки ";", кавычки и символы переноса строки, что весьма и весьма неблагоприятно сказывается на текстовом файле.
Данные выгружаю через bcp, в разделе о MS SQL задал вопрос, можно ли заставить bcp выгружать данные в формате
Код: plaintext
1.
2.
"поле";"поле";"поле"
"поле";"поле";"поле"
заменив кавычки на что-нибудь редко используемое, тогда и COPY прокатит.
И вообще, может кто-то сталкивался с этим?

Спасибо.
...
Рейтинг: 0 / 0
10.10.2007, 00:56
    #34858749
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из файла
Конечно сталкивались , о внимательный читатель документации и форума.
Обрати взор свой орлиный на раздел про CSV и Binary форматы, а если что не так
- да пребудет с тобой сила Perl ! ;-D
Впрочем для ленивых вроде есть коммерческий DataPumper для постгреса .
...
Рейтинг: 0 / 0
10.10.2007, 11:04
    #34859382
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из файла
Zashibisпоскольку разделитель для него - одиночный символ, а хотелось бы двойной ";;"зачем двойной?

Zashibisразделитель между строками - исключительно перенос строки, и ничего другого туда не подсунешь.зачем другое?

Zashibisнекоторые текстовые поля содержат в себе знаки ";", кавычки и символы переноса строкиcopy позволяет загружать разделители, кавычки и переносы строк в качестве данных
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table t1 ( id integer, value text );

copy t1 from stdin csv delimiter ',' quote '"' escape '"';

 1 ,simple
 2 ,"quo""te"
 3 ,"delim,iter"
 4 ,"new
line"
\.

select * from t1;

 id |   value
----+------------
   1  | simple
   2  | quo"te
   3  | delim,iter
   4  | new
line
( 4  rows)

ZashibisДанные выгружаю через bcpbcp может выгружать в csv?

Zashibisзаменив кавычки на что-нибудь редко используемое, тогда и COPY прокатитнет. надо, чтобы bcp escape-ил quote-ы
...
Рейтинг: 0 / 0
10.10.2007, 11:31
    #34859513
Zashibis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из файла
Ну на сколько я понял, осталось только научиться выгружать данные из MS SQL в приемлемом формате с экранированными строками и заэскейпенными кавычками в них...причем как-то автоматизировать сей процесс, ибо выгружать 2-3 сотни таблиц ручками занятие неблагодарное...
Пойду потеррорезирую форум по MS SQL
...
Рейтинг: 0 / 0
10.10.2007, 16:19
    #34860853
Zashibis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из файла
Файл создать удалось, теперь еще маленький вопросик:
В таблицах, в которые вставлялись данные есть поля SERIAL UNIQUE и после вставки данных через COPY счетчики в последовательностях естесственно остались на прежних значениях.
Т.е.
Код: plaintext
1.
2.
3.
CREATE TABLE temp(one serial UNIQUE, two INT);
COPY temp FROM бла бла бла;
INSERT INTO temp VALUES (default,  1 );
выполнится с ошибкой, т.к. будет попытка в поле one вставить значение 1, а оно уже было вставлено через COPY (и не только оно).
По большому счету нужно сделать процедурку
Код: plaintext
1.
2.
3.
4.
5.
declare n int;
begin
select MAX(one) FROM temp INTO n;
setval('temp_one_seq', n)
end
и все будет работать. Но т.к. пишу боле мене автоматизированный скриптик, то хотелось бы определять, есть ли в таблице поля serial, и если есть, то выполнять вышеописанную процедуру.

Вопрос: как определять, есть ли SERIAL в таблице и имя этого столбца?
...
Рейтинг: 0 / 0
10.10.2007, 17:42
    #34861205
Zashibis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из файла
что-то типа
Код: plaintext
1.
select attname from pg_attribute,pg_attrdef where attrelid=(select relfilenode from pg_class where relname='имя таблицы') and attrelid=adrelid and adnum=attnum;
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Загрузка данных из файла / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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