在c#中使用streamReader类

时间:2012-12-06 07:49:23

标签: c# .net streamreader

  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;

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

列值之间的空格不均匀,第1列和第2列之间可以是5,第7列和第8列之间可以是8。

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

我真正需要的是传递给str.Substring(,)的参数,而不是硬编码。

@Habib:示例文本文件在这里 enter image description here

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

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

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

当然,在生产代码中,您需要验证一些事情:

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

答案 2 :(得分:1)

使用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);