我已经尝试过研究这个问题,但大多数答案都是针对.csv
文件的,这对我没什么帮助。
我有几个包含大量数据的大.dat
个文件(每个文件大约700MB),我正在尝试用C#开发一个软件,我可以搜索特定的字符串和找到它所在的行(将出现重复项,因此列表视图/列表框可能是一个好主意)。
每一行都遵循完全相同的数据格式,每个数据类型的起始索引/长度都有详细记录。
示例:
第1行:ZATIXIZ20SWEDENSTACKOVERFLOWCHROME
记录如下:
用户名:0-6岁年龄:7-8
国家:9-14
网站: 15-27浏览器:28-33
我的猜测是,最好的方法是对数据文件进行某种BULK INSERT到数据库中,然后将其编入索引以便以后加快搜索速度。我不太清楚如何做到这一点,也不是最好的方法。 (它还需要搜索所有文件,所以将它们全部插入到同一个表中可能是一个好主意吗?)
到目前为止,我只尝试将其中一个文件读入内存,然后做一个简单的Regex,这当然不是一个好主意。不幸的是我对SQL查询缺乏经验,这就是为什么我还没有尝试过很多。
提前致谢!
答案 0 :(得分:0)
'将所有相同类型的数据插入带有索引列的表中。
如果每个文件的属性不同,请使用多个表。
如果您希望能够将匹配回溯到原始文件,请使用包含列的表:
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方法绝对没问题,即使它可能需要几个小时。