【问题标题】:Import csv files containing data with commas into MySQL将包含逗号数据的 csv 文件导入 MySQL
【发布时间】:2012-03-22 11:03:06
【问题描述】:

我有超过 10GB 的 .csv 文件。我正在尝试使用 python 将这些文件中的数据导入 MySQL。由于 csv 文件是逗号分隔的文件,并且我的数据本身包含逗号,因此我不能在此处使用 ',' 进行拆分。请建议一些其他选项 用于拆分 csv 文件。 我想将数据从 csv 文件(其中数据本身包含逗号)导入 MySQL(我正在使用 Wamp 服务器)。 我有像“伦敦,英国”,“2010”,“信用,储蓄”这样的数据

【问题讨论】:

  • 如果你提供一些我们可以想到的数据示例。
  • 我在问题中提供了示例数据:)

标签: python mysql wamp wampserver mysql-python


【解决方案1】:

已经为使用 Python 导入提供了一个很好的答案。但我不清楚你为什么需要 Python 来做这件事。 MySQL 具有用于导入 CSV 数据的内置命令——请参阅 load data 手册页。例如,

LOAD DATA LOCAL INFILE 'source_data.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
IGNORE 1 LINES;

最后一部分忽略第一行(如果您的 CSV 文件有“标题”,则使用)。

【讨论】:

  • 非常感谢您的帮助。但是由于我是新手,我不知道我的csv文件(我在xls中查看)是否用引号引起来,我的数据也有cmets,所以我认为其中必须有引号,数据就像stackoverflows 数据,我将其转换为 csv 以存储到数据库中。你能不能给我一个线索,这样我就可以检查封闭的符号。再次感谢您的帮助
  • @user869790,好吧,“可选”部分表示字段周围并不总是有双引号。如果您想查看包含您的字段的内容,您可以打开文件并查看数据,然后再对其运行LOAD 命令。
  • 再次感谢您的帮助。有没有一种好方法可以让我只输入与某些年份有关的记录,而不是像数据集中那样输入所有年份的记录
  • 使用这种方法,而不是直接使用。我建议将它们全部加载到您打算丢弃的单个表中,然后使用CREATE TABLE .. SELECT 语法生成包含您实际需要的数据的表。见dev.mysql.com/doc/refman/5.1/en/create-table.html
【解决方案2】:

首先,我假设 CSV 文件在字符串值周围有引号。

因此,每个包含逗号的值都被这样的引号包围:

a, b, 2, 'foo, bar'

如果是这样,那么您可以使用以下内容:

导入

 csv

quoteChar = "'"

myReader = csv.reader(open('largefile.csv', 'rb'), delimiter=',', quoteChar = quoteChar)

for row in myReader:
    print row # this prints a list. Row is a list of values per line in your
    # 'largefile.csv' file. Each row is splitted on the delimiter char.
    # (comma in this case) and strings that are quoted by quoteChar (in your case
    # a ' are treated differently.) This will work for your input that you've given
    # in your question.

# this is what you used to do:
for line in open('largefile.csv', 'rb'):
     row = line.split(quoteChar)

否则,这将取决于您的 CSV 文件的外观。

【讨论】:

  • 感谢您的帮助。由于我还必须将此内容传输到 MySQL 数据库,因此我正在执行以下操作:for row in myReader: values=row.split(',') 然后将这些值存储到 MySQL 中。这种分裂本质上是导致问题的原因。是否有另一种将数据传输到 MySQL 的方法
  • @user869790:Daan 向您展示了另一种方式。 Python 的内置 csv 模块是您应该用于此任务的。不要重新发明已经为您构建和测试过的东西。
  • @user869790 亚当·伯尼尔是对的。我已经更新了我的答案以进一步澄清事情。 myReader 中的行与您在 line.split() 之后获得的“行”相同(类型),但随后“更好”。 CSV 模块为您完成所有这些工作。无需重新发明轮子。
  • @AdamBernier 只是一个幼稚的问题,请原谅我,因为我是新手。我如何检查以了解我拥有的 csv 文件类型。由于我运行了上面的代码,发现我的数据没有被双引号括起来,所以我也可以在“xlsx”中查看文件
  • @DaanTimmer 感谢您的方法也很有效。非常感谢您的帮助
【解决方案3】:

你可以使用mysqlimport

mysqlimport --ignore-lines=1 --fields-terminated-by=, --fields-optionally-enclosed-by='"' --verbose --local -u root -p DB_Name csv/path.csv > save_log.log

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多