Импорт CSV в MySql рабочую таблицу с разными столбцами - PullRequest
0 голосов
/ 08 апреля 2020

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

Столбцы CSV следующие:

Company_Code, Company_Name, Year, Account_number, Account_Description, Value

Я намерен использовать этот CSV для заполнить 3 таблицы в моей БД в MySQL Workbench. Эти таблицы отвечают за организацию:

  • company_data: идентификатор, код и имя.

  • Счета: идентификатор, номер счета и описание учетной записи.

  • Значения: companyID, accountID, год и значение.

table diagramm

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

Я пробовал python, но не могу понять, как прикрепить внешние ключи. Я не знаю, лучше ли импортировать во временную таблицу, а затем заполнить каждую таблицу непосредственно в MySQL верстаке

Редактировать: для моего подхода python я пытался получить данные из XML файл, содержащий ту же информацию, но он начал переходить к техническому, потому что мне нужно будет реализовать несколько проверок, которые с CSV не нужны.

import xml.etree.ElementTree as ET;
import csv
import mysql.connector;

mydb = mysql.connector.connect(
    host = "localhost",
    user = "root",
    passwd = "########",
    database = "cvmsanepar"
)

mycursor = mydb.cursor();
mycursor.execute("CREATE TABLE CVM (conta VARCHAR(255), descricao VARCHAR(255), valor1 INTEGER(10), valor2 INTEGER(10), valor3 INTEGER(10))");


dfpTree = ET.parse("InfoFinaDFin.xml");
dfpRoot = dfpTree.getroot(); 

conta1 = []; #codigo CVM do plano de contas (accounts)
descricao = []; #descrição do plano de conta (account description)
valor1 = []; #valor ano do documento (value year 1)
valor2 = []; #valor ano anterior (value year 2)
valor3 = []; #valor ano anterior do anterior (value year 3)


for numeroDeConta in dfpRoot.iter('NumeroConta'):
    conta1.append(numeroDeConta.text);

for descricaoConta in dfpRoot.iter('DescricaoConta1'):
    descricao.append(descricaoConta.text);


for valor in dfpRoot.findall('InfoFinaDFin'):
    valor1.append(valor.find('ValorConta1').text);
    valor2.append(valor.find('ValorConta2').text);
    valor3.append(valor.find('ValorConta3').text);


def merge(conta1,descricao,valor1,valor2,valor3):
    mergedList = [(conta1[i], descricao[i], valor1[i], valor2[i], valor3[i]) for i in range(0, len(conta1))]
    return mergedList

sqlFormula = "INSERT INTO CVM (conta, descricao, valor1, valor2, valor3) VALUES (%s,%s,%s,%s,%s)"
mycursor.executemany(sqlFormula, merge(conta1,descricao,valor1,valor2,valor3));
mydb.commit(); 

...