0
  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:示例文本文件在这里 在此处输入图像描述

4

3 回答 3

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

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

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

  • 您已阅读预期的字段数
  • 您可以安全地将您的字符串字段值转换为 Doubles(为此用途Double.TryParse
于 2012-12-06T08:09:10.903 回答
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);
于 2012-12-06T08:37:35.273 回答
1

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

public myRows(string str)
       {
          string[] splitArray = str.Split(); //split on white space
          if(splitArray.Length > 7)
              {
               Number1 = Convert.ToDecimal(splitArray[0]);
               //,....... So on
              }
       }
于 2012-12-06T07:59:35.513 回答