【问题标题】:Find out field type based on data根据数据找出字段类型
【发布时间】:2009-04-07 08:50:59
【问题描述】:

我正在执行从一个系统到另一个系统的一次性导入例程。第一步是从大量 csv 文件中导入大量数据。每个 csv 文件中的第一行是字段名制表符分隔。其余的是数据,也是制表符分隔,行用 CR 分隔。

我编写了一个 20 行的例程,用于创建表并将数据读入 sql 数据库。我将所有仅包含数字数据且字段名称中包含“ID”的字段设置为 INT,其余字段设置为 NVARCHAR (255)。

现在我想对其进行改进,使其查看数据并尝试找出每列中包含的数据类型。有时间、日期、id 字段、文本字段和数字字段。

我知道怎么做,这很容易,但我想知道这方面是否有一些工作,以及是否有一些类可以处理这个问题。

找出首选尺寸更难。我认为我必须 1. 浏览所有行并找出每列最长的数据。 2. 有一个查找表,我将例如长度 0-50 映射为 100,长度 51-255 映射为 255 等等。

有人对此有一些聪明的意见吗?正如我所说的,这并不是什么特别难做的事情,但如果能制作一个智能库,以便以后在其他导入场景中使用,那就太好了。

【问题讨论】:

    标签: .net import


    【解决方案1】:

    我会运行一个预处理阶段 - 分析 CSV 文件中的数据以计算出 nvarchar 的合理容量 - 例如,nvarchar(20) 或 nvarchar(2000)。我会让它打印一个带有每个列的示例条目的报告 - 实际上甚至生成“创建表” SQL 语句,您可以在运行之前手动编辑该语句。如果列中的每个条目都格式化为数字,则将其设为 int,依此类推。

    作为一次性的事情,我完全希望您应该在运行数据导入之前目视检查您将首先创建的每个表。

    【讨论】:

      【解决方案2】:

      您是否考虑过 ADO.NET?您可以将数据读入数据集吗?

      连接字符串如下所示: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TxtFile\;Extended Properties='text;HDR=Yes;FMT=Delimited'" 请注意您需要的 HDR=YES。

      然后,当您连接到目录时,您可以使用如下 select 语句:

      "SELECT * FROM data.txt"

      还有其他设置可以调整查看多少行以确定类型等。您可以查看 schema.ini 文件以手动调整类型。此外,您可以将注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text 设置为: ImportMixedTypes=文本 从默认的“多数类型”

      我还在 Excel 文件上使用了 SQL 导入表(在 Excel 中打开后保存 csv 文件后)。这也可以。虽然没有什么能完美运行 - 有时我仍然发现使用一些手动编码并自己检查列数据更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-02
        • 2021-03-02
        • 2020-08-30
        • 1970-01-01
        相关资源
        最近更新 更多