【问题标题】:TXT-File - Split different content with c#TXT-File - 用 c# 分割不同的内容
【发布时间】:2012-08-07 23:08:54
【问题描述】:

我在将 txt 文件导入数据库时​​没有什么问题。 文件的结构有点困难。 第一行只有如下描述:

  • 类型假人
  • 状态就绪
  • 3 号 等等。

在描述(20 到 22 行之间)之后是如下表格:

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

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

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

问候

阿明

示例文件: TestFile

【问题讨论】:

  • 您能给我们一份 CSV 样本吗?
  • 有一个示例文件可供查看将更容易回答。可以分享一个吗?
  • 上传文件的最佳方式是什么?
  • @NimraF pastebin.com 也许?不要让人们下载它,只是链接它。
  • @NimraF 查看该文件,在我看来,它似乎只有一部分作为分隔文件(带制表符)有效我不完全确定提到的任何库是否可以工作,除非文件被修改。从技术上讲,该文件不是 CSV(我认为)

标签: c# split streamreader


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用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
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      Codeplex 上的CommonLibrary.NET 项目也提供专用的 CSV 解析支持。您可以找到使用此库 here 进行 CSV 解析的示例。

      更新

      这里有一些代码可用于解析与上述类似的文本,并使用 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.NET 的简单方法DataTable

      var table = csvDoc.ToDataTable();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 2021-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多