C#,在 2 之后拆分;在同一行
C#, Split after 2 ;'s in same line
我正在生成一个包含 from/to 坐标点以及这些点之间的 distance/time 的列表。
例如:最终产品的 header 看起来像这样
writer.WriteLine("fromX" + ";" + "fromY" + ";" + "toX" + ";" + "toY" + ";" + "distance" + ";" + "time");
点对点的计算过程如下:
A -> A
A -> B
A -> C
..
B -> A
B -> B
B -> C
等等
距离和时间 per-calculated 位于单独的文件中。但是,此文件中的每一行都由相同起点和每个端点之间的 distance/time 组成,例如:
0;0;11289;950;9732;899;9886;725;32893;2195;38010;2478;46188;3330;
目标是在最终产品中使用以下符号:
point A;point A;0;0
point A;point B;11289;950
point A;point C;9732;899
等等
如您所见,我需要在每个第二个值处拆分距离 + 时间线。
目前,我有以下代码:
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");
}
这可能必须用一个 foreach 循环来扩展,该循环从 distanceTime-list 中读取一行,将其拆分,取前 2 个值并将它们与起点和终点一起写入。
问题是我不知道如何在每个第二个值之后拆分。
你有什么建议吗?
https://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx
使用 % 运算符:
string coords = "0;0;11289;950;9732;899;9886;725;32893;2195;38010;2478;46188;3330;";
string[] values = coords.Split(';');
for(int val=0; val<values.Length; val++)
{
int coord;
if(val % 2 == 0)
{
//this will give you access to every second value
int.TryParse(values[val], out coord);
Console.WriteLine(coord.ToString());
}
}
你真的不需要每一秒都拆分';',你只需要一个稍微不同的for循环:
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++;
}
}
}
我正在生成一个包含 from/to 坐标点以及这些点之间的 distance/time 的列表。 例如:最终产品的 header 看起来像这样
writer.WriteLine("fromX" + ";" + "fromY" + ";" + "toX" + ";" + "toY" + ";" + "distance" + ";" + "time");
点对点的计算过程如下:
A -> A
A -> B
A -> C
..
B -> A
B -> B
B -> C
等等
距离和时间 per-calculated 位于单独的文件中。但是,此文件中的每一行都由相同起点和每个端点之间的 distance/time 组成,例如:
0;0;11289;950;9732;899;9886;725;32893;2195;38010;2478;46188;3330;
目标是在最终产品中使用以下符号:
point A;point A;0;0
point A;point B;11289;950
point A;point C;9732;899
等等
如您所见,我需要在每个第二个值处拆分距离 + 时间线。
目前,我有以下代码:
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");
}
这可能必须用一个 foreach 循环来扩展,该循环从 distanceTime-list 中读取一行,将其拆分,取前 2 个值并将它们与起点和终点一起写入。 问题是我不知道如何在每个第二个值之后拆分。 你有什么建议吗?
https://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx
使用 % 运算符:
string coords = "0;0;11289;950;9732;899;9886;725;32893;2195;38010;2478;46188;3330;";
string[] values = coords.Split(';');
for(int val=0; val<values.Length; val++)
{
int coord;
if(val % 2 == 0)
{
//this will give you access to every second value
int.TryParse(values[val], out coord);
Console.WriteLine(coord.ToString());
}
}
你真的不需要每一秒都拆分';',你只需要一个稍微不同的for循环:
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++;
}
}
}