我有两个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(来自第二个数据集)。只要所选的行最接近该值,都没有关系。
答案 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
行中。