Импорт данных Excel в PostgreSQL 9.3

Я разработал огромную таблицу в excel и теперь сталкиваюсь с проблемой при переносе ее в базу данных postgresql. Я загрузил программное обеспечение odbc, и я могу открыть таблицу, созданную в postgresql, с помощью excel. Однако я не могу сделать это обратным образом, создавая таблицу в excel и открывая ее в postgresql. Поэтому я хотел бы знать, что это можно сделать таким образом или есть альтернативные способы создания большой таблицы с аргументом pgAdmin III, вставляя исходные данные raw, довольно утомительно.

Заранее благодарим за помощь!

Ответы

Ответ 1

типичный ответ таков:

  • В Excel, File/Save As, выберите CSV, сохраните текущий лист.

  • перенос в каталог хранения на Pg-сервере пользователь postgres может получить доступ к

  • в PostgreSQL:

    COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
    

Но есть и другие способы сделать это. PostgreSQL - это удивительно программируемая база данных. К ним относятся:

  • Напишите модуль в pl/javaU, pl/perlU или другой ненадежный язык, чтобы получить доступ к файлу, проанализировать его и управлять структурой.

  • Используйте CSV и fdw_file для доступа к нему в качестве псевдо-таблицы

  • Используйте DBILink и DBD:: Excel

  • Напишите свою собственную внешнюю оболочку данных для чтения файлов Excel.

Возможности буквально бесконечны....

Ответ 2

Вы также можете использовать консоль psql для выполнения \copy без необходимости отправки файла на сервер Postgresql. Команда такая же:

\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER

Ответ 3

Для python вы можете использовать openpyxl для всех 2010 и более новых форматов файлов (xlsx).

Al Sweigart имеет полный учебник по автоматизации скучных частей на работе с электронными таблицами Excel, что очень важно, и вся книга и сопровождающий курс Удэми большие ресурсы.

Из своего примера

>>> import openpyxl
>>> wb = openpyxl.load_workbook('example.xlsx')
>>> wb.get_sheet_names()
['Sheet1', 'Sheet2', 'Sheet3']
>>> sheet = wb.get_sheet_by_name('Sheet3')
>>> sheet
<Worksheet "Sheet3">

Понятно, что как только вы получите этот доступ, вы можете теперь использовать psycopg для анализа данных в postgres, как обычно.

Это ссылка на список ресурсов питона в python-excel также xlwings предоставляет большой набор возможностей для использования python вместо vba в excel.

Ответ 4

Как объяснено здесь http://www.postgresonline.com/journal/categories/journal/archives/339-OGR-foreign-data-wrapper-on-Windows-first-taste.html

С модулем ogr_fdw можно открыть лист excel в качестве внешней таблицы в pgsql и запросить его прямо как любые другие обычные таблицы в pgsql. Это полезно для чтения данных из той же регулярно обновляемой таблицы

Чтобы сделать это, заголовок таблицы в вашей электронной таблице должен быть чистым, текущий драйвер ogr_fdw не сможет обрабатывать символы ширины или новые строки и т.д. с этими символами, вы, вероятно, не сможете ссылаться на столбец в pgsql из-за проблемы с кодировкой. (Основная причина, по которой я не могу использовать это замечательное расширение.)

Здесь хранятся двоичные файлы предварительной сборки ogr_fdw для окон http://winnie.postgis.net/download/windows/pg96/buildbot/extras/ измените номер версии в ссылке, чтобы загрузить соответствующие сборки. извлеките файл в папку pgsql, чтобы перезаписать одноименные подпапки. перезапустить pgsql. Перед тестовым приводом модуль необходимо установить, выполнив:

CREATE EXTENSION ogr_fdw;

Использование вкратце:

  • используйте ogr_fdw_info.exe для проверки файла excel для списка имен листов

    ogr_fdw_info -s "C:/excel.xlsx"
    
  • используйте "ogr_fdw_info.exe -l" для проверки отдельного листа и создания кода определения таблицы.

    ogr_fdw_info -s "C:/excel.xlsx" -l "sheetname"
    

Выполнение сгенерированного кода определения в pgsql, внешняя таблица создается и отображается в ваш файл excel. он может быть запрошен как обычные таблицы.

Это особенно полезно, если у вас много маленьких файлов с одинаковой структурой таблиц. Просто измените путь и имя в определении, и обновление определения будет достаточно.

Этот плагин поддерживает файлы XLSX и XLS. Согласно документу, он также может записывать данные обратно в файл электронной таблицы, но все причудливое форматирование в вашем excel будет потеряно, файл будет воссоздан при записи.

Если файл excel огромен. Это не будет работать. это еще одна причина, по которой я не использовал это расширение. Он загружает данные за один раз. Но это расширение также поддерживает интерфейс ODBC, должно быть возможно использовать Windows 'ODBC excel file driver для создания источника ODBC для файла excel и использовать ogr_fdw или любую другую внешнюю оболочку данных OGBC для pgsql для запроса этого промежуточного источника ODBC. Это должно быть довольно стабильным.

Недостатком является то, что вы не можете легко изменять местоположение файла или имя в pgsql, как в предыдущем подходе.

Дружеское напоминание. Проблема разрешения распространяется на эти расширения fdw. так как он загружается в службу pgsql. pgsql должен иметь доступ к привилегированным файлам excel.

Ответ 5

Метод, который я использую, заключается в загрузке таблицы в R в качестве data.frame, затем используйте dbWriteTable, чтобы нажать на PostgreSQL. Эти два шага показаны ниже.

Загрузка данных Excel в R

R data.frame объекты похожи на базы данных, где именованные столбцы имеют явные типы, такие как текст или цифры. Существует несколько способов получить таблицу в R, например XLConnect. Однако очень простой способ - выбрать диапазон таблицы Excel (включая заголовок), скопировать его (т.е. CTRL + C), а затем в R использовать эту команду, чтобы получить его из буфера обмена:

d <- read.table("clipboard", header=TRUE, sep="\t", quote="\"", na.strings="", as.is=TRUE)

Если у вас есть RStudio, вы можете легко просмотреть объект d, чтобы убедиться, что он как ожидается.

Нажмите на PostgreSQL

Убедитесь, что у вас установлено RPostgreSQL из CRAN, затем выполните соединение и отправьте data.frame в базу данных:

library(RPostgreSQL)
conn <- dbConnect(PostgreSQL(), dbname="mydb")

dbWriteTable(conn, "some_table_name", d)

Теперь some_table_name должен появиться в базе данных.

Некоторые общие шаги очистки можно выполнить из pgAdmin или psql:

ALTER TABLE some_table_name RENAME "row.names" TO id;
ALTER TABLE some_table_name ALTER COLUMN id TYPE integer USING id::integer;
ALTER TABLE some_table_name ADD PRIMARY KEY (id);

Ответ 6

Я использовал Excel/PowerPivot для создания инструкции postgreSQL insert. Кажется, что это излишний, за исключением случаев, когда вам нужно делать это снова и снова. После того, как данные находятся в окне PowerPivot, я добавляю последовательные столбцы с операторами concatenate для создания 'инструкции insert. Я создаю сплюснутую сводную таблицу с последним и последним столбцом. Скопируйте и вставьте результирующий оператор insert в мою СУЩЕСТВЕННУЮ таблицу postgreSQL с помощью pgAdmin.

Пример таблицы двух столбцов (моя таблица содержит 30 столбцов, из которых я снова и снова импортирую содержимое с одним и тем же Excel/PowerPivot.)

Столбец1 {a, b,...} Столбец2 {1,2,...}

В PowerPivot я добавляю вычисленные столбцы со следующими командами:

Вычисленный столбец 1 имеет "insert into table_name values ('"

Вычисленный столбец 2 имеет CONCATENATE([Calculated Column 1],CONCATENATE([Column1],"','"))

... пока вы не дойдете до последнего столбца, и вам нужно завершить инструкцию insert:

Вычисленная колонка 3 имеет CONCATENATE([Calculated Column 2],CONCATENATE([Column2],"');"

Затем в PowerPivot я добавляю сплющенную сводную таблицу и все инструкции вставки, которые я просто копирую и вставляю в pgAgent.

Результирующие инструкции вставки:

insert into table_name values ('a','1');

insert into table_name values ('b','2');

insert into table_name values ('c','3');

ПРИМЕЧАНИЕ. Если вы знакомы с оператором CONCATENATE с силовым шарниром, вы знаете, что он может обрабатывать только 2 аргумента (гайки). Было бы неплохо, если бы это разрешило больше.

Ответ 7

Вы можете обработать загрузку содержимого файла excel, написав код Java, используя Apache POI library (https://poi.apache.org/). Библиотека разработана для работы с данными офисных приложений MS, включая Excel.

Недавно я создал приложение на основе технологии, которая поможет вам загружать файлы Excel в базу данных Postgres. Приложение доступно под http://www.abespalov.com/. Приложение тестируется только для Windows, но должно работать и для Linux.

Приложение автоматически создает необходимые таблицы с теми же столбцами, что и в файлах Excel, и заполняет таблицы содержимым. Вы можете экспортировать несколько файлов параллельно. Вы можете пропустить шаг для преобразования файлов в формат CSV. Приложение обрабатывает форматы xls и xlsx.

Общие этапы применения:

  • Загрузите содержимое файла excel. Вот код в зависимости от расширения файла:

{

fileExtension = FilenameUtils.getExtension(inputSheetFile.getName());
    if (fileExtension.equalsIgnoreCase("xlsx")) {
        workbook = createWorkbook(openOPCPackage(inputSheetFile));
    } else {
        workbook =     
        createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile));
    }

sheet = workbook.getSheetAt(0);

}

  1. Установить соединение JDBC Postgres
  2. Создать таблицу Postgres
  3. Итерируйте по листу и вставьте строки в таблицу. Вот фрагмент кода Java:

{

Iterator<Row> rowIterator = InitInputFilesImpl.sheet.rowIterator();

//skip a header
if (rowIterator.hasNext()) {
    rowIterator.next();
}
while (rowIterator.hasNext()) {
    Row row = (Row) rowIterator.next();
    // inserting rows
}  

}

Здесь вы можете найти все Java-код для приложения, созданного для экспорта excel в Postgres (https://github.com/palych-piter/Excel2DB).