2013-06-11 147 views
2

我有一個具有特定特徵的文件,但是在此文件的第30列中,我有一個數字,而不是順序的5位數字,我想排列這些行這個文件的基礎上,按升序排列。根據內容對文件內容進行排序

例如:

sample sample sample1  00094 
sample sample sample2  00001 
sample sample sample3  00032 
sample sample sample4  00491 
sample sample sample5  00002 
sample sample sample6  00010 
sample sample sample7  00007 

的序列號是00094,00001 ...

,輸出是:

sample sample sample2  00001 
sample sample sample5  00002 
sample sample sample7  00007 
sample sample sample6  00010 
sample sample sample3  00032 
sample sample sample1  00094 
sample sample sample4  00491 

我開發了一個非常SITEMA豬,我在那裏在列表中播放所有內容,並進行冒泡排序,然後,我想知道是否有更有效的方法來做到這一點,或許使用Linq,或者甚至採用不同的方式。

感謝您的幫助。

+0

'在第30列'這些列如何分開?按標籤?乘太空? –

+0

http://stackoverflow.com/questions/188141/c-sharp-list-orderby-alphabetical-order –

+0

那只是在列30中,我可以在前30列中有一個名字,可以全部使用第一個30列... – Alexandre

回答

3
string[] lines = File.ReadAllLines(@"C:\temp\yourFile.txt"); 

var sotedLines = lines.Skip(1) 
         .Take(lines.Length - 2) 
         .OrderBy(getKeyFromLine) 
         .ToArray(); 

sortedLines.ForEach(Console.WriteLine); 

現在,如果你的列用空格分隔,下次使用getKeyFromLine實現:

Func<string, int> getKeyFromLine = line => int.Parse(line.Split(' ')[30]); 

如果是在一行簡單的30 - 35基於1的索引數字,然後用

Func<string, int> getKeyFromLine = line => int.Parse(line.Substring(29, 5)); 
+0

它可能使不處理文件的第一行和最後一行? – Alexandre

+0

@Alexandre更新了我的回答 –

+0

如果這是一個很大的文件,並且你不想將它讀入內存,你可以嘗試像'File.ReadLines(@「C:\ temp \ yourFile.txt」).Skip 1).Reverse()。Skip(1).Reverse()。OrderBy(getKeyFromLine)'將內容保存在一個枚舉中。 – neontapir

1

如何:

string[] lines = File.ReadAllLines(@"text.txt"); 
var result = lines.AsParallel() 
    .OrderBy(s => s.Split(' ').Last()) 
    .ToList(); 
+0

這不是空間,它分隔列。用'column'OP表示一行中的字符位置。他需要30-35個字符。我花了一些時間爲我解決(見評論) –

+0

但是數字仍然是每行中的最後一個非空格字符? –

+0

我不知道。可能是這種情況,他們並沒有排在最後。此外,您需要按字母數字順序排序,但不能以順序排列,因此您可能還需要使用「int.Parse」 –