Экпорт данных из Postgresql в файл

kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 13:21

Добрый день! В Postgresql в одном поле хранятьсяданные, которые должны сформировать содержимое файла.

Но при экспорте в файл добаляются либо разделители и т.д. А нужно получить файл точно в таком же виде как и в поле.

пробовала использовать вот такой запрос: COPY (SELECT alll FROM super.a_a ) TO 'D:\alll.txt' CSV ;
Но в этом случае, вставляются лишнее кавычки : "
пробовала писать так:
COPY (SELECT alll FROM super.a_a ) TO 'D:\alll.txt CSV QUOTE ' ' ;
Но в таком случае появляются лишние пробелы.


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

trir
Гуру
Сообщения: 3112
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 500
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Экпорт данных из Postgresql в файл

Сообщение trir » 29 июн 2016, 13:57

написать функцию

kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 14:08

Функция может быть реализована с помощью какого языка? На sql я так понимаю этого не сделать?

trir
Гуру
Сообщения: 3112
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 500
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Экпорт данных из Postgresql в файл

Сообщение trir » 29 июн 2016, 14:30


kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 14:37

Я знаю как создаются sql функции, благодарю, trir.

Правда проблема моя в том, что я не представляю алгоритма вовсе. Потому в что в конце концов я буду экпортировать данные с помощью, например того же COPY. А после экспорта в айл никаких манипуляций уже не проделать.

Вся проблема у меяня при экпорте с помощью copy состоит в том, что в данных есть лвойные кавычки, например name="firsname" и при использовании copy я получаю name=""firsname" " либо name=/""firsname/" ".

Если Вы можете меня сориентировать в нужном направлении я буду признательна.

Ariki
Гуру
Сообщения: 704
Зарегистрирован: 12 янв 2011, 22:40
Проекты: 1
Репутация: 278
Ваше звание:

Re: Экпорт данных из Postgresql в файл

Сообщение Ariki » 29 июн 2016, 14:45

Попробуйте так:

Код: Выделить всё

COPY (SELECT alll FROM super.a_a ) TO 'D:\alll.txt' DELIMITER ',' ;

kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 14:55

Ariki писал(а):Попробуйте так:

Код: Выделить всё

COPY (SELECT alll FROM super.a_a ) TO 'D:\alll.txt' DELIMITER ',' ;
Пробовала, в таком случае в тексте повляются символы перевода каретки <property name=/"text/">\r\n .

trir
Гуру
Сообщения: 3112
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 500
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Экпорт данных из Postgresql в файл

Сообщение trir » 29 июн 2016, 15:02

надо написать функцию, которая превратит строку таблицы в текстовую строку нужного формата

kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 15:27

trir писал(а):надо написать функцию, которая превратит строку таблицы в текстовую строку нужного формата
Что вы имеете ввиду под "превратит текстовую строку в строку нужного формата." Имеется ввиду не экпорт текстовой строки в файл, верно я понимаю. А что именно?

То есть функция должна брать строку преобразовать ее во что-то ( у меня в строке уже все записано в нужном ввиде и хранится как текст. Я не сосвем понимаю, что имеется ввиду под "преобразовать в текст")
и потом что-то сделать, после чего уже экспортировать ( выгружать в файл).

Ariki
Гуру
Сообщения: 704
Зарегистрирован: 12 янв 2011, 22:40
Проекты: 1
Репутация: 278
Ваше звание:

Re: Экпорт данных из Postgresql в файл

Сообщение Ariki » 29 июн 2016, 15:35

А это разовая задача или повторяющаяся? Экспортировать нужно одну строку или все строки таблицы? Если все, чем их нужно разделять? Если одну, то можно экспортировать как получится, а потом обработать файл другим инструментом.

Проще всего написать внешний скрипт на Python или любом другом языке программирования, который будет обращаться к БД и делать с данными то, что вам нужно.

kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 15:39

Это постоянная задача и поэтому решать ее через редактирование потом файла не удобно.

Строк может быть различное количество. Одна запись - содержание одного файла.
Содержание каждой записи генирирует функция, на основании данных БД.

Очень много надежд на то, что все же с помощью postgresql спраиться можно. C Pythonom не стакливалась и восем не представляю куда двигаться.

Ariki
Гуру
Сообщения: 704
Зарегистрирован: 12 янв 2011, 22:40
Проекты: 1
Репутация: 278
Ваше звание:

Re: Экпорт данных из Postgresql в файл

Сообщение Ariki » 29 июн 2016, 16:24

Экспортируйте столбец в CSV с параметрами по умолчанию (с "двойными" кавычками). Установите Python 2.7, если у вас его ещё нет. Вот вам скрипт, который принимает на вход CSV-файл с одним столбцом и экспортирует все строки в отдельные файлы:

Код: Выделить всё

import csv
import sys

input_filename = sys.argv[1]
output_prefix = sys.argv[2] if len(sys.argv) > 2 else 'output'

with open(input_filename, 'rb') as input_file:
    reader = csv.reader(input_file, delimiter='\n', quotechar='"')
    for i, row in enumerate(reader):
        with open(output_prefix + '_{0:06d}.txt'.format(i), 'w') as output_file:
            output_file.write(row[0])

Сохраните его в файл с именем, скажем, csv2files.py, и запускайте из консоли:

Код: Выделить всё

python csv2files.py имя_входного_файла.csv префикс_имени_выходных_файлов
Если вам так удобнее, можете прямо в тексте скрипта прописать значения input_filename и output_prefix (лучше абсолютные пути к файлам; обратные слэши нужно экранировать) и запускать скрипт двойным щелчком по иконке.

Код: Выделить всё

input_filename = 'D:\\alll.txt'
output_prefix = 'D:\\output_folder\\text'

kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 17:31

Спасибо, Ariki.
Установила python2.7, в папке D:/data сохранила файл csv2files.py с приложеным Вашим скриптом. И в этой же папке экпортированный csv файл, используя запрос COPY (SELECT alll FROM super.a_a ) TO 'D:\alll.txt CSV.

В консоли выполняю запрос C:\Python27\python D:\data\csv2files.py D:\data\alll.csv ui.
Верно ли я понима, что файлы дожны создаться в папке D:\data? У меня ничего не получилось выполнить, возможно я что-то не верно выполнила?

Ariki
Гуру
Сообщения: 704
Зарегистрирован: 12 янв 2011, 22:40
Проекты: 1
Репутация: 278
Ваше звание:

Re: Экпорт данных из Postgresql в файл

Сообщение Ariki » 29 июн 2016, 17:38

Если в качестве префикса не указан абсолютный путь, то файлы сохранятся в текущий каталог (тот, который у вас отображается в подсказке командной строки). Если скрипт не ругается, значит, где-то он эти файлы сохранил. Попробуйте указать в качестве префикса d:\data\ui

Кстати, проверьте расширение имени файла. А то в запросе SQL у вас D:\alll.txt, а в вызове скрипта D:\data\alll.csv.

kasandra
Активный участник
Сообщения: 140
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: Экпорт данных из Postgresql в файл

Сообщение kasandra » 29 июн 2016, 18:16

Спасибо, разширение файла верно, я когда описывала здесь вставила другой код.

Файлы сгенерировались, но в них в таких случаях как name="firsname" теперь стоит name=/"firsname/"

Ответить

Вернуться в «PostGIS/PostgreSQL»