【问题标题】:parsing huge csv file into mysql [python]将巨大的 csv 文件解析为 mysql [python]
【发布时间】:2013-12-31 21:45:09
【问题描述】:

我在将巨大的 csv 文件解析为 mysql 数据库时遇到了一些问题。

CSV 文件如下所示:

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

CSV 文件有大约 100 万行或大约 7MB 的 zip 文件或大约 150MB 的解压缩文件。

我的工作是将数据从 csv 解析到 mysql,但只有引用匹配时的数据/行。另一个问题是,从 csv 中的多行中,我必须在 mysql 中的一行中解析它以供参考。

我尝试在每个引用上使用 csv.reader 和 for 循环来执行此操作,但速度非常慢。

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)

所以我的列表用户中有我想要解析的所有引用。哪种解析方式最快?

请帮忙!

【问题讨论】:

  • 请澄清“从 csv 中的多行我必须仅在一行中解析它”。

标签: python mysql csv


【解决方案1】:

用途:

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

这是mysql内部的查询命令。

我不建议您使用制表符来分隔列,并建议您通过 sed 将其更改为 ;或其他字符。但是你也可以尝试使用标签。

【讨论】:

  • 为什么不推荐制表符分隔的列? MySQL 使用这个我的默认值。为什么要以; 结束?
  • 我每个月都会从多家公司获得 csv 文件,我想使用 python 来解析,因为我需要控制解析(程序自动运行的时间戳,有错误的日志文件,另一个 py 程序控制资源...)
【解决方案2】:

你还没有包含所有的逻辑。如果您只想将所有内容导入到单个表中,

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

MySQL 直接执行此操作。没有比这更快的了。

Documentation

【讨论】:

  • 基本上我必须过滤我的 csv 文件并仅将引用匹配的行写入 mysql。
  • 如何导入 CSV,然后运行 ​​SQL 查询进行过滤?
  • 这是一个选项,但我不知道该怎么做,因为我有非常动态的 csv 文件。例如,我不知道一个用户/参考有多少行。
  • @djpiky 您可以将文件加载到没有索引的临时表中,然后仅将相关记录提取到实际表中。
【解决方案3】:

第一个明显的瓶颈是您要重新打开并扫描数据库中每个用户的整个 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)

【讨论】:

  • 抱歉我的无知, set() 到底是做什么的?因为python没有返回任何错误,但是当我运行代码时变量用户不存在
  • set 是一种内置类型,它是具有快速 (0(1)) 查找的独特元素的集合。但是我的代码中有一个错误(抱歉是我手机接的),我刚刚修复了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2013-05-17
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 2018-10-01
相关资源
最近更新 更多