2012-03-09 8 views
-1

これはクラックするのは難しいナットのようです。私はそれがあなたにとって非常に簡単だと思っています。 LINQを使ってこれが可能かどうか疑問に思っていました。ここでリストを変更するLINQクエリ

は私のリストです:私はこのリストを使用して2つのことを達成する必要が

ABC,1,RON,26,73 
CDE,13,JON,21,18 
ERROR,ERROR LINE,ERROR LINE,DEF 
DEF,NOT AVAILABLE,"",JANE,32,13 
GHI,23,DAWN,14,25 

  1. はリスト
  2. の底にERRORと行と次の行を移動しますERRORの後の次の行(「DEF」で始まった行)は、フィールドがすべて正しい行になるように変更する必要があります。しかし、私はまだERROR行の後にとどまるべきです。

最終的なリストは、次のようになります。

ABC,1,RON,26,73 
CDE,13,JON,21,18 
GHI,23,DAWN,14,25 
ERROR,ERROR LINE,ERROR LINE,DEF 
DEF,NOT AVAILABLE,JANE,32,13 

を今、私の完全な、詳細なLINQクエリは次のようになります。あなたがしたい場合

var myList = (File.ReadLines(myFile.ToString(), Encoding.GetEncoding(1250))) 
    .ToList() 
    .OrderBy(l => l[0].ToString()) 
    .Select(l => new specialclass { 
     Comp = l[0].ToString(), 
     Place = Convert.ToInt32(l[1].ToString()), 
     Name = l[2].ToString(), 
     Limit = Convert.ToInt32(l[3].ToString()), 
     Limit2 = Convert.ToInt32(l[4].ToString()) 
    }); 
+3

このデータは実際どのように配置されていますか?いくつかのコードを表示します。それは私のリストのようにはあまり見えません。 – Yuck

+3

linqで列挙している間に何かを修正することはできないので、質問は無効と表示されます。また、 "私のリスト"が何であるかを理解することは難しいです。各線はリストのオブジェクトですか?または、LinqからSqlへの更新クエリの実行について話していますか? – Will

+0

私はデリミタとして二重スペースを持つレガシーテキストファイルを読んでいます。私は単純にカンマを使用しました。今すぐ完全な、詳細なLINQクエリは次のようになります:var myList =(File.ReadLines(myFile.ToString()、Encoding.GetEncoding(1250)))ToList() \t .OrderBy(l => l [0 ]。ToStringメソッド()) \t .Select(L =>新しいspecialclass \t {\t \tコンプ= 1 [0] .ToString()、 \t \tプレイス= Convert.ToInt32(L [1] .ToString())、 \t \t名= 1 [2] .ToString()、 \t \tリミット= Convert.ToInt32(L [3] .ToString())、 \t \t LIMIT2 = Convert.ToInt32(L [4] .ToString() ) \t}); –

答えて

6

LINQは、適切なツールではありませんあなたが反復しているものを修正する。主にインデクサーを使用する必要がある場合は、適切ではありません。 LINQのソリューションを提供することは、それが最終的にこの問題の正しい解決策でない場合であっても検討する価値があり、かかわらず

var data = System.IO.File.ReadAllLines(@"C:\Temp\Data.csv"); 
var result = new List<String>(); 
var errors = new List<Tuple<int, String, String>>(); 
for (int i = 0; i < data.Length; i++) 
{ 
    var line = data[i]; 
    var cols = line.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
    if (cols[0].ToUpper() == "ERROR") 
    { 
     var nextLine = data.Length > i+1 ? data[i + 1].Replace("\"\"","") : String.Empty; 
     var nextCols = nextLine.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
      .Where(col => !String.IsNullOrWhiteSpace(col) && !(col.Trim() == "0")); 
     var errorInfo = Tuple.Create(i, line, String.Join(",", nextCols)); 
     errors.Add(errorInfo); 
     i++; 
    } 
    else { 
     result.Add(line); 
    } 
} 
foreach(var error in errors) 
{ 
    result.Add(error.Item2); 
    result.Add(error.Item3); 
} 
+0

[OK]を、これは誤りラインを(それがどのように完全には明らかではありません)を変更しませんが、多分あなたは正しい軌道:) –

+0

に今しているので、あなたが必要なものすべてがあることを理解する簡単な方法がありますされませんされてでる?しかし、あなたは間違いなく正しい方向に私を指摘してきました。 –

+0

@inquisitive_one:次に、削除すべきものとその理由を明確に定義します。私は '' ''を見ましたが、これはほんの一例ですか?あなたのサンプルデータには、他の行よりも1つ多くのフィールドがありますが、これはいつものケースです(おそらく時々、違う内容のフィールドが違うかもしれません)。 –

0

その他の警告:

これはあなたを助ける必要があります別のアプローチです。

私はLINQソリューションを提供していますが、適切な制作にふさわしいソリューションでは、ファイルが適切に形成されているかどうかのチェックを含むエラーチェックと引数検証が必要です。多くの場合、完全に機能するには少し難題があります。あなたは千数百あるいは数のエントリからのみのどこかのデータでこれを実行することを計画している場合

var myList = 
    File.ReadLines(myFile.ToString(), Encoding.GetEncoding(1250)) 
    .Select(line => 
    { 
     var split = line.Split(','); 
     return new specialclass 
     { 
      Comp = split[0], 
      Place = Convert.ToInt32(split[1]), 
      Name = split[2], 
      Limit = Convert.ToInt32(split[3]), 
      Limit2 = Convert.ToInt32(split[4]) 
     }; 
    }) 
    .ToList(); 

var itemsAndPrevious = new specialclass [] { null } 
    .Concat(myList) 
    .Zip(myList, (prev,item) => new { prev, item }); 

var itemsWithoutError = 
    itemsAndPrevious 
     .Where(i => i.item.Comp != "Error" // omit error line 
      && (i.prev == null || i.prev.Comp != "Error")) // omit line following error lines 
     .Select(i => i.item) 
     .OrderBy(i => i.Comp); 

var itemsWithError = 
    itemsAndPrevious.Where(i => i.prev != null && i.prev.Comp == "Error") 
    .OrderBy(i => i.item.Comp) 
    .SelectMany(i => new [] { i.prev, i.item }); 

var desiredResult = itemsWithoutError.Concat(itemsWithError); 

、これはあなたが、より効率的なソリューションを見つける必要がないことを十分に行うことができます。重要なことは、実装が十分に速くなるとは想定していないことです。また、入力サイズの倍増がコードの実行時間にどのように影響するのかも理解しておく必要があります。

私は上記のコードがテスト済みであるか、またはバグのないことを保証しません。 Zipが4.0に追加されました。その前にフレームワークを使用している場合は利用できません。それ以外の場合は、独自のZipを実装することが有効です。ハッピーコーディング。

関連する問題