-6

こんにちは、C# を使用して、テキスト内のデータを 3 つのリスト コントロールに追加したいと考えています。

メインの追加リストとサイド リストがあり、テキスト ファイルの 1 つの内容をここに示します

#main
9622164
90411554
57568840
53804307
44095762
89399912
88264978
26400609
45725480
53804307
53129443
51858306
53797637
91020571
27415516
57568840
89185742
20586572
99594764
19613556
53797637
75500286
51858306
89185742
26400609
90411554
44330098
91020571
90411554
47297616
75500286
28297833
26400609
27415516
45725480
53804307
89399912
89399912
29401950
9622164
#extra
79229522
41517789
80321197
76774528
44508094
83994433
45815891
26593852
74371660
80117527
80117527
10389142
10389142
90726340
51735257
!side
74530899
74530899
804000084
70095154
80344569
24508238
24508238
5318639
5318639
15800838
15800838
35027493
35027493
54974237
54974237

メイン リストの #main の下のすべての行、サイド リストの !side の下のすべての行、extra リストの #extra の下のすべての行が必要です。

atmを使用してアイテムをリストに追加するコードは次のとおりですが、それらを分離する必要があります

   String text = File.ReadAllText("test.ydk");

    var result = Regex.Split(text, "\r\n|\r|\n");

    foreach (string s in result)
    {
        MainDeck.Items.Add(s);
    }
4

5 に答える 5

2

を使用してテキストファイルを読み取る場合、行Linq Skipで andを使用できますTakeFile.ReadAllLines

例:

// Read all the lines from the text file
var textLines = File.ReadAllLines("c:\\stackoverflow.txt");

// Skip first line `#main` and take all lines until `"#extra`
var mainItems = textLines.Skip(1).TakeWhile(x => !x.Equals("#extra"));

// Skip items before `#extra`, and take all before `!side`
var extraItems = textLines.SkipWhile(x => !x.Equals("#extra")).Skip(1).TakeWhile(x => !x.Equals("!side"));

// Skip items before `!side` and take the rest
var sideItems = textLines.SkipWhile(x => !x.Equals("!side")).Skip(1);

大きなテキストファイルにはこれをお勧めしませんが、提供された例では問題ありません。

于 2013-07-05T00:23:08.470 に答える
1

ファイルからすべての行を読み取る File.ReadLined メソッドに勝るものはありません

必要な方法で繰り返して分割することができます。Foreachすべてのアイテムに最後に見た名前を付けることは合理的なアプローチです。

を使用Aggregateすると、必要に応じて 1 つのステートメント ソリューションを提供できます。Tuple不変を使用してステップ間で値を渡し、IEnumerableアイテムを保存するために使用するファンシー バージョンのサンプル。ほとんど機能的にきれいなコード (TryParseフレームワークに適切なバージョンが存在しない場合を除く):

int value;
var dictionaryOfNumberByName = File.ReadLines(@"c:\myFile.txt")
  .Aggregate(
     Tuple.Create("unknown", Enumerable.Repeat(Tuple.Create("", 0), 0)),
     (all, line) => int.TryParse(line, out value) ? 
          Tuple.Create(
            all.Item1,
            all.Item2.Concat(Enumerable.Repeat(Tuple.Create(all.Item1, value),1))) : 
          Tuple.Create(line, all.Item2),
     all => all.Item2
       .GroupBy(
            item => item.Item1, 
            (key, source) => Tuple.Create(key, source.Select(v => v.Item2).ToList()))
       .ToDictionary(item => item.Item1, item => item.Item2));

通常のコードでは、要素を変更可能な辞書に直接集約する必要があります。

var dictionaryOfNumberByName = File.ReadLines(@"c:\myFile.txt")
  .Aggregate(Tuple.Create("unknown", new Dictionary<string, List<int>>()),
   (all, line) => { 
      int value;
      if(!int.TryParse(line, out value))
      {
          all.Item2.Add(line, new List<int>());
          return Tuple.Create(line, all.Item2); // switch current word
      }
      else
      {
        all.Item2[all.Item1].Add(value);
        return all;
      }
}); 
于 2013-07-05T00:20:59.963 に答える
0

これにより、すべての値が分離された単一のコレクションを持つことができます。

Dictionary<string, List<string>> results = new Dictionary<string, List<string>>();
string line;
int count = -1;
using (var reader = File.OpenText(@"C:\Users\Jose\Desktop\bla.txt"))
{
      while ((line = reader.ReadLine()) != null)
      {
           if (!Regex.IsMatch(line, @"\d"))
           {
               results.Add(line, new List<string>());
               count++;
           }
           else
           {
                results.ElementAt(count).Value.Add(line);
           }
       }

}
于 2013-07-05T03:10:18.403 に答える
0

既に文字列に変換していると仮定すると、string.split() 関数を使用できます。これはc#を使用しています。

sting yourtextfile;
//make all the different sections the same
yourtextfile.replace("#main", "#");
yourtextfile.replace("#extra", "#");
yourtextfile.replace("!side", "#");
//make all the arrays
string[] all = yourtextfile.Split('#');
string[] main = all[0].Split('\n');
string[] extra = all[1].Split('\n');
string[] side = all[2].Split('\n');

その後、配列をリストに変換すると、必要な 3 つのリストが得られます。

于 2013-07-05T00:28:12.903 に答える
0

File.ReadAllLines文字列配列の各行のコンテンツを取得するために使用し、リスト内の各項目を反復処理して、各項目を (再) 追加するリストを制御するフラグを設定します。各行を 2 回処理する必要があるため、最も効率的ではありませんが、非常にクリーンで理解しやすいものです。

于 2013-07-05T00:20:34.793 に答える