2013-12-13 3 views
1

У меня есть некоторые проблемы с разбором огромного файла csv в mysql databse.разбор огромного файла csv в mysql [python]

Csv файл выглядит следующим образом:

ref1 data1 data2 data3... 
ref1 data4 data5 data6... 
ref2 data1 data2 data3 data4 data5.. 
ref2 data12 data13 data14 
ref2 data21 data22... 
. 
. 
. 

Csv файл имеет около 1 Milion линии или о 7MB в почтовый файл или около 150MB Распаковать.

Моя задача - проанализировать данные csv в mysql, но только данные/строки, когда ссылки совпадают. Другая проблема заключается в том, что из нескольких строк в csv я должен анализировать ее только в одной строке в mysql для одной ссылки.

Я попытался сделать это с помощью csv.reader и для циклов по каждой ссылке, но очень медленный.

with con: 
cur.execute("SELECT ref FROM users") 
user=cur.fetchall() 
for i in range(len(user)): 
    with open('hugecsv.csv', mode='rb') as f: 
     reader = csv.reader(f, delimiter=';')        
     for row in reader: 
      if(str(user[i][0])==row[0]): 
       writer.writerow(row) 

Итак, у меня есть все ссылки, которые я хотел бы проанализировать в моем списке пользователей. Каков способ быстрого разбора?

Пожалуйста, помогите!

+0

Просьба пояснить «из нескольких строк в csv я должен разбирать его только в одной строке». –

ответ

2

Первое очевидное узкое место является то, что вы повторное открытием и сканирование всего файла CSV для каждого пользователя в базе данных. Выполнение одного прохода на csv было бы быстрее:

# faster lookup on users 
cur.execute ("select ref from users") 
users = set(row[0] for row in cur.fetchall()) 

with open("your/file.CSV") as f: 
    r = reader(f) 
    for row in r: 
     if row[0] in users: 
      do_something_with(row) 
+0

Извините за мое невежество, что именно задают()? Becuse python не возвращает никаких ошибок, но переменная users does't exsist при запуске кода – djpiky

+0

'set' - встроенный тип, это набор уникальных элементов с быстрым (0 (1)) поиском. Но в моем коде произошла ошибка (извините, ответили с моего телефона), что я только что исправил. –

+0

Спасибо, это работает! – djpiky

1

Использование:

LOAD DATA INFILE 'EF_PerechenSkollekciyami.csv' TO `TABLE_NAME` FIELDS TERMINATED BY ';' 

Это внутренняя команда запроса в MySQL.

Я не рекомендую использовать вкладки для разделения столбцов и рекомендовать вам изменить это на sed; или что-то другое. Но вы также можете попробовать с вкладками.

+0

Почему бы вам не рекомендовать вкладки, разделенные столбцами? MySQL использует это мое значение по умолчанию. И зачем заканчивать с ';'? –

+0

Я получаю файл csv каждый месяц от нескольких компаний, и я бы хотел использовать python для разбора, потому что мне нужен контроль над разбором (отметка времени, в которой программа работает автоматически, файлы журналов с ошибками, другая программа py для управления ресурсами ...) – djpiky

0

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

cur.execute("LOAD DATA INFILE 'path_to_file.csv' INTO TABLE my_table;") 

MySQL делает это напрямую. Вы не можете получить быстрее.

Documentation

+0

В основном я должен отфильтровать свой файл csv и записать в mysql строки, на которые ссылается ссылка. – djpiky

+0

Как импортировать CSV, а затем запустить SQL-запрос для фильтрации? –

+0

Это вариант, но я не знаю, как это сделать, потому что у меня очень динамический файл csv. Например, я не знаю, сколько строк у меня есть для одного пользователя/ссылки. – djpiky

Смежные вопросы