2014-01-13 59 views
0

我想從選項卡分隔的txt文件中使用第三列對數據進行排序。嘗試了幾種方法,不知道如何使用第3列對它進行排序。已經使用第一個現在排序它。此外,我需要刪除第三列中的重複項(Case sensitiver,即river不同於River)。這是我的代碼。一旦我取得進展,我會立即作出迴應。感謝;)需要幫助從C#控制檯程序中的tsv中排序數據。

string[] lines = File.ReadAllLines(@"d:\instance_test.txt"); 
//Dictionary<String, Int32> EAR_appcode = new Dictionary<String, Int32>(); 
//Console.WriteLine(); 
//Console.ReadLine(); 
//// Display the file contents by using a foreach loop. 
//System.Console.WriteLine("Contents of WriteLines2.txt = "); 
//foreach (string line in lines) 
//{ 
// // Use a tab to indent each line of the file. 
// Console.WriteLine("\t" + line.Substring(4)); 
// Console.ReadLine(); 
//} 
var no = lines; 

var orderedScores = lines.OrderBy(x => x.Split(' ')[0]); 
//string result = Regex.Split(no, @"[,\t ]+"); 
foreach (var score in orderedScores) 
{ 
    string replacement = Regex.Replace(score, @"\t|\n|\r", "   "); 
    DataTable table = new DataTable(); 
    table.Columns.Add("myCol", typeof(string)); 
    table.Columns.Add("myCol2", typeof(string)); 
    table.Columns.Add("EAR_appcode", typeof(string)); 
    table.Rows.Add(11, "abc11"); 
    table.Rows.Add(13, "abc13"); 
    table.Rows.Add(12, "abc12"); 
    Console.WriteLine(replacement) ; 
    Console.ReadLine(); 

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

} 
+0

嘿,謝謝你的回答,但我仍然面臨問題。數據顯示不正確,我的所有列標題都下降到第3行,哈哈。 – user1063280

+0

這個問題仍然是開放的,答案非常感謝。謝謝! – user1063280

回答

0

這是我的樣本數據:

Col1 Col2 Col3 
zxcv 789 14:02 
asdf 123 12:00 
qwer 456 13:01 
asdf 123 12:00 

我使用這個LINQ語句來:

  1. 創建一系列從「開始」到「lines.L ength - 1"
  2. 分割由‘\ T’
  3. 轉儲每一列到匿名類型
  4. 組由字符串,它是所有列
  5. 僅選擇第一項目爲每個組
  6. 的組合

    排序列3

    static void Main(string[] args) 
    { 
        string[] lines = File.ReadAllLines("Tab.txt"); 
        int start = 1; // set to zero, if no header 
    
        var records = (from i in Enumerable.Range(start, lines.Length - 1) 
            let pieces = lines[i].Split('\t') 
            select new { Col1 = pieces[0], Col2 = pieces[1], Col3 = pieces[2] }) 
            .GroupBy(c => c.Col1 + c.Col2 + c.Col3) 
            .Select(gr => gr.First()) 
            .OrderBy(c => c.Col3); 
    
        foreach (var r in records) 
         Console.WriteLine("{0}, {1}, {2}", r.Col1, r.Col2, r.Col3); 
    
        Console.WriteLine(); 
        Console.WriteLine("Done"); 
        Console.ReadLine(); 
    } 
    

當然,你可以在LINQ ST的最後一行添加解析/轉換代碼以int或DateTime命令。

我測試了它...

+0

嘿,謝謝你的回答,但我仍然面臨問題。數據顯示不正確,我的所有列標題都下降到第3行,哈哈。 – user1063280

+0

我從LINQ中分離出線。定義我需要跳過多少行(「開始」)。 Enumerable.Range()有效地創建了一個「for」循環。 – Hezi

+0

也許,它將整個事物排序,並將我的列標題視爲數據的一部分。有道理兄弟 – user1063280

0

喜歡的東西:

// read lines somehow 
// ... 
// create a list 
var list = new List<Tuple<string, string, string>>(); 
foreach(string line in lines) 
{ 
    var split = line.Split('\x9'); 
    list.Add(new Tuple(split[0], split[1], split[2])); 
} 
// sort 
list = list.OrderBy(x => x.Item3); 
// remove duplicates 
for(int i = 1; i < list.Count; i++) 
    if(list[i].Item3 == list[i-1].Item3) 
     list.RemoveAt(i); 

我相信所有的上面可以只用一個LINQ表達式來完成,但我在這很糟糕。無論如何都必須偷回OrderBy部分^^。

如果沒有.Net框架4.0,然後用非通用版本(申報清單,List<Tuple>)代替Tuple

class Tuple 
{ 
    public string Item1; 
    public string Item2; 
    public string Item3; 
    public Tuple(string i1, string i2, string i3) 
    { 
     Item1 = i1; 
     Item2 = i2; 
     Item3 = i3; 
    } 
} 
+0

你的答案給出了一個錯誤,我需要使用元組來引用什麼程序集?嘗試了所有的用戶系統。引用。 – user1063280

+0

您將需要.Net Framework 4.0+。請參閱編輯。 – Sinatr

+0

謝謝,我工作的地方使用3.5,我會看到它,感謝幫助! – user1063280