【问题标题】:using streamReader class in c#在 C# 中使用 streamReader 类
【发布时间】:2012-12-06 16:51:31
【问题描述】:
  public class myRows
   {
       public decimal Number1 { get; set; }
       public decimal Number2 { get; set; }
       public decimal Number3 { get; set; }
       public decimal Number4 { get; set; }
       public decimal Number5 { get; set; }
       public decimal Number6 { get; set; }
       public string Date1 { get; set; }

       public myRows(string str)
       {
               Number1 = Convert.ToDecimal(str.Substring(3, 7));
               Number2 = Convert.ToDecimal(str.Substring(15, 8));
               Number3 = Convert.ToDecimal(str.Substring(24, 8));
               Number4 = Convert.ToDecimal(str.Substring(36, 8));
               Number5 = Convert.ToDecimal(str.Substring(47, 8));
               Number6 = Convert.ToDecimal(str.Substring(58, 8));
               Date1 = str.Substring(65, 25);
       }
   }

然后我像这样读取文本文件数据

var myRows = new List<myRows>();
var myR = new StreamReader(txtFileToImport.Text);
while (!myR.EndOfStream)
      {
          string s = myR.ReadLine();
          if (!String.IsNullOrEmpty(s.Trim()))
          {
             myRows.Add(new myRows(s));
          }
          }
  myR.Close();
  dataGridView1.DataSource = myRows;

我遇到的问题是预先确定文本文件中列值之间的起始索引和空白长度,例如这里Convert.ToDecimal(str.Substring(3, 7));

列值之间的空格不统一,可以在第 1 列和第 2 列之间为 5,然后在第 7 列和第 8 列之间为 8。

目前,我必须提前知道空白开始和结束的索引。有没有我可以动态获取空白的起始索引及其长度而无需查看要处理的文本文件?

我真正需要的是传递给str.Substring(,) 的参数不要被硬连接。

@Habib:示例文本文件在这里

【问题讨论】:

  • 正要说拆分... +1
  • @SQL.Net Warrior,你能放一个示例输入字符串吗?
  • @Habib,我添加了一个示例文本文件截图

标签: c# .net streamreader


【解决方案1】:

在带有StringSplitOptions.RemoveEmptyEntries 选项的空格字符上使用String.Split。这将有效地删除空字段,只留下包含数据的字段。

给定line 中的一行文本文件,您的代码将如下所示:

var fields = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var Number1 = Convert.ToDecimal(fields[0]);
var Number2 = Convert.ToDecimal(fields[1]);
// etc.

由于您的日期数据被分解为多个离散字段(星期几、月份、日期等),您将通过它们占用的字段“重新组合”它们并分配给您的 Date1

var Date1 = string.Format("{0} {1} {2} {3} {4}", fields[7], fields[8], fields[9], fields[10], fields[11]);

当然,在生产代码中,您需要验证几件事:

  • 您已阅读预期的字段数
  • 您可以安全地将字符串字段值转换为双精度值(为此 使用Double.TryParse)

【讨论】:

【解决方案2】:

您可以在string 上使用string.Split(),然后使用数组索引而不是字符串位置来转换数字。在空格上拆分字符串将从字符串中删除空格。比如:

public myRows(string str)
       {
          string[] splitArray = str.Split(); //split on white space
          if(splitArray.Length > 7)
              {
               Number1 = Convert.ToDecimal(splitArray[0]);
               //,....... So on
              }
       }

【讨论】:

    【解决方案3】:

    使用Split 方法将您的行分成8 个部分。最后一个将是您的约会对象。

    var parts = line.Split(new char[]{' '}, 8, StringSplitOptions.RemoveEmptyEntries);
    
    Number1 = Decimal.Parse(parts[0]);
    Number2 = Decimal.Parse(parts[1]);
    ......
    ......
    DateTime Date1 = DateTime.ParseExact(parts[7],"ddd MMM dd HH:mm:ss yyyy",CultureInfo.InvariantCulture);
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2013-08-08
      • 2023-01-19
      • 1970-01-01
      • 2013-10-07
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多