Python 生成Excel(CSV)表格架构并导入数据

Python 生成Excel(CSV)表格架构并导入数据,python,mysql,excel,csv,import-from-excel,Python,Mysql,Excel,Csv,Import From Excel,我将如何创建一个MYSQL表模式来检查Excel(或CSV)文件。 是否有任何准备好的Python库用于此任务 列标题将被清除为列名。数据类型将根据电子表格列的内容进行估计。完成后,数据将加载到表中 我有一个大约200列的Excel文件,我想开始规范化它。使用phpmyadmin的快速而肮脏的解决方法: 创建具有适当列数的表。确保数据与列相符 将CSV导入表中 使用建议表结构 据我所知,没有任何工具可以自动化这个过程(我希望有人能证明我错了,因为我以前就遇到过这个问题)。 当我这样做时,我想到

我将如何创建一个MYSQL表模式来检查Excel(或CSV)文件。 是否有任何准备好的Python库用于此任务

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


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

使用phpmyadmin的快速而肮脏的解决方法:

  • 创建具有适当列数的表。确保数据与列相符
  • 将CSV导入表中
  • 使用建议表结构

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

显然,这并不意味着你不能(我是一个相当糟糕的程序员)。我希望您能这样做,因为这将是一个非常有用的工具。

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

编写一些代码来遍历用户输入的数据,从而决定每个列使用哪种DB数据类型,这项工作不是很容易实现自动化的。您应该能够查看数据并指定整数、货币、文本、日期、日期时间、时间等类型,并编写代码检查您的猜测。请注意,您需要能够处理在文本字段中输入的数字或日期数据(在GUI中看起来可以)。您需要一种策略来处理不符合“估计”数据类型的单元格。您需要验证和清理数据。确保规范化文本字符串(去掉前导/尾随空格,用一个空格替换多个空格。Excel文本是(仅BMP)Unicode;不要将其转换为ASCII或“ANSI”--使用Unicode并用UTF-8编码以将其放入数据库中。

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

  • XLRD是实用的,但是我刚刚将Excel数据保存为CSV,因此我可以使用
    LOAD data infle
  • 我已经复制了标题行并开始编写导入和规范化脚本
  • 脚本执行:
    创建表
    ,所有列都作为文本,主键除外
  • 查询mysql:
    加载数据本地填充
    将所有CSV数据加载到文本字段中
  • 基于
    PROCEDURE analysis
    的输出,我能够
    更改表
    ,为列提供正确的类型和长度。
    PROCEDURE analysis
    为任何具有少量不同值的列返回
    ENUM
    ,这不是我所需要的,但我发现这对以后的规范化非常有用使用
    过程分析进行冻结
    。PhpMyAdmin建议表结构的输出是垃圾
  • 我编写了一些规范化,主要是使用
    selectdistinct
    对列和
    INSERT
    将结果分离到单独的表中。我首先为旧表添加了一列FK。在
    INSERT
    之后,我得到了它的ID并
    更新了FK列。循环完成后,我删除了旧列,只留下了FK列n、 与多个依赖列类似,它比我预期的要快得多
  • 我运行了(django)
    python manage.py inspctdb
    ,将输出复制到models.py,并添加了所有那些
    ForeignkeyField
    s,因为FKs在MyISAM上不存在。编写了一些python views.py、url.py和一些模板…TADA
  • 可以返回架构:

    pandas.read_csv('data.csv').dtypes
    
    参考资料:

    好的,PhpMyAdmin会:“从表中选择*_nameprocedure analysis()”。这可能会对我有所帮助。还有一些想法: