【问题标题】:;Java - Sort a CSV file by date and time;Java - 按日期和时间对 CSV 文件进行排序
【发布时间】:2018-04-14 15:57:59
【问题描述】:

我在尝试对 CSV 文件进行排序时遇到问题。 我需要从一个时间段中获得 10 个最大频率。 比如,从 10:43:12 开始的每次扫描,并将它们写在一行中。

要写它们我没有问题,我的问题是当我尝试分开时间段并单独计算每个时间时。

    public static void writeFile(String csvFile, String newCsv) {

    //Delimiter used in CSV file
    String COMMA_DELIMITER = ",";
    String NEW_LINE_SEPARATOR = "\n";
    //CSV file header
    String FILE_HEADER = "Time, ID, Lat, Lon, Alt, SSID1, MAC1, Frequncy1, Signal1,"
            + " SSID2, MAC2, Frequncy2, Signal2,"
            + " SSID3, MAC3, Frequncy3, Signal3,"
            + " SSID4, MAC4, Frequncy4, Signal4,"
            + " SSID5, MAC5, Frequncy5, Signal5,"
            + " SSID6, MAC6, Frequncy6, Signal6,"
            + " SSID7, MAC7, Frequncy7, Signal7,"
            + " SSID8, MAC8, Frequncy8, Signal8,"
            + " SSID9, MAC9, Frequncy9, Signal9,"
            + " SSID10, MAC10, Frequncy10, Signal10";
    FileWriter fileWriter = null;
    String line = "";
    String cvsSplitBy = ",";
    int t=0;

    try {
        fileWriter = new FileWriter(newCsv);
        //Write the CSV file header
        fileWriter.append(FILE_HEADER.toString());
        //Add a new line separator after the header
        fileWriter.append(NEW_LINE_SEPARATOR);
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            String mod=returnMod(csvFile);
            br.readLine(); // this will read the first line
            br.readLine();// this will read the second line
            while ((line = br.readLine()) != null) {

                // use comma as separator(There is 11 column)
                String[] column = line.split(cvsSplitBy);

                fileWriter.append(column[3]);//time
                String s=column[3];
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(mod);//model
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(column[6]);//lat
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(column[7]);//lon
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(column[8]);//alt
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(column[1]);//wifi
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(column[0]);//MAC
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(column[4]);//frq
                fileWriter.append(COMMA_DELIMITER);
                fileWriter.append(column[5]);//signal
                fileWriter.append(NEW_LINE_SEPARATOR);



            }
        } 

        System.out.println("CSV file was created successfully !!!");

    } catch (Exception e) {

        System.out.println("Error in CsvFileWriter !!!");

        e.printStackTrace();

    } finally {
        try {
            fileWriter.flush();
            fileWriter.close();
        } catch (IOException e) {
            System.out.println("Error while flushing/closing fileWriter !!!");
            e.printStackTrace();
        }
    }
}

这段代码只是将所有数据写入一个新文件,我试图改变它以适应我的需要,但我做不到

【问题讨论】:

  • 为什么是标签url-rewriting
  • 我的错.. 错过点击
  • 输入文件是否按时间排序?
  • @AxelH 这就是我所做的,我将所有文件合并到一个文件中。现在我有一个文件,但不知道如何仅在每一行中计算日期时间
  • @AxelH 我对这个有点陌生,你有什么推荐的 API 吗?

标签: java file csv sorting


【解决方案1】:

我会声明一个类来保存信息:

public static class Info {
    public final String time;
    public final int frq;
    public final String mod;
    public final String lat;
    public final String lon;
    public final String alt;
    public final String wifi;
    public final String mac;
    public final String signal;

    public Info(String[] column, String mod) {
        time = column[3];
        this.mod = mod;
        lat = column[6];
        lon = column[7];
        alt = column[8];
        wifi = column[1];
        mac = column[0];
        frq = Integer.parseInt(column[4]);
        signal = column[5];
    }
}

还有一个 Info 数组,用于存储 10 个具有最大频率的信息。循环变为:

    Info[] max = new Info[10];
    int count = 0;
    while ((line = br.readLine()) != null) {

        // use comma as separator(There is 11 column)
        String[] column = line.split(cvsSplitBy);
        Info info = new Info(column, mod);
        if (count > 0 && !max[0].time.equals(info.time)) {
            printPeriod(max, count, fileWriter);
            count = 0;
        }
        int i = 0;
        while (i < count && max[i].frq > info.frq) {
            ++i;
        }
        while (i < count) {
            Info pred = max[i];
            max[i] = info;
            info = pred;
            ++i;
        }
        if (count < max.length) {
            max[count++] = info;
        }
    }
    if (count > 0) {
        printPeriod(max, count, fileWriter);
    }

这里是 printPeriod 方法:

private static void printPeriod(Info[] max, int count, Writer fileWriter) {
    fileWriter.append(max[0].time);
    fileWriter.append(COMMA_DELIMITER);
    fileWriter.append(max[0].mod);
    fileWriter.append(COMMA_DELIMITER);
    fileWriter.append(max[0].lat);
    fileWriter.append(COMMA_DELIMITER);
    fileWriter.append(max[0].lon);
    fileWriter.append(COMMA_DELIMITER);
    fileWriter.append(max[0].alt);
    for (int i = 0; i < count; ++i) {
        fileWriter.append(COMMA_DELIMITER);
        fileWriter.append(max[i].wifi);
        fileWriter.append(COMMA_DELIMITER);
        fileWriter.append(max[i].mac);
        fileWriter.append(COMMA_DELIMITER);
        fileWriter.append(Integer.toString(max[i].frq));
        fileWriter.append(COMMA_DELIMITER);
        fileWriter.append(max[i].signal);
    }
    fileWriter.append(NEW_LINE_SEPARATOR);
}

【讨论】:

  • @YAK 请注意,对于 lat、lon、alt,我使用了第一个信息,即频率最高的信息
  • 是的想法 :) 但是如果我现在想按信号对它们进行排序(并且它是负值)我需要在这里更改什么?
  • 如果我们有 -90 和 -20,则 -90 更强
  • ohhh nvm 我找到了!
猜你喜欢
  • 2021-09-07
  • 2014-07-06
  • 1970-01-01
  • 2022-01-14
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多