【问题标题】:Order the lines in a file by the last character on the line按行上的最后一个字符对文件中的行进行排序
【发布时间】:2011-01-25 19:25:31
【问题描述】:

你能帮我解决这个问题吗: 我想在 C# 中构建一个方法,它将按照以下规则对大量文件进行排序 每行包含字符串,每行中的最后一个字符是一个 int。 我想按最后一个字符 int 对文件中的行进行排序。

谢谢

【问题讨论】:

  • 你能举几行作为例子吗?还有,是1位整数,2位,混合吗?
  • 表示一个 int 的单个字符?订购很多文件,还是订购很多行?这是作业吗?
  • "asdtrtjt 428.1812 290.6577 1" 这是一行的示例;最后一个字符始终是一个数字,但它可以有多个数字。这不是作业 :) 我想订购很多文件
  • 而数字前总是有一个空格' '

标签: c# file file-io io


【解决方案1】:

按最后一个字符升序,解释为整数,你可以这样做:

var orderedLines= File.ReadAllLines(@"test.txt")
                        .OrderBy(line => Convert.ToInt32(line[line.Length-1]))
                        .ToList();

编辑:

在您的评论中澄清 - 空格字符后面的整数可以多于一位:

var orderedLines= File.ReadAllLines(@"test.txt")
                      .OrderBy(line => Convert.ToInt32(line.Substring(line.LastIndexOf(" ")+1, 
                                                                        line.Length - line.LastIndexOf(" ")-1)))
                      .ToList();

【讨论】:

  • 投了反对票的人 - 澄清整数可以有多个数字,并且在我最初回答之前没有添加空格字符之后 - 我更新以包括该要求
【解决方案2】:

您可以这样做,其中filename 是您的文件名:

// Replace with the actual name of your file
string fileName = "MyFile.txt";

// Read the contents of the file into memory 
string[] lines = File.ReadAllLines(fileName);

// Sort the contents of the file based on the number after the last space in each line
var orderedLines = lines.OrderBy(x => Int32.Parse(x.Substring(x.LastIndexOf(' '))));

// Write the lines back to the file
File.WriteAllText(fileName, string.Join(Environment.NewLine, orderedLines));

这只是一个粗略的轮廓;希望对您有所帮助。

【讨论】:

  • 整数可以有多个数字。
  • 感谢您的回答,我会测试一下
  • 解决方案有效,orderedLines var 包含有序的行。但是在我的文件中没有任何改变?使用 File.WriteAllText 方法后我应该关闭文件吗?
  • 对不起,我的错误,该文件已成功创建:)
【解决方案3】:
File.WriteAllLines(
    pathToWriteTo,
    File.ReadLines(pathToReadFrom)
        .OrderBy(s => Convert.ToInt32(s.Split(' ').Last()))
);

如果文件很大,这可能无效,因为这种有效的排序方法需要将整个文件读入内存。

【讨论】:

    【解决方案4】:

    假设您想要的不仅仅是个位数的整数,并且您在文件名和其余部分之间有一个分隔符(我们称之为“splitChar”),它可以是任何字符:

    from string str in File.ReadAllLines(fileName) 
        let split = str.Split(splitChar)
        orderby Int32.Parse(split[split.Count()-1]) 
        select str
    

    将按照最后一个分组的整数值的顺序为您提供一个字符串序列(由拆分字符分隔)。

    【讨论】:

    • 这段代码有效: var orderedLines = lines.OrderBy(line => Convert.ToInt32(line.Substring(line.LastIndexOf(" ") + 1, line.Length - line.LastIndexOf( " ") - 1))); File.WriteAllText(fileName, string.Join(Environment.NewLine, orderedLines)); orderedLines var 是有序的,但文件没有被改变。我应该关闭它还是什么?
    • 很好,如果它有帮助,你应该接受它,但请仔细查看其他选项,较高的评分表明其他人更喜欢它们。
    【解决方案5】:

    也许这些链接之一可以通过自然的方式来帮助您:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多