2

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

4

3 回答 3

4

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 个元素中返回前-1 个子字符串count,在此实例中的剩余字符在返回值的最后一个元素中返回。

因此,执行:

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"
于 2012-01-21T13:16:06.437 回答
3

一些数据库具有 ETL(提取、转换、加载)功能,一旦设置好,就可以非常快速有效地导入外部数据。它们的灵活性取决于数据库 - 你没有说哪个是。为了在 Delphi 中识别您的列,我会使用正则表达式,无论如何它们会完全按照您的方式进行 - 迭代字符串并匹配字符,一个好的正则表达式库可以快速(且灵活)。您应该避免的是每个文件读取一个字符。将 n 行读入内存缓冲区并在那里处理它们。

于 2012-01-21T13:17:25.937 回答
1

尝试使用FileHelpers Library及其 DatabaseStorage 类。

于 2012-01-25T12:47:37.070 回答