【问题标题】:create database by load a csv files using the header as columnnames (and add a column that has the filename as a name)通过使用标题作为列名加载 csv 文件来创建数据库(并添加以文件名作为名称的列)
【发布时间】:2014-09-29 20:19:26
【问题描述】:

我有 CSV 文件,我想从 mysql 中创建数据库表。我已经搜索了所有内容,但找不到任何关于如何将标题用作表的列名的信息。我想这一定是可能的。换句话说,在 MySQL 中创建新表时,您真的必须提前定义所有列、它们的名称、它们的类型等。如果 MySQL 可以执行 Office Access 之类的操作,它会根据值的外观转换为相应的类型,那就太好了。

我知道这可能是一个定义过于宽泛的问题,但在这件事上的任何指示都会有所帮助。我也在学习 Python,所以如果它可以通过 python 脚本完成,那也很棒。

非常感谢。

【问题讨论】:

  • Here 是关于如何使用 SQLite 从 CSV 文件创建 db/tables 的答案。这可能是一个好的开始。

标签: python mysql sql csv


【解决方案1】:

使用 Python,您可以使用 csv DictReader 模块,以便非常轻松地将 csv 文件中的标头用作输入数据的标签。它基本上将所有行作为字典对象读取,其中键作为标题,因此您可以在访问 mySQL 时使用键作为列名的来源。

将 csv 读入字典列表的简单示例:

example.csv:

name,address,city,state,phone
jack,111 washington st, somewhere, NE, 888-867-5309
jill,112 washington st, somewhere else, NE, 888-867-5310
john,113 washington st, another place, NE, 888-867-5311

example.py:

import csv

data = []
with open("example.csv") as csvfile:
    reader = csv.DictReader(csvfile)
    for line in reader:
        data.append(line)

print(data[0].keys())
print(data[0]['address'])
print(data[1]['name'])
print(data[2]['phone'])

输出:

$:python example.py
dict_keys(['name', 'address', 'city', 'state', 'phone'])
111 washington st
jill
 888-867-5311

更深入的例子:http://java.dzone.com/articles/python-101-reading-and-writing

关于在 Python 中连接 MySQL 的一些信息:How do I connect to a MySQL Database in Python?

【讨论】:

  • 我一直在思考和阅读有关如何从这样的字典列表(使用 DictReader)到填写(以及可选地创建)SQL 表的信息。我一直在尝试不同的方式现在(请参阅其他与 sql 相关的问题),但遇到语法错误。还有什么线索。谢谢。
  • 这是一个类似问题的示例问题,可能有很多类似的问题在回答您的问题:stackoverflow.com/questions/9336270/… 您可以使用 .keys() 和 .items() 方法返回视图字典中键或键、值对的对象。这两个都是可迭代的,因此您可以通过 for key in ex.keys():for key,value in ex.items(): 对它们进行迭代。从那里开始,将值解析为适合您的 mySQL 语句的格式。您必须提供示例以获得更多帮助。
【解决方案2】:

csv 模块可以轻松地为您提供第一行的列名,然后是其他行的值。困难的部分是猜测正确的列类型。当您将 csv 文件加载到 Excel 工作表中时,您只有几种类型:数字、字符串、日期。

在像 MySQL 这样的数据库中,您可以定义字符串列的大小,并且可以为表指定主键,最终还可以指定其他索引。您将无法从 csv 文件中自动猜测该部分。

最简单的方法是,您可以将所有列视为varchar(255)。在 csv 文件中包含不适合 255 个字符的字段确实很少见。如果你想要更聪明的东西,你将不得不扫描文件两次:第一次控制每个列的最大大小,最后,你可以取大于 2 的最小幂。下一步是控制任何列是否仅包含整数或浮点值。自动执行此操作开始变得更加困难,因为浮点值的表示可能因语言环境而异。例如,英语语言环境中的 12.51 将是法语语言环境中的 12,51。但是 Python 可以为您提供语言环境。

最难的是最终的日期或日期时间字段,因为有许多可能的格式只有数字(dd/mm/yyyymm/dd/yy)或使用纯文本(Monday, 29th of september)。

我的建议是定义一个默认模式,例如所有字符串,或者只是整数和字符串,并使用配置参数甚至配置文件来微调每列的转换。

对于阅读部分,csv module 将为您提供所需的一切。

【讨论】:

  • 谢谢。我一直在尝试了解如何去做,但开始以另一种方式进行操作,首先创建所有字段为 VARCHAR(255) 的数据库表,然后尝试通过“INSERT INTO table SET”语法填充表。我不得不提出另一个关于它的问题,因为我遇到了问题,但这是一个不同的主题,因为我想通过从 CSV 文件加载来完成任务。不过,欢迎提供有关如何执行此操作的更多细节。谢谢。
  • @user3524881 :如果您对当前问题没有更多问题,您是否可以接受一个答案以通知您不再需要有关它的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2019-03-25
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多