【问题标题】:NodeJs create dynamic mySql table based on CSV inputNodeJs 基于 CSV 输入创建动态 mySql 表
【发布时间】:2019-07-06 00:08:01
【问题描述】:

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

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

第 4 步我遇到了麻烦。有没有办法扫描数据元素数组并确定数据类型应该是什么?

我查看了 Papa Parse 和 csv-parse,但都没有满足我的需求。虽然 Papa Parse 很接近,但它单独转换每个数组元素并且不获取日期。

【问题讨论】:

    标签: javascript mysql node.js csv


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      进一步:保险号(或账号)是一个数字,但在数据库中应该以字符串形式存储。

      我建议您直接使用大数据分析的方法。

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

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

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

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

      //编辑

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

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

      如果您发现了一些甚至可以检测数据类型的东西,您可以在此基础上进行构建。也很有帮助,我可以成为tablesorter parsers

      【讨论】:

      • 不是问题的解决方案,我需要在 Nodejs 中完成整个过程
      • 您可以在节点中完成整个过程,但这并不能改变您等待分析并找到解决我提到的问题的事实。 (顺便说一句:检查更新。)
      猜你喜欢
      • 2012-05-25
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2011-11-13
      • 2017-10-04
      相关资源
      最近更新 更多