将数据文件插入SQL Server数据库(无分隔符)

时间:2014-07-02 20:10:23

标签: c# database search sql-server-2012 bulkinsert

我已经尝试过研究这个问题,但大多数答案都是针对.csv文件的,这对我没什么帮助。

我有几个包含大量数据的大.dat个文件(每个文件大约700MB),我正在尝试用C#开发一个软件,我可以搜索特定的字符串和找到它所在的行(将出现重复项,因此列表视图/列表框可能是一个好主意)。

每一行都遵循完全相同的数据格式,每个数据类型的起始索引/长度都有详细记录。

示例:

  

第1行:ZATIXIZ20SWEDENSTACKOVERFLOWCHROME

     

记录如下:

     

用户名:0-6岁年龄:7-8
国家:9-14
网站:   15-27浏览器:28-33

我的猜测是,最好的方法是对数据文件进行某种BULK INSERT到数据库中,然后将其编入索引以便以后加快搜索速度。我不太清楚如何做到这一点,也不是最好的方法。 (它还需要搜索所有文件,所以将它们全部插入到同一个表中可能是一个好主意吗?)

到目前为止,我只尝试将其中一个文件读入内存,然后做一个简单的Regex,这当然不是一个好主意。不幸的是我对SQL查询缺乏经验,这就是为什么我还没有尝试过很多。

提前致谢!

1 个答案:

答案 0 :(得分:0)

'将所有相同类型的数据插入带有索引列的表中。

如果每个文件的属性不同,请使用多个表。

如果您希望能够将匹配回溯到原始文件,请使用包含列的表:

  • 键 - 序列中的内部键
  • FileName - 所以你知道它来自哪里
  • 行 - 行号
  • 用户名
  • 年龄
  • 国家
  • 网站
  • 浏览器

FileName,Line是唯一键。

以下是有关MSSQL全文搜索的文章的链接,因为我们不知道您使用的是哪个RDMS:http://msdn.microsoft.com/en-us/library/ms142571.aspx#queries

从你的例子来看,该行' ZATIXIZ20SWEDENSTACKOVERFLOWCHROME'变为:

| Key | FileName   | Line | Username  | Age | CountryKey | Website         | BrowserKey
    1   'Data1.dat'     1   'ZATIXIZ'    20         46     'STACKOVERFLOW'            4

在此示例中,您还需要两个表:国家/地区和浏览器。这些是可选的,因为您可以直接在主表中包含这些信息。

我必须强调,这实际上取决于您希望如何查询此数据。上述结构使您有机会搜索“20到25岁之间的所有瑞典用户”'通过执行以下查询:

select * from TABLENAME where Age < 25 and Age >= 20 and CountryKey = 46

关于如何导入固定宽度文件,它在很大程度上取决于您的RDMS。如果您使用的是Oracle,则可以使用SQL*Loader。请记住,它不一定是单阶段过程。您可以将数据加载到表中,然后在初始导入后在内部查找键。

对于MSSQL,这是堆栈中的另一个答案:Bulk insert fixed width fields

您也可以在.NET中对其进行预处理。同样,这取决于您的情况。如果您以每10分钟一个900MB文件的速率将这些文件传输到系统中,那么您正在考虑对批量加载过程(以及一些严重的硬件)进行一些认真的优化。但是如果你只需要每月加载一次这个文件,那么.NET方法绝对没问题,即使它可能需要几个小时。