C#-LinQ-读取文本文件,按第一列分组,按最后一列排序



hi有一个包含3列的文本文件,类似于:

contract1;pdf1;63
contract1;pdf2;5
contract1;pdf3;2
contract1;pdf4;00
contract2;pdf1;2
contract2;pdf2;30
contract2;pdf3;5
contract2;pdf4;80

现在,我想将这些信息写入另一个文本文件中,输出将是按顺序排列的,第一个是"中最后一列的记录;2,5〃;,像这样的东西:

contract1;pdf3;2
contract1;pdf2;5
contract1;pdf1;63
contract1;pdf4;00
contract2;pdf1;2
contract2;pdf3;5
contract2;pdf2;30
contract2;pdf4;80

我该怎么办?感谢

您可以在阅读后使用LINQ对行进行分组和排序,然后将它们放回一起:

var output = File.ReadAllLines(@"path-to-file")
.Select(s => s.Split(';'))
.GroupBy(s => s[0])
.SelectMany(sg => sg.OrderBy(s => s[2] == "2" ? "-" : s[2] == "5" ? "+" : s[2]).Select(sg => String.Join(";", sg)));

然后把它们写进一个文件。

我不会为您编写程序,但我建议使用此库来读取和写入分隔文件:https://joshclose.github.io/CsvHelper/getting-started/

当你新建阅读器时,请确保指定你的分号分隔符:

using (var reader = new StreamReader("path\to\input_file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Configuration.Delimiter = ";";
var records = csv.GetRecords<Row>();
// manipulate the data as needed here
}

您的";行";类(为了清楚起见,请选择一个更合适的名称(将指定平面文件的模式。听起来你好像没有标题?如果没有,则可以指定每个项目的顺序。

public class Row
{
[Index(1)]
public string MyValue1 { get; set; }
[Index(2)]
public string MyValue2 { get; set; }
}

在中读取数据后,您可以根据需要对其进行操作。如果输出格式与输入格式不同,则应将输入类转换为输出类。如果愿意,可以使用自动映射程序库。然而,对于一个简单的项目,我建议只手动将输入类转换为输出类。

最后,写回数据:

using (var writer = new StreamWriter("path\to\output_file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{    
csv.WriteRecords(records);
}

最新更新