2013-06-11 211 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” –