Импорт неструктурированного файла Excel в базу данных

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

Файлы, которые я должен импортировать, выглядят так:файл Excel

Модель django имеет следующие атрибуты: Страна, Товар, Год, Стоимость

Итак, как лучше всего читать данные, упорядочивать их в правильной структуре и импортировать в базу данных (желательно с автоматическим обновлением существующих наборов).

Я потратил много времени на изучение существующих библиотек python и django для этих требований (таких как PyExcel, Pandas, Django-Excel, Django-Import-Export), но я не мог понять, какой из них лучший, и если он поддерживает перестановку данных перед импортом.

Я надеюсь, что вы можете дать мне некоторые рекомендации и решения для этой задачи:)

2 ответа

Хорошо, пара вещей. Обратите внимание, что я не эксперт ни в одном из них.

Во-первых, если ваши данные представляют собой файлы Excel, они структурированы. Природа таблицы заключается в структурировании данных. Неструктурированные данные - это что-то вроде текстового файла или каталога текстовых файлов.

Во-вторых, пожалуйста, прочитайте это и следуйте ему при формулировании вопросов: https://stackru.com/help/mcve

В-третьих, ТАК не здесь, чтобы написать весь ваш код для вас. По вашему вопросу вы еще ничего не попробовали, поэтому ваш вопрос был отклонен.

Помимо преамбулы, вы можете использовать библиотеку панд Python для импорта файлов Excel, манипулирования ими и загрузки их в базы данных SQL.

import pandas as pd

df = pd.read_excel('tmp.xlsx')
df2 = pd.melt(df, id_vars = ['Country', 'Commodity'], var_name = 'Year', value_name = 'Value')
df2

вход:

    Country Commodity  2009  2010  2011  2012  2013
0  Austria    Com. 1     1     1     1     1     1
1  Austria    Com. 2     2     2     2     2     2
2  Belgium    Com. 1     3     3     3     3     3
3   France    Com. 1     4     4     4     4     4

выход:

   Country Commodity  Year  Value
0  Austria    Com. 1  2009      1
1  Austria    Com. 2  2009      2
2  Belgium    Com. 1  2009      3
3   France    Com. 1  2009      4
4  Austria    Com. 1  2010      1

Если у вас много файлов Excel, вы можете использовать glob или же os.walk перебирать / перебирать каталог и импортировать некоторые или все файлы Excel.

Вы можете использовать панд DataFrame.to_sql загрузить свои данные в базу данных SQL, которая требует определения соединения с базой данных (адрес сервера, логин / пароль и т. д.).

Это пример для вставки с одним внешним ключом.

    models.py

        from django.db import models

        class Table1(models.Model):
            system = models.CharField(max_length=383)

        class Table2(models.Model):
            name = models.CharField(max_length=383)
            system = models.ForeignKey(Table1, blank=True, null=True, on_delete=models.CASCADE)

Вам нужно создать modelResource и переопределить before_import_row для вставки данных в table1. И вы можете изменить имя для полей и создавать таблицы и настроить. 'column_name' - это имя поля в данных Excel, а атрибут - это имя поля в базе данных. А в методе nefore_import вы можете вставлять данные в таблицы и назначать чужие ключи.

И установите ModelResource в класс администратора.

    admin.py
        from .models import Table1,Table2
        from import_export import resources,widgets
        from import_export.fields import Field
        from django.contrib import admin


        class Table2Resource(resources.ModelResource):
            name = Field(column_name='name',attribute='name')
            system_id = Field(column_name='system', attribute='system_id', widget=widgets.ForeignKeyWidget(Table1))

            class Meta:
                model = Table2
                skip_unchanged = True
                fields = ('name','system_id')

            def before_import_row(self,row, **kwargs):
                value = row['system']
                obj = Table1.objects.create(system = value) #create object place
                row['system'] = obj.id # update value to id ob new object


        @admin.register(Table2)
        class Table2Admin(ImportExportModelAdmin,admin.ModelAdmin):
            resource_class = Table2Resource

Это все.

Другие вопросы по тегам