【问题标题】:Sort the file content based on the content根据内容对文件内容进行排序
【发布时间】:2013-06-07 10:50:36
【问题描述】:

我有一个特别具有某些特征的文件,但是在这个文件的第 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,甚至是不同的方式。

感谢您的帮助。

【问题讨论】:

  • in column 30 这些列是怎么分开的?按标签?按空间?
  • 就是在第30列,我可以在前30列有名字,可以使用前30列...
  • 列之间的分隔符是什么?你如何获得第 30 列?
  • 字符...数字、字母、空格...任何东西,数字将在第 30 到 35 列中

标签: c# linq


【解决方案1】:
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));

【讨论】:

  • 是否可以不处理文件的第一行和最后一行?
  • 如果这是一个大文件并且您不想将其读入内存,您可以尝试使用File.ReadLines(@"C:\temp\yourFile.txt") .Skip(1).Reverse().Skip(1).Reverse().OrderBy(getKeyFromLine) 之类的方法将内容保存在可枚举中。
  • 反向评估被推迟到您实际尝试提取数据为止。但是,结合使用 File,您可能是对的。大多数测试都是必需的。
  • 延迟,但不是流式传输。当您阅读第一项时 - 您将阅读所有内容,File.ReadLines 在这种情况下会有所帮助。
【解决方案2】:

怎么样:

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

【讨论】:

  • 分隔列的不是空格。 column OP 表示一行中的字符位置。他需要 30-35 个字符。我花了一些时间才弄清楚(见 cmets)
  • 但数字仍然是每行最后一个非空格字符?
  • 我不知道。情况可能是,他们不在队伍的最后。此外,您需要按字母数字顺序订购,而不是按字母顺序订购,因此您可能还需要使用int.Parse
猜你喜欢
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多