生成表结构,检查Excel(CSV)并导入数据。

7

我该如何创建一个MYSQL表模式来检查Excel(或CSV)文件呢?是否有已经准备好的Python库可以完成此任务?

列标题将被清理为列名。数据类型将基于电子表格列内容估计。操作完成后,数据将被加载到表中。

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


一些更多的想法:https://dev59.com/WWkw5IYBdhLWcg3wSorA - Franck Dernoncourt
5个回答

3
使用xlrd模块;从这里开始。[免责声明:我是作者]。xlrd将单元格分类为文本、数字、日期、布尔、错误、空白和空。它通过检查与单元格相关联的格式(例如“dd/mm/yyyy”与“0.00”)来区分日期和数字。
编写代码以浏览用户输入的数据并决定每个列使用什么DB数据类型的工作不是易于自动化的。您应该能够查看数据并分配类型,例如整数、货币、文本、日期、时间等,并编写代码以检查您的猜测。请注意,您需要能够处理在文本字段中输入的数字或日期数据(在GUI中可能看起来不错)。您需要一种策略来处理不适合“估计”的数据类型的单元格。您需要验证和清理数据。确保规范化文本字符串(去除前导/尾随空格,用单个空格替换多个空格)。Excel文本是(仅限BMP)Unicode;不要将其转换为ASCII或“ANSI”——使用Unicode并使用UTF-8进行编码以将其放入数据库中。

1

使用phpmyadmin的快速且简单的解决方法:

  • 创建一个具有正确列数的表格。确保数据适合这些列。
  • 将CSV导入表格中。
  • 使用建议表结构功能。

1
好的,PhpMyAdmin可以执行:"SELECT * FROM table_name PROCEDURE ANALYSE()"。这可能会对我有所帮助。http://dev.mysql.com/doc/refman/5.0/en/procedure-analyse.html - fmalina

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

1

仅供参考,我记录下了以下内容:

  1. XLRD 很实用,但我已经将 Excel 数据另存为 CSV 格式,以便使用 LOAD DATA INFILE
  2. 我复制了表头行并开始编写导入和规范化脚本
  3. 脚本执行:使用 CREATE TABLE 创建所有列为 TEXT 类型的表格,除了主键
  4. 查询 mysql:使用 LOAD DATA LOCAL INFILE 将所有 CSV 数据加载到 TEXT 字段中。
  5. 根据 PROCEDURE ANALYSE 的输出,我可以使用 ALTER TABLE 给列赋予正确的类型和长度。对于任何有少量不同值的列,PROCEDURE ANALYSE 返回的是 ENUM,这不是我需要的,但后来我发现它对规范化很有用。使用 PROCEDURE ANALYSE 查看 200 列非常轻松。PhpMyAdmin 提出的表结构输出是垃圾。
  6. 我编写了一些规范化代码,主要使用 SELECT DISTINCTINSERT 在列上,并将结果插入到单独的表格中。我在旧表格中添加了一个 FK 列。在 INSERT 后,我得到了它的 ID 并更新了 FK 列。当循环结束时,我删除了旧列,只留下 FK 列。依此类推处理多个相关列。这比我预期的要快得多。
  7. 我运行了(Django)python manage.py inspectdb,将输出复制到 models.py 中,并添加了所有这些 ForeignKeyField 作为 MyISAM 上不存在 FK。编写了一些 Python views.py,urls.py 和少量模板... 完美!

根据https://www.get-information-schools.service.gov.uk/Downloads提供的数据,创建了https://blocl.uk/schools


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接