Skip to content

Instantly share code, notes, and snippets.

@jhowbhz
Last active October 17, 2023 16:05
Show Gist options
  • Save jhowbhz/aa1bc67952de2111483be6093a29c85f to your computer and use it in GitHub Desktop.
Save jhowbhz/aa1bc67952de2111483be6093a29c85f to your computer and use it in GitHub Desktop.
CSV to MYSQL Create and Inserts
import pandas as pd
import mysql.connector
import os
import psutil
# Configurações do banco de dados
db_config = {
"host": "your_host",
"user": "your_user",
"password": "your_password",
"port": "your_port",
"database": "database"
}
# Diretório onde os arquivos CSV estão localizados
csv_dir = r"/YOUR_DIRECTORY_FILES_CSV"
# Função para criar uma tabela no MySQL com base em um DataFrame
def create_table_from_dataframe(cursor, table_name, df):
create_table_query = f"CREATE TABLE IF NOT EXISTS `{table_name}` ("
for column in df.columns:
if "fk_" in column or column == "ID" or column == "id":
create_table_query += f"`{column}` BIGINT NOT NULL, "
else:
create_table_query += f"`{column}` VARCHAR(255), "
create_table_query = create_table_query[:-2] # Remova a vírgula extra no final
create_table_query += ");"
cursor.execute(create_table_query)
# Função para importar dados de um arquivo CSV em uma tabela MySQL linha por linha
def import_csv_to_mysql(mysql_connection, table_name, csv_file):
cursor = mysql_connection.cursor()
with open(csv_file, 'r', encoding="utf8", errors='ignore') as file:
header = file.readline().strip().split(';')
create_table_from_dataframe(cursor, table_name, pd.DataFrame(columns=header))
total_inserted = 0 # Contador para o número total de inserções
for line in file:
row = line.strip().split(';')
# Substitua valores 'nan' por uma string vazia antes de inserir
row = ['' if value == 'nan' else value for value in row]
insert_query = f"INSERT INTO `{table_name}` ({', '.join(header)}) VALUES ({', '.join(['%s'] * len(header))});"
try:
cursor.execute(insert_query, tuple(row))
mysql_connection.commit() # Commit após cada inserção
total_inserted += 1 # Incrementa o contador de inserções
print(f"Inserido {total_inserted} registros | Média de memória usada: {psutil.virtual_memory().percent}% | Média de CPU usada: {psutil.cpu_percent()}%", end="\r")
except mysql.connector.Error as err:
print(f"Erro ao inserir registro {row}: {str(err)}")
continue # Pule para a próxima linha em caso de erro
return total_inserted
cursor.close()
# Conecte-se ao banco de dados
mydb = mysql.connector.connect(**db_config)
# Liste todos os arquivos CSV no diretório
csv_files = [f for f in os.listdir(csv_dir) if f.endswith(".csv")]
# Inicialize um contador para rastrear o número total de inserções
total_inserted = 0
# Importe cada arquivo CSV em uma tabela separada linha por linha
for csv_file in csv_files:
table_name = os.path.splitext(os.path.basename(csv_file))[0]
try:
insert_count = import_csv_to_mysql(mydb, table_name, os.path.join(csv_dir, csv_file))
total_inserted += insert_count # Incrementa o contador de inserções
print(f"Arquivo {csv_file} inserido no banco de dados. Total inserido: {insert_count} registros.")
except Exception as e:
print(f"Erro ao importar arquivo {csv_file}: {str(e)}")
# Feche a conexão com o banco de dados
mydb.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment