将相同的行堆叠到数据包中,并写入新文件

Stacking the same lines into packet, and writing to new file

我想知道如何堆叠标题为数据包的相同行并写入下一个文件。例如,我有以下问题:

我逐行读取CSV文件,我想将具有相同标题的行堆叠到一个数据包中。

文件 1:

Test;param1
Test;param2
Test1;param1
Test1;param2
Test1;param3
Test2;param1

结果文件:

Test;[param1,param2]
Test1;[param1,param2,param3]
Test2;[param1]

它不必完全相同,但它是关于如何做类似事情的提示。

我的代码:

     var enumLines = System.IO.File.ReadLines(pathZamowienia, Encoding.UTF8);
    int factor = 0;


    foreach (var line in enumLines)
    {
        var tabLine = line.Split(';').ToList();

        if (factor == 0)
        {
            Console.WriteLine();
        }
        else
        {
            try
            {
                Title = tabLine[0];
            }
            catch (FormatException ex)
            {
                Console.WriteLine("Failure");
            }
            try
            {
                Param = tabLine[1];
            }
            catch (FormatException ex)
            {
                Console.WriteLine("Failure");
            }
            factor++;
        }   

您可以使用 LINQ 查询对行进行分组

// Test input
var enumLines = new List<string> {
    "Test;param1",
    "Test;param2",
    "Test1;param1",
    "Test1;param2",
    "Test1;param3",
    "Test2;param1"
};

// Re-group the parameters
var newLines = enumLines
    .Select(s => s.Split(';'))
    .GroupBy(a => a[0], a => a[1])
    .Select(g => g.Key + ";[" + String.Join(",", g) + "]");

// Test output:
foreach (string line in newLines) {
    Console.WriteLine(line);
}

输出:

Test;[param1,param2]
Test1;[param1,param2,param3]
Test2;[param1]

请注意,组 g 本身是聚合值的枚举,并且还有一个 属性 KeyGroupBy的第一个参数选择Key,第二个可选参数选择要聚合的值。如果省略,则聚合输入(字符串数组a)。

如果输入包含变形的线条,您还可以使用附加的 Where 子句排除它们:

var newLines = enumLines
    .Select(s => s.Split(';'))
    .Where(a => a.Length >= 2)
    .GroupBy(a => a[0], a => a[1])
    .Select(g => g.Key + ";[" + String.Join(",", g) + "]");

这就是你能做的。先解析你的文件再转换

var data - new Dictionary<string, List<string>>();
string[] lines = File.ReadAllLines(fileName);

foreach(string line in Lines)
{
    string parts = line.Split(';');
    if (!data.ContainsKey(parts[0]))
        data.Add(parts[0], new List<string>());

    data[parts[0]].Add(parts[1]);
}

// then you open stream and write this

foreach(var kvp in data)
{
    string line = $"{kvp.Key};[{string.Join(',', kvp.Value)}]"
    //  write line here 

}

// close stream