将文本文件读取到数据库表中的有效方法



我有一个日志文件。该文件是结构化的。每一行都用逗号分隔,看起来像一张表。我必须从这个文件中读取并将内容传输到数据库表中。我想将前9个逗号视为delimeter,将其余逗号视为第十列的内容。因此,一行中可以有9个以上的逗号,但第十个和后面的逗号不应被视为delimeter。实际上,我知道如何通过遍历字符和检查逗号的出现来做到这一点。但我不希望它效率低下。也许还有更好的办法?实现这一目标的最准确方法是什么?C#或Delphi都可以。对于Oracle,我可能会使用Oracle,但SQL Server也是一个选项。

String.Split(char[],int)方法重载可以满足您的需求。例如:

string line = "a,b,c,d,e,f,g,h,i,j,k,l,m,n";
string[] fields = line.Split(new char[] { ',' }, 10);

fields数组将包含十个元素。前九个元素对应于由','字符分隔的line的前九个子串,而最后一个元素将对应于剩余的子串(在第九次出现','之后)。

来自MSDN(count是传递给Split(char[], int)方法的第二个参数):

如果此实例中有多个count子字符串,则返回值的第一个count减1元素中会返回第一个count减1子字符串,而此实例中的其余字符将返回值的最后一个元素中。

因此,执行:

for (int i = 0; i < fields.Length; ++i)
    Console.WriteLine(string.Format("fields[{0}]: "{1}"", i, fields[i]));

将输出:

fields[0]: "a"
fields[1]: "b"
fields[2]: "c"
fields[3]: "d"
fields[4]: "e"
fields[5]: "f"
fields[6]: "g"
fields[7]: "h"
fields[8]: "i"
fields[9]: "j,k,l,m,n"

一些数据库具有ETL(提取、转换、加载)功能,可以在设置后快速高效地导入外部数据。它们的灵活性取决于数据库——你没有说是哪个。为了在Delphi中识别列,我会使用正则表达式,不管怎样,它们都和你想做的完全一样——迭代字符串并匹配字符,一个好的正则表达式库可以快速(灵活)。您应该避免的是每个文件读取一个字符。将n行读取到内存缓冲区中并在那里进行处理。

尝试使用FileHelpers库及其DatabaseStorage类。

最新更新