按某些标准从每行对数据文件行进行排序

本文关键字:数据 排序 文件 标准 | 更新日期: 2023-09-27 18:16:36

我有一个像这样以制表符分隔的文件:

Name    ID    LastName    ZipCode     Age    Address    SomeOtherColumn   AnotherColumn 
Yo      122   YoYo        123          56     Main St   3847387           efhhsvhfv
Joe     145   Klose        444         34     Main St   45787              8u8u78
Yo      122   YoYo        456          56     5th Ave    ttytty4AA         4rt8r78t
Mary    862   Mary        478          22     Roe Ave    r876aa234         trfrtrt

我想用Name + ID + LastName的组合对这个文件的行进行排序,例如,所有"Yo"家伙的行现在将在一起,而不是分散在整个文件中,等等…

它有很多行,大约120,000行。我在寻找一些关于如何做到这一点的想法和算法?

按某些标准从每行对数据文件行进行排序

var query = File.ReadLines(filename)
            .Skip(1) //column names
            .Select(line => new { line = line, parts = line.Split(''t') })
            .OrderBy(x => x.parts[0]) //name
            .ThenBy(x => x.parts[2])  //lastname
            .ThenBy(x => x.parts[1])  //id
            .Select(x => x.line);
File.WriteAllLines(newfilename, query);

您可以使用LINQ,例如:

var lines = File.ReadLines("path")
    .Skip(1) // header
    .Select(Line => new { Line, Fields = Line.Split(''t') })
    .Where(x => x.Fields.Length == 8)
    .Select(x => new
    {
        x.Line,
        x.Fields,
        Name = x.Fields[0],
        ID = x.Fields[1],
        LastName = x.Fields[2],
        ZipCode = x.Fields[3],
        Age = x.Fields[4],
        Address = x.Fields[5],
        SomeOtherColumn = x.Fields[6],
        AnotherColumn = x.Fields[7]
    })
    .OrderBy(x => x.Name)
    .ThenBy(x => x.ID)
    .ThenBy(x => x.LastName)
    .Select(x => x.Line);

注意事项:

    你应该使用一个可用的CSV解析器来解析CSV -file
  • 你应该使用一个具有这些属性的真实类,而不是匿名类型
  • 然后使用List<ThisType>而不是字符串来进一步处理