2016-06-15 1 views
0

次の例は、任意の単語またはフィールド(LINQ)(C#)によるテキストデータの並べ替えまたはフィルタ処理に関するmsdn記事の例です。私は同じことをしたいと思いますが、私が持っているテキストファイルは.csvファイルではなく、区切り文字としてカンマを持たず、フィールド/列の開始位置と終了位置を指定する必要があります。開始位置と終了位置を使用してLINQで列ごとにテキストファイルを並べ替える方法

public class SortLines 
    { 
     static void Main() 
     { 
      // Create an IEnumerable data source 
      string[] scores = System.IO.File.ReadAllLines(@"../../../scores.csv"); 

      // Change this to any value from 0 to 4. 
      int sortField = 1; 

      Console.WriteLine("Sorted highest to lowest by field [{0}]:", sortField); 

      // Demonstrates how to return query from a method. 
      // The query is executed here. 
      foreach (string str in RunQuery(scores, sortField)) 
      { 
       Console.WriteLine(str); 
      } 

      // Keep the console window open in debug mode. 
      Console.WriteLine("Press any key to exit"); 
      Console.ReadKey(); 
     } 

     // Returns the query variable, not query results! 
     static IEnumerable<string> RunQuery(IEnumerable<string> source, int num) 
     { 
      // Split the string and sort on field[num] 
      var scoreQuery = from line in source 
          let fields = line.Split(',') 
          orderby fields[num] descending 
          select line; 

      return scoreQuery; 
     } 
    } 

/* Output (if sortField == 1): 
    Sorted highest to lowest by field [1]: 
    116, 99, 86, 90, 94 
    120, 99, 82, 81, 79 
    111, 97, 92, 81, 60 
    114, 97, 89, 85, 82 
    121, 96, 85, 91, 60 
    122, 94, 92, 91, 91 
    117, 93, 92, 80, 87 
    118, 92, 90, 83, 78 
    113, 88, 94, 65, 91 
    112, 75, 84, 91, 39 
    119, 68, 79, 88, 92 
    115, 35, 72, 91, 70 
*/ 

テキストファイルに区切り文字がない場合、上記の例を並べ替えるにはどうすればよいですか。たとえば、最初の行のすべてのコンマ区切り文字を上記の例から削除すると、11699869094 となるので、スコア欄は開始位置3と終了位置4にあり、値99が得られます。ソートされるフィールド/列の最終位置。

答えて

1

ご注文条件にstring.Substring()を使用することができます。私はLinqのラムダ構文に慣れています。

var scoreQuery = source.OrderByDescending(line => line.Substring(3, 2)); 

これは、文字列からオフセット3が必要であることを前提としています。ポジション3が必要な場合は、代わりに4を使用します(サブストリングは0ベース)。 2は、注文目的で使用する文字数を示します。

ここでは、クエリ構文を使用した同じソリューションでの試行があります。微妙な変更が必要な場合があります

 var scoreQuery = from line in source 
         orderby line.Substring(3, 2) descending 
         select line; 
+0

ありがとうございます!それはうまくいった! – ptn77

+0

追加の列を追加したい場合は、次のように並べ替えることができますか?var scoreQuery =ソースの行から orderby line.Substring(3,2)and line.Substring(5,2) selectライン; – ptn77

+0

'var scoreQuery =ソースからの行orderby line.Substring(3,2)descenting、line.Substring(5,2)降順セレクトライン;'参照http://stackoverflow.com/questions/298725/multiple-order- by-in-linq –

関連する問題