java - 如何使用不同长度为 CSV 中的值分配索引。 ( java )

标签 java arrays csv arraylist

我正在尝试将两个不同 CSV 文件中的值与相似索引对齐。一个 CSV 每秒有一个 Unix 时间戳,另一个每分钟有一个 UNIX 时间戳。此外,我需要标记不同长度的数据的索引。

例如,我需要用索引 0 标记分钟 1 - 20(以及秒 1 - 1200),然后用索引 1 标记分钟 21 - 25 (1260 - 1500),用索引 1 标记分钟 26 - 42 (1560 - 2520) ) 索引为 2,等等

长度将根据我使用的数据(可能是保存不同长度值的数组)而变化,因此我想以编程方式执行此操作。我不知道如何解决这个问题。任何帮助将不胜感激。

编辑(希望这有助于澄清一些)

我的一个 CSV 中包含有关音频的信息,另一个 CSV 中包含有关生物识别数据的信息。它们都有一个带有 Unix 时间戳的列。音频 CSV 中的数据是每秒的数据,生物识别数据是每分钟的数据。

我想向具有相同索引(或键)值的 CSV 添加一行,以便数据在两个文件之间具有公共(public)链接。如果我调用索引 1,我想从索引为 1 的两个文件中获取数据。

音频文件的长度将决定按键的开始和停止位置。因此,如果我有一个 2 分钟长的音频文件,则生物识别 CSV 中的 2 行的 key 将为 0,而音频 CSV 的 120 行的 key 将为 0。

如果该音频文件长 3 分钟,则生物识别 CSV 的前 3 行的 key 将为 0,音频 CSV 的前 180 行的 key 将为 0。

最佳答案

您可以打开这两个文件,读取第一行以查看时间戳是什么,然后从具有较早时间戳的文件中读取行,直到它不再具有较早时间戳或结束。

如果这是by-month.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

现在我知道这并不完全是您正在寻找的东西 - 但我希望这足以让您开始!

关于java - 如何使用不同长度为 CSV 中的值分配索引。 ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340439/

相关文章:

javascript - 为什么日期没有正确生成?

c# - .NET 中的 TextFieldParser 等效项?

csv - 如何在 perl 中删除不可打印的字符 ^@

java - 在 iOS-Objective C 上签名的数据在 Java 中验证时始终返回 false

Java:使用 Hibernate 合并实例与 Oracle CLOB 数据

java - 如何使用 JSOUP/Rest Assured Api 关闭 SSL 证书并获得登录响应?

java - Spring Boot 2.1 中的 URI 模式匹配

Java 逐元素求和 2 个数组

c++ - 大数组大小的段错误

r - 如何读取以下格式的文件