2012-08-07 39 views
0

我有一个小问题导入到数据库的TXT文件。 该文件的结构有点困难。 在第一行是只喜欢描述:TXT文件 - 拆分不同的内容与C#

  • 典型虚拟
  • 状态就绪
  • 3号 等。

的描述(20个22行之间)之后而来的表所示:

PartStatus Result Measurement1  Measurement2  ..... 
900   OK  0     20    ..... 
600   Passed 30    400    ..... 

我不知道,在这行的表开始。 读取和处理文件以将其写入数据库的最佳方式是什么?

目前我使用StreamReader并将每个字符串添加到数据表中。

问候

阿明

SampleFile: TestFile

+0

你能给我们一个CSV的样本吗? – 2012-08-07 07:42:33

+0

有一个示例文件可以让你更容易回答。你能分享一个吗? – danish 2012-08-07 07:47:59

+0

什么是上传文件的最佳方式? – NimraF 2012-08-07 08:02:54

回答

1

试试这个:File Helpers。过去我曾经涉猎过它,可能会简化阅读CSV的过程。

1

您可以使用TextFiledParser类,只是跳过无效的行。

using (var reader = new TextFieldParser(@"c:\YourFile")) 
{ 
    reader.TextFieldType = FieldType.Delimited; 
    reader.Delimiters = new string[] {","}; 
    string[] currentRow = null; 
    while (!reader.EndOfData) 
    { 
     try 
     { 
      currentRow = reader.ReadFields(); 
      // do something with the values 
     } 
     catch (MalformedLineException ex) 
     { 
      // skip invalid lines and handle it 
     } 
    } 
} 
1

在Codeplex的CommonLibrary.NET项目中也有专门的CSV解析支持。您可以使用此库找到一个CSV解析示例here

UPDATE

下面是一些代码,可用于解析类似于你有上面的一个文本,并使用CommonLibrary.NET。请注意,原始文本被首先降低在表头(origText.Substring(origText.IndexOf("PartStatus")))开始,和正则表达式匹配是用来与单个逗号(Regex.Replace(sometext, "[ ]+", ","))取代一个或多个连续的空格字符:

var origText = 
    "Type Dummy\n" + 
    "Status Ready\n" + 
    "# Comment line\n" + 
    "# Another comment line\n" + 
    "PartStatus Result Measurement1  Measurement2\n" + 
    "900   OK  0     20\n" + 
    "600   Passed 30    400\n"; 

var trimmedText = 
    Regex.Replace(origText.Substring(origText.IndexOf("PartStatus")), 
        "[ ]+", ","); 

var csvDoc = Csv.LoadText(trimmedText, true, false, ","); 

Console.WriteLine(csvDoc.Get<int>(1, "Measurement2")); 
Console.WriteLine(csvDoc.Get<string>(0, "Result")); 

将产生输出:

400 
OK 

CommonLibrary.NET的CSV解析组件还提供了一种简单的方式来将CSV数据变换成一个ADO.NETDataTable

var table = csvDoc.ToDataTable(); 
+1

+1非常合理的答案,一个很好的例子 – 2012-08-07 18:14:25