我将如何创建一个检查 Excel(或 CSV)文件的 MYSQL 表模式。是否有任何现成的 Python 库来完成这项任务?
列标题将被清理为列名。数据类型将根据电子表格列的内容进行估计。完成后,数据将被加载到表中。
我有一个大约 200 列的 Excel 文件,我想开始规范化。
我将如何创建一个检查 Excel(或 CSV)文件的 MYSQL 表模式。是否有任何现成的 Python 库来完成这项任务?
列标题将被清理为列名。数据类型将根据电子表格列的内容进行估计。完成后,数据将被加载到表中。
我有一个大约 200 列的 Excel 文件,我想开始规范化。
使用xlrd
模块;从这里开始。[免责声明:我是作者]。xlrd
将单元格分类为文本、数字、日期、布尔值、错误、空白和空。它通过检查与单元格相关的格式(例如“dd/mm/yyyy”与“0.00”)来区分日期和数字。
编写一些代码来遍历用户输入的数据以决定每列使用哪种 DB 数据类型的工作并不是一件容易自动化的事情。您应该能够观察数据并分配整数、货币、文本、日期、日期时间、时间等类型,并编写代码来检查您的猜测。请注意,您需要能够处理在文本字段中输入的数字或日期数据等内容(在 GUI 中看起来不错)。您需要一种策略来处理不符合“估计”数据类型的单元格。您需要验证和清理数据。确保对文本字符串进行规范化(去除前导/尾随空格,用单个空格替换多个空格。Excel 文本是(仅限 BMP)Unicode;不要将其转换为 ASCII 或“ANSI”——使用 Unicode 并编码UTF-8 将其放入您的数据库中。
使用 phpmyadmin 快速而肮脏的解决方法:
据我所知,没有工具可以自动化这个过程(我希望有人能证明我错了,因为我以前也遇到过这个问题)。当我这样做时,我想出了两个选项:
(1)在数据库中手动创建具有适当类型的列,然后导入,或者
(2)编写某种过滤器,可以“找出”列的数据类型应该。我选择第一个选项主要是因为我认为我实际上无法编写一个程序来进行类型推断。
如果您决定编写类型推断工具/转换,则可能需要处理以下几个问题:
(1) Excel 日期实际存储为自 1899 年 12 月 31 日以来的天数;那么如何推断一列是日期而不是一些数字数据(例如人口)?
(2) 对于文本字段,您是否只制作类型为 varchar(n) 的列,其中 n 是该列中最长的条目,或者如果其中一个条目长于某个上限,您是否将其设为无界字符字段?如果是这样,一个好的上限是多少?
(3) 如何自动将浮点数转换为具有正确精度且不丢失任何位的小数?
显然,这并不意味着你不能(我是一个非常糟糕的程序员)。我希望你这样做,因为它是一个非常有用的工具。
仅供(我的)参考,我在下面记录了我所做的:
LOAD DATA INFILE
CREATE TABLE
所有列都为 TEXT,主键除外LOAD DATA LOCAL INFILE
将所有 CSV 数据加载到 TEXT 字段中。PROCEDURE ANALYSE
,我能够为ALTER TABLE
列提供正确的类型和长度。PROCEDURE ANALYSE
返回ENUM
具有很少不同值的任何列,这不是我需要的,但我发现这对规范化很有用。目测 200 列是轻而易举的事PROCEDURE ANALYSE
。PhpMyAdmin 的输出建议表结构是垃圾。SELECT DISTINCT
列和INSERT
结果来分隔表。我首先在旧表中添加了 FK 列。就在 之后INSERT
,我得到了它的 ID 并UPDATE
编辑了 FK 列。循环完成后,我删除了旧列,只留下 FK 列。与多个依赖列类似。它比我预期的要快得多。python manage.py inspctdb
,将输出复制到 models.py 并添加所有这些ForeignkeyField
s,因为 FK 在 MyISAM 上不存在。写了一点pythonviews.py、urls.py、几个模板……TADA