如何解决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; }
}
读入数据后,您可以根据需要进行操作。如果输出格式与输入格式不同,则应将输入类转换为输出类。您可以根据需要使用Automapper库。但是,对于一个简单的项目,我建议手动将输入类转换为输出类。
最后,将数据写回:
using (var writer = new StreamWriter("path\\to\\output_file.csv"))
using (var csv = new CsvWriter(writer,CultureInfo.InvariantCulture))
{
csv.WriteRecords(records);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。