如何逐行合并到CSV文件

时间:2019-03-14 14:13:16

标签: c#

我有两个CSV文件,第一个看起来像这样:

ID Time PositionX PositionY 
1  23
2  26
3  56

还有另一个看起来像这样的

ID Time PositionX PositionY
   25   2.5       5.5
   28   4.1       5.6
   35   4.8       6.2 
   66   5.5       7.5

我想要的结果是:

ID Time        PositionX PositionY
1  25(or 23)   2.5       5.5
2  28(or 26)   4.1       5.6
3  35(or 56)   4.8       6.2 

因此,基本上,我正在尝试合并两个具有不同数据量的文件。但是要组合它们,我需要一个密钥,问题在于密钥对于两个数据不能完全相同。

因此,我需要从一个数据集中逐行获取数据,查看时间,然后与另一个数据集一起查看是否有接近的值。如果是,则将它们合并。

这就是为什么我输入“ 25(或23)”的原因,因为时间以毫秒为单位,所以我需要确保第一个数据集的行与28而不是25匹配。

最终的Key可以是23(来自第一个数据集)或25(来自第二个数据集)。只要所选的行最接近该值,都没有关系。

1 个答案:

答案 0 :(得分:0)

所以我知道了怎么做:

首先我得到数据集1的时间:

String[] File1Rows = File.ReadAllLines(secondSensor.MyFile);
int number = Convert.ToInt32(File1Rows[1].Split(';')[0]);

然后创建一个由Dataset2组成的字符串列表:

String[] AccelerometerRows = File.ReadAllLines(fifthSensor.MyFile);
List<string> AccelerometterTimes = new List<string>(AccelerometerRows);

然后我仅将Dataset2中的时间带入字符串列表中

List<int> AccelerometterTimesList = new List<int>();

for (int i = 1; i < AccelerometterTimes.Count; i++)
{
  var x = AccelerometerRows[i].Split(';')[0];
  Console.WriteLine(x);
  AccelerometterTimesList.Add(Convert.ToInt32(x));
}

使用一点LinQ即可获得最复杂的O(n)值:

int closest = AccelerometterTimesList.Aggregate((x, y) => Math.Abs(x - number) < Math.Abs(y - number) ? x : y);

然后将其打印出来:

Console.WriteLine("number: "+number);
Console.WriteLine("closest "+closest);

找到此位置之后,现在我们使用closest来获取需要获取其位置的Dataset2行。然后,我们将位置放到Dataset1的number行中。