Che Posted December 23, 2018 Report Posted December 23, 2018 Salut ! Am facut urmatorul script in python care iti ia fiecare fisier csv si ti-l baga intr-o baza de date SQLite. Fisierele originale csv sunt destul de marisoare (~50-60mb) fiecare. Dar am incercat pe niste fisiere mult mai mici (de 400kb -450kb) fiecare si sta extraordinar de mult pana le baga in baza de date. Nu am pus o mie de astfel de fisiere ci doar 5 si sta deja o ora si tot nu a terminat de bagat in baza de date. Nu as vrea sa stau ani de zile in cazul fisierelor originale. Ma gandesc ca poate gresesc pe undeva de merge asa de greu. Va rog, poate ma puteti ajuta. Aici este scriptul: # coding: utf-8 import json import os import sqlite3 from csv import reader from os import listdir import unicodecsv as csv from os.path import isfile, join # ne conectam la baza de date, daca aceasta nu exista atunci o cream mai intai si apoi ne conectam # aceasta va fi creata automat, daca nu exista, la prima conectare: conn = sqlite3.connect(myfiles_path + 'mydatabase.db') # se creaza instanta de acces catre baza de date: c = conn.cursor() for each_csv_file_found in csv_list_files: # ca sa stim cam pe unde se afla: print "Bagam in baza de date fisierul csv: {}".format(each_csv_file_found) csv_headers = read_csv_headers(myfiles_path + each_csv_file_found) beta_rows = getCSV_rows(myfiles_path + each_csv_file_found) final_columns = ', '.join(csv_headers) # se genereaza numele tabelului de introdus in baza de date: table_name = each_csv_file_found.rsplit('.', 1)[0].replace("Total_", '').replace("mins", "").replace("-", "_") values_to_insert = [] for each_beta_row in beta_rows: values_to_insert.append(tuple(each_beta_row)) # se va crea un tabel dupa fiecare fisier csv gasit, doar daca acesta nu exista: sql_command_create_table = '''CREATE TABLE IF NOT EXISTS {}({})'''.format(table_name, final_columns) c.execute(sql_command_create_table) # Nu se face Create unique index fiindca le amesteca si le combina aiurea pe toate si mai si sare din ele! # save changes: # Trebuie executata dupa fiecare c.execute si nu doar la final! conn.commit() # incepem sa construim query pentru adaugarea de valori in db: semne = "?" * len(csv_headers) question_marks = ",".join(semne) conn.text_factory = str for row_value in values_to_insert: # Nu trebuie cu REPLACE INTO fiindca iti baga mai multe randuri asemanatoare intr-un singur rand! # c.execute('INSERT team_summary_overall ({}) VALUES ({})'.format(final_columns, question_marks), row_values) c.execute('INSERT INTO {} ({}) VALUES ({})'.format(table_name, final_columns, question_marks), row_value) # save changes: # Trebuie dupa fiecare c.execute si nu la sfarsit! conn.commit() # inchidem conexiunea la baza de date: # se executa o singura data, la final: conn.close() Folosesc unicodecsv fiindca csv normal imi da eroare la scrierea datelor ca sunt litere de astea si imi da eroare ca nu poate citi ascii in pozitia x, ceva de genul "can't decode ascii x08x\67...". Si am stat o zi intreaga si altfel nu am reusit sa rezolv problema decat folosind unicodecsv. Multumesc mult de tot ! Quote
theandruala Posted December 23, 2018 Report Posted December 23, 2018 Dacă tot îți faci fișierul din json sau CSV, depinde ce înseamnă la tine, vrie neapărat sqlite? Vezi CTL URILE 1 Quote
Che Posted December 23, 2018 Author Report Posted December 23, 2018 Gata, am rezolvat. Folosesc acum c.executemany(sqlite_command). Totusi, cu pandas nu imi da voie ca imi da o eroare ca numarul de coloane nu e egal... (?!). Ciudat. Zic fiindca am vazut o metoda mult mai simpla folosind pandas. Oricum, am rezolvat. Multumesc pentru ajutor! (Nu era treaba cu CTL-urile.) Quote
Wav3 Posted December 23, 2018 Report Posted December 23, 2018 Nu e mai simplu sa folosesti php? Eu lucrez cu feeduri csv de sute de mb si le bag una-doua in baza. Comentariile sunt cringe rau 1 Quote
Che Posted December 24, 2018 Author Report Posted December 24, 2018 16 hours ago, Wav3 said: Nu e mai simplu sa folosesti php? Eu lucrez cu feeduri csv de sute de mb si le bag una-doua in baza. Comentariile sunt cringe rau Poate o sa folosesc php dar momentan nu imi e indemana ca nu am mai scris nimic in php de peste 5 ani. Multumesc! Da, m-am gandit sa imi comentez cat mai explicit codul ca nu programez tot timpul si cand ma apuca am observat ca nici eu nu mai stiam ce am vrut sa scriu acolo. Quote