生成检查Excel(CSV)和导入数据的表模式

时间:2010-06-18 13:40:38

标签: python mysql excel csv import-from-excel

如何创建检查Excel(或CSV)文件的MYSQL表模式。 这个任务有没有现成的Python库?

列标题将清理为列名。将根据电子表格列的内容估算数据类型。完成后,数据将被加载到表中。

我有一个约200列的Excel文件,我想开始规范化。

5 个答案:

答案 0 :(得分:3)

使用xlrd模块; start here。 [免责声明:我是作者]。 xlrd将单元格分为文本,数字,日期,布尔值,错误,空白和空。它通过检查与单元格关联的格式来区分日期和数字(例如“dd / mm / yyyy”与“0.00”)。

编写一些代码以通过用户输入的数据来决定用于每列的DB数据类型的工作不是可以轻松实现的。您应该能够观察数据并分配整数,金钱,文本,日期,日期时间,等等类型,并编写代码来检查您的猜测。请注意,您需要能够处理在文本字段中输入的数字或日期数据(在GUI中可以看起来正常)。您需要一种策略来处理不符合“估计”数据类型的单元格。您需要验证和清理数据。确保规范化文本字符串(剥离前导/尾随空格,用单个空格替换多个空格.Excel文本是(仅限BMP)Unicode;不要将其压缩成ASCII或“ANSI” - 使用Unicode并编码UTF-8将它放在你的数据库中。

答案 1 :(得分:1)

使用phpmyadmin进行快速而又脏的解决方法:

  • 创建一个包含适量列的表。确保数据符合列。
  • 将CSV导入表格。
  • 使用建议表格结构

答案 2 :(得分:1)

据我所知,没有工具可以自动化这个过程(我希望有人能证明我错了,因为我之前遇到过这个问题)。 当我这样做时,我提出了两个选择:
(1)使用适当的类型手动创建数据库中的列,然后导入,或者 (2)编写某种过滤器,可以“弄清楚”列应该是什么数据类型。 我选择了第一个选项主要是因为我认为我实际上不能编写程序来进行类型推断。
如果您决定编写类型推理工具/转换,以下是您可能需要处理的几个问题:
(1)Excel日期实际存储为自1899年12月31日以来的天数;那么如何推断列是日期而不是某些数字数据(例如人口)? (2)对于文本字段,您是否只创建varchar(n)类型的列,其中n是该列中最长的条目,或者如果其中一个条目长于某个上限,您是否将其设为无界字符?如果是这样,那么上限是多少? (3)如何以正确的精度自动将浮点数转换为小数而不丢失任何位置? 显然,这并不意味着你将无法(我是一个非常糟糕的程序员)。我希望你这样做,因为它是一个非常有用的工具。

答案 3 :(得分:1)

仅供(我)参考,我在下面记录了我的所作所为:

  1. XLRD很实用,但我刚刚将Excel数据保存为CSV,因此我可以使用LOAD DATA INFILE
  2. 我已经复制了标题行并开始编写导入和规范化脚本
  3. 脚本执行:CREATE TABLE,所有列均为TEXT,但主键
  4. 除外
  5. 查询mysql:LOAD DATA LOCAL INFILE将所有CSV数据加载到TEXT字段中。
  6. 根据PROCEDURE ANALYSE的输出,我能够ALTER TABLE为列提供正确的类型和长度。对于任何具有很少不同值的列,PROCEDURE ANALYSE都会返回ENUM,这不是我需要的,但我发现以后用于规范化很有用。使用PROCEDURE ANALYSE轻微的200个柱子是轻而易举的。 PhpMyAdmin建议表结构的输出是垃圾。
  7. 我写了一些规范化,主要是在列上使用SELECT DISTINCT,在INSERT结果分隔表。我已经在旧表中添加了一个FK列。就在INSERT之后,我得到了它的ID并且UPDATE编辑了FK列。当循环结束时,我删除了旧列,只留下了FK列。与多个依赖列类似。它比我预期的要快得多。
  8. 我跑了(django)python manage.py inspctdb,将输出复制到models.py并添加了所有ForeignkeyField,因为MyISAM上不存在FK。写了一个小python views.py,urls.py,几个模板...... TADA

答案 4 :(得分:0)

Pandas可以返回架构:

pandas.read_csv('data.csv').dtypes

参考文献: