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

Time:11-09

I would like to know how to stack the same lines titled to packet and write to next file. For example, I had the following problem:

I read CSV file line by line, and I want to stack lines with the same titles to one packet.

file1:

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

result file:

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

It does not have to be identical, but it is a hint on how to do something like that.

My code:

     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  ;
        }   

CodePudding user response:

You can use a LINQ query to group the lines

// 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);
}

Output:

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

Note that the group g itself is an enumeration of the aggregated values and also has a property Key. The first argument of GroupBy selects the Key, the second optional parameter selects the value to be aggregated. If it is omitted, the input (the string array a) is aggregated.

If the input includes misshaped lines, you could also exclude them with an additional Where-clause:

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)   "]");

CodePudding user response:

This is what you can do. Parse your file first and then transform

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
  • Related