我正在尝试将两个不同CSV文件中的值对齐到类似的索引。一个CSV每秒钟都有一个unix时间戳,另一个每分钟都有一个unix时间戳。另外,我需要在不同长度的数据上标记索引。
因此,例如,我需要将指数分为1 - 20(和秒1 - 1200),指数为0,然后是指数21 - 25(1260 - 1500),指数为1,分钟为26 - 42(1560 - 2520) )索引2等等。
长度将根据我正在使用的数据(可能是包含长度的不同值的数组)而变化,因此我想以编程方式执行此操作。我不确定如何解决这个问题。任何帮助将不胜感激。
编辑(希望这有助于澄清一些)
我在一个CSV中有数据,其中包含有关音频的信息,另一个包含有关生物指标数据的信息。它们都有一个具有unix时间戳的列。音频CSV中的数据是每秒钟一次,生物指标数据是每分钟一次。
我想在CSV上添加一个具有相同索引(或键)值的行,以便数据在这两个文件之间有一个公共链接。如果我调用索引1,我想从两个索引为1的文件中获取数据。
音频文件的长度将决定键的开始和停止位置。因此,如果我有一个2分钟长的音频文件,生物指标CSV中的2行将具有0的键,而音频CSV的120行将具有0的键。
如果该音频文件长达3分钟,则生物度量CSV的前3行将具有0的键,而音频CSV的前180行将具有0的键。
答案 0 :(得分:0)
您可以打开这两个文件,读取第一行以查看时间戳是什么,然后从具有较早时间戳的文件中读取行,直到它不再具有较早的时间戳或结束。
如果是by-minute.csv
:
1394589660,minute 1
1394589720,minute 2
这是by-second.csv
:
1394589659,second -1
1394589660,second 0
1394589661,second 1
1394589662,second 2
1394589663,second 3
1394589664,second 4
…
1394589718,second 58
1394589719,second 59
1394589720,second 60
1394589721,second 61
那么这个Java代码:
import java.io.*;
import java.text.*;
import java.util.*;
public class Foo {
public static void main(String[] args)
throws Exception
{
BufferedReader byMinute = new BufferedReader(
new InputStreamReader(
new FileInputStream("by-minute.csv")));
BufferedReader bySecond = new BufferedReader(
new InputStreamReader(
new FileInputStream("by-second.csv")));
String byMinuteLine = byMinute.readLine();
String bySecondLine = bySecond.readLine();
while (byMinuteLine != null || bySecondLine != null) {
/* If either file is done, print lines from the other file */
if (byMinuteLine == null) {
System.out.println(indicize(bySecondLine));
bySecondLine = bySecond.readLine();
} else if (bySecondLine == null) {
System.out.println(indicize(byMinuteLine));
byMinuteLine = byMinute.readLine();
} else {
/* Otherwise print the earlier entry */
long minuteTime = getTimeStamp(byMinuteLine);
long secondTime = getTimeStamp(bySecondLine);
if (secondTime < minuteTime) {
System.out.println(indicize(bySecondLine));
bySecondLine = bySecond.readLine();
} else {
System.out.println(indicize(byMinuteLine));
byMinuteLine = byMinute.readLine();
}
}
}
}
static long getTimeStamp(String line) {
return Long.valueOf(line.split(",")[0]);
}
static String indicize(String line) {
return ((getTimeStamp(line) - 1394589660) / 20)
+ line.substring(line.indexOf(","));
}
}
将打印出来:
0,second -1
0,minute 1
0,second 0
0,second 1
0,second 2
0,second 3
0,second 4
0,second 5
0,second 6
0,second 7
0,second 8
0,second 9
…
2,second 55
2,second 56
2,second 57
2,second 58
2,second 59
3,minute 2
3,second 60
3,second 61
现在我知道这并不是你想要的 - 但我希望这足以让你开始!