Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-LinQ-读取文本文件,按第一列分组,按最后一列排序?_C#_Linq - Fatal编程技术网

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

C# C-LinQ-读取文本文件,按第一列分组,按最后一列排序?,c#,linq,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 contract1;pdf3;2 contract1;pdf2;5 contract1;pdf1;63 contract1;pdf4;00 contract2;pdf1;2 c

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
contract1;pdf3;2
contract1;pdf2;5
contract1;pdf1;63
contract1;pdf4;00
contract2;pdf1;2
contract2;pdf3;5
contract2;pdf2;30
contract2;pdf4;80
现在,我想将这些信息写入另一个文本文件,输出将按顺序放在第一个记录中,最后一列在2,5中,如下所示:

contract1;pdf1;63
contract1;pdf2;5
contract1;pdf3;2
contract1;pdf4;00
contract2;pdf1;2
contract2;pdf2;30
contract2;pdf3;5
contract2;pdf4;80
contract1;pdf3;2
contract1;pdf2;5
contract1;pdf1;63
contract1;pdf4;00
contract2;pdf1;2
contract2;pdf3;5
contract2;pdf2;30
contract2;pdf4;80
我该怎么办?
谢谢

我不打算为您编写程序,但我建议您使用此库来读取和写入分隔文件:

新建读卡器时,请确保指定分号分隔符:

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
}
在中读取数据后,可以根据需要对其进行操作。如果输出格式与输入格式不同,则应将输入类转换为输出类。如果愿意,您可以使用Automapper库。但是,对于一个简单的项目,我建议只手动将输入类转换为输出类

最后,将数据写回:

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

阅读后,您可以使用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)));

然后将它们写入一个文件。

我会从阅读开始。然后呢,啊。您的数据不同。在第一个示例中,您有一行contract1;pdf1;第63条和第1条;pdf3;2在第二次你有合同1;pdf1;2和合同1;pdf3;63因此pdf1和pdf3切换了它们的值。为什么?这样的方法应该让您开始:File.ReadAllLinesPath to File.Selectline=>line.Split;;-这将返回数组数组,其中每个元素表示CSV文件中的单个单元格。请从现在开始重新写句子,我想写得更清楚。这非常适合我!!谢谢,你是一个顶级程序员!非常感谢