NodeJ基于CSV输入创建动态mySql表

时间:2019-02-12 10:55:05

标签: javascript mysql node.js csv

我正在尝试构建一个执行以下操作(简化)的应用程序:

  1. 允许用户选择CSV文件
  2. 将该CSV上载到NodeJS服务器
  3. 解析文件并创建行数组(带标题)
  4. 基于csv中的列标题生成动态“创建表” sql,但还可以检测数据类型(列名称,数据类型等每次都不同)
  5. 将csv数据插入到新创建的表中

我遇到了第4步。有没有一种方法可以扫描数据元素数组并确定数据类型应该是什么?

我看过Papa Parse和csv-parse,但是我都不需要。 Papa Parse虽然很接近,但是它会分别转换每个数组元素,并且不会提取日期。

2 个答案:

答案 0 :(得分:0)

即使您运行了完整文件扫描,也很难猜测出确切的类型。

另一个问题是处理输入文件中的错误,例如,列中的数字,应将其存储为日期。

进一步:保险号(或帐号)是一个数字,但在数据库中应存储为字符串。

我建议您直接从大数据分析中获取一种方法。

分三个阶段运行整个过程:首先创建一个中间表,其中每个列的类型均为Text,然后使用mysq将数据导入其中:LOAD DATA INFILE ...

根据用户的先前选择,列名,内容分析进行初步分析,并为用户显示表格的“向导”。 (或跳过显示向导)

分析应包括最短,最长,平均和最常见长度的计算(例如,前100行包含长字符串,错误消息为:Some date for some proces isn't provided,其他为有效日期);各种价值(性别,国家,其他“字典”价值);随机内容分析(检测日期和数字)

最后,您可以使用INSERT INTO ... SELECT,更改列类型(不要忘记允许NULL来避免转换错误)或逐行进行转换和过滤操作。

//编辑

嗯,我以为您的文件有几个GB。在内存中加载大文件没有意义。

当然,您可以使用库来读取CSV并在内存中进行分析,而不是使用MySQL中的临时表进行分析。但是无论如何,您都不会避免内容分析。没有什么可隐藏的-没有高级AI系统的自动分析平均可以正常工作。

如果您发现某些东西甚至可以检测数据类型,则可以在此基础上进行构建。我也可以成为tablesorter parsers

答案 1 :(得分:0)

如果您仍在寻找答案,我会推荐npm csv解析器软件包,例如const parse = require('csv-parse') ,这很简单,首先您必须获取csv文件数据并通过csv解析器功能对其进行解析,然后循环遍历您的数据并将其放在对象中以在sql查询中使用。.