2016-07-07 7 views
1

私は多くの行を含むテキストファイルを持っています。各行は次のようになります。 "string string double double"は各値の間にスペースです。私はすべての行の最初の文字列と最後の2文字を読み込み、これらの2つの値を既存のリストに入れたいと思います。それは今までの私のコードですが、実際にはうまくいきません。テキストファイルから特定の値を読み込んでリストに入れます

private void bOpen_Click(object sender, RoutedEventArgs e) 
    { 
     bool exists = File.Exists(@"C:\Users\p2\Desktop\Liste.txt"); 

     if (exists == true) 
     { 
      StringBuilder sb = new StringBuilder(); 

      using (StreamReader sr = new StreamReader(@"C:\Users\p2\Desktop\Liste.txt")) 
      { 
       Vgl comp = new Vgl(); 
       comp.name = Abzahlungsdarlehenrechner.zgName; 
       comp.gErg = Abzahlungsdarlehenrechner.zgErg; 

       GlobaleDaten.VglDaten.Add(comp); 


       int i = 0; 
       string line = File.ReadLines(@"Liste.txt").Skip(0).Take(1).First(); 
       while ((line = sr.ReadLine()) != null) 
       { 
        sb.Append((line)); 
        listBox.Items.Add(line); 
        GlobaleDaten.VglDaten.Add(comp); 

        i++; 
       } 
      } 
     } 

私はすでにこれを読んでいるが、それは、これが問題を丸めにつながる可能性があるので、私はdoulbe値以内にお金を保存しないようになりHow do I read specific value[...]

+0

最初と最後の単語が必要ですか?または最初の "文字列"と最後の "ダブル"の正確な単語? – user3185569

+0

@ user3185569それぞれの値。例:名前500 –

+0

リストにどのように値を入れるつもりですか?スペースで区切られた文字列として? –

答えて

1

あなたが使用することができます。

string[] splitBySpace = line.Split(' '); 

string first = splitBySpace.ElementAt(0); 
decimal last = Convert.ToDecimal(splitBySpace.ElementAt(splitBySpace.Length - 1)); 

編集:通貨記号を処理するために:

string[] splitBySpace = line.Split(' '); 
string pattern = @"[^0-9\.\,]+"; 

string first = splitBySpace.ElementAt(0); 
string last = (new Regex(pattern)).Split(splitBySpace.ElementAt(splitBySpace.Length - 1)) 
            .FirstOrDefault(); 

decimal lastDecimal; 
bool success = decimal.TryParse(last, out lastDecimal); 
+0

は私のコードのwhileループの中に入れたはずですか?なぜなら、私はそれがいくつかのエラーを表示しない理由です。 –

+0

@SebDammerあなたのコードでwhile((line = sr.ReadLine())!= null){} 'の内側にあるはずです。 – user3185569

+0

これはうまくいくようです。しかし、私は少し自分のコードの一部を書き直さなければならないでしょう。私は別のクラスの比較メソッドのリストに値を入れる必要があります。あなたの方法は、fuboの方法のように€ - 署名にいくつかの問題があるようです。 –

2

方法について

List<Vgl> Result = File.ReadLines(@"C:\Users\p2\Desktop\Liste.txt") 
      .Select(x => new Vgl() 
      { 
       name = x.Split(' ').First(), 
       gErg = decimal.Parse(x.Split(' ').Last(), NumberStyles.AllowCurrencySymbol) 
      }) 
      .ToList(); 

役立つdidntの。代わりにdecimalを使用してください。ここでは例:Is a double really unsuitable for money?

+0

@SebDammerあなたは 'NumberStyles.AllowCurrencySymbol'を使用して€などの通貨記号で例外を避けることができます - 私の答えを更新しました – fubo

+0

Didntはヒントを感謝しています:)しかし突然、 。 Dmitry Bychenkosのコードは流暢に作業しました。 "System.FormatException"もう一度... –

+0

ファイルを知らずに言うのは難しいです。文字列の中のスペースか 'の代わりに'、 '。セパレーターが理由である可能性があります。 – fubo

2

あなたはLINQのを試すことができます。

var source = File 
    .ReadLines(@"C:\Users\p2\Desktop\Liste.txt") 
    .Select(line => line.Split(' ')) 
    .Select(items => new Vgl() { 
     name = items[0], 
     gErg = double.Parse(items[3]) 
    }); 

// If you want to add into existing list 
GlobaleDaten.VglDaten.AddRange(source); 

// If you want to create a new list 
//List<Vgl> list = source.ToList(); 
+0

私の比較方法でも、完璧に動作します。ありがとうございました! :) –

0

使用文字列を。文字列iの行の区切り文字としてスペースを使用して分割するnは各値を持つ配列です。次に、最初と最後の配列要素にアクセスします。もちろん、各行に正確に4つの値が含まれていることが絶対に確実でない場合は、配列の長さを調べて少なくとも4つの値があることを確認することができます。分割使用上の

参照:私は@Dmitryとfuboに同意 https://msdn.microsoft.com/en-us/library/ms228388.aspx

1

をあなたは選択肢を探しているなら、あなたはこれを試みることができます。

var source = File 
    .ReadLines(@"C:\Users\p2\Desktop\Liste.txt") 
    .Select(line => 
    { 
     var splits = line.Split(' ')); 
     return new Vgl() 
       { 
        name = splits[0], 
       gErg = double.Parse(splits[3]) 
       }; 
    } 
0
  1. 文字列としてファイル全体をお読みください。
  2. \ r \ nを行セパレータとして使用して、foreachループで文字列を分割します。各行を文字列のリストに追加します。
  3. このリストを繰り返し、フィールドセパレータとしてスペースを使用して別のループ内の各レコードを分割し、それらを別の文字列リストに入れます。
  4. これで、4つのフィールドすべてに1行が含まれています。 FirstとLastメソッドを使用して、最初の単語と最後の数字を取得します。
関連する問題