我有一个日志文件。该文件是结构化的。每行都用逗号分隔,以便它看起来像一个表。我必须从这个文件中读取并将内容传输到数据库表。我想将前9个逗号视为分界符,而将其余的逗号视为第10列的内容。因此,一行中可以有超过9个逗号,但第十个和下一个可以不作为分隔符。我实际上知道如何通过迭代字符和检查逗号的出现来做到这一点。但我不希望它效率低下。也许有更好的方法?什么是最准确的方法来实现这一目标?无论是C#还是Delphi都可以。对于Oracle,我可能会使用Oracle,但SQL Server也是一种选择。
答案 0 :(得分: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个元素中返回第一个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"
答案 1 :(得分:3)
某些数据库具有ETL(提取,转换,加载)功能,可以在设置后非常快速有效地导入外部数据。它们的灵活性取决于数据库 - 你没有说明是哪一个。 为了在Delphi中识别你的列我会使用正则表达式,无论如何它们完全按照你要做的去做 - 迭代字符串并匹配字符,只需一个好的正则表达式库就可以快速(和灵活)。 你应该避免的是每个文件读取一个字符。将n行读入内存缓冲区并在那里处理它们。
答案 2 :(得分:1)
尝试使用FileHelpers Library及其DatabaseStorage类。