Search code examples
c#visual-studio-2010csvstreamreaderstreamwriter

C#, Split after 2 ;'s in same line


I'm generating a list of from/to coordinate points, together with the distance/time between those points. For illustration: the header of the end product looks like this

writer.WriteLine("fromX" + ";" + "fromY" + ";" + "toX" + ";" + "toY" + ";" + "distance" + ";" + "time");

The process of calculating from point to point is as follows:

A -> A
A -> B
A -> C
..
B -> A
B -> B
B -> C

etc

The distance and time are per-calculated and are situated in a separate file. However, each line in this file consists of the distance/time between the same start point and every endpoint, thus for example:

0;0;11289;950;9732;899;9886;725;32893;2195;38010;2478;46188;3330;

The goal is to have the following notation in the end product:

point A;point A;0;0
point A;point B;11289;950
point A;point C;9732;899

etc.

As you can see, I would need to split the distance + time line at every 2nd value.

At the moment, I have the following code:

    List<string> locationsList = new List<string>();
    using (var reader = new StreamReader(File.OpenRead("locations.csv")))
    {
        while (reader.Peek() != -1)
            locationsList.Add(reader.ReadLine());
    }

    List<string> distanceTime = new List<string>();
    using (var reader = new StreamReader(File.OpenRead("distance.csv")))
    {
        while (reader.Peek() != -1)
            distanceTime.Add(reader.ReadLine());
    }


    using (var writer = new System.IO.StreamWriter("Output.csv"))
    {
        writer.WriteLine("fromX" + ";" + "fromY" + ";" + "toX" + ";" + "toY" + "distance" + ";" + "time")

        foreach (var fromLine in locationsList)
        {
            splitFrom = fromLine.Split(';');

            fromX = splitFrom[0].Trim();
            fromY = splitFrom[1].Trim();

            foreach (var toLine in locationsList)
            {
                splitTo = toLine.Split(';');

                toX = splitTo[0].Trim();
                toY = splitTo[1].Trim();

                writer.WriteLine(fromX + ";" + fromY + ";" + toX + ";" + toY);
            }

        }

        MessageBox.Show("Done");
    }

This would have to be expanded with probably a foreach loop that reads a line from the distanceTime-list, splits it, takes every first 2 values and writes them together with the start -and end point. Problem is that I have no idea how to split after every 2nd value. Do you have any suggestions?


Solution

  • You don't really need to split on every second ';', you just need a slightly different for loop:

    using System;
    
    class Program {
        static void Main(string[] args) {
            string line = "0;0;11289;950;9732;899;9886;725;32893;2195;38010;2478;46188;3330;";
            string[] values = line.Split(';');
            char pointName = 'A';
            for (int i = 0; i < values.Length - 1; i += 2) {
                string endProductLine = string.Format("point A;point {0};{1};{2}", pointName, values[i], values[i + 1]);
                Console.WriteLine(endProductLine);
                pointName++;
            }
        }
    }