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()を使用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 に答える
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 に答える