我正在尝试构建一个执行以下操作(简化)的应用程序:
- 允许用户选择 CSV 文件
- 将该 CSV 上传到 NodeJS 服务器
- 解析文件并创建行数组(带标题)
- 根据 csv 中的列标题生成动态“创建表”sql,同时检测数据类型(列名称、数据类型等每次都会不同)
- 将 csv 数据插入到新创建的表中
我在第 4 步遇到了麻烦。有没有办法扫描数据元素数组并确定数据类型应该是什么?
我看过 Papa Parse 和 csv-parse 但都没有达到我的需要。 Papa Parse 虽然很接近,但它单独转换每个数组元素并且不获取日期。
最佳答案
即使您运行完整的文件扫描,也很难猜测确切的类型。
另一个问题是处理输入文件中的错误,例如列中的数字,应存储日期。
进一步:保险号(或帐号)是一个数字,但在数据库中应该存储为字符串。
我向您推荐一种直接来自大数据分析的方法。
分 3 个阶段运行整个过程:首先创建一个中间表,其中每列的类型为 Text
并使用 mysq 将数据导入其中:LOAD DATA INFILE ...
根据用户之前的选择、列名、内容分析进行初步分析,为用户展示表格的“向导”。 (或跳过显示向导)
分析应包括最短、最长、平均和最常见长度的计算(例如,前 100 行包含长字符串,错误消息为:未提供某些过程的某些日期
和其他均为有效日期);各种值(性别、国家、其他“字典”值);随机内容分析(检测日期和数字)
最后,您可以使用 INSERT INTO ... SELECT
,更改列类型(不要忘记允许 NULL
来处理转换错误)或逐行转换和过滤操作。
//编辑
呃,我以为你的文件有几GB。在内存中加载大文件是没有意义的。
当然,您可以使用库来读取 CSV 并在内存中分析它,而不是使用 MySQL 中的临时表。但无论如何你都无法避免内容分析。没有什么可隐藏的 - 无需高级人工智能系统的自动分析效果一般。
如果您发现了一些可以检测数据类型的东西,您可以在它的基础上进行构建。也有帮助,我可以成为 tablesorter parsers .
关于javascript - NodeJs 基于 CSV 输入创建动态 mySql 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54648485/