сравнивая время между двумя файлами, которые являются частью имени файла - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть 2 файла с разницей в их временных отметках

command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105228_command_step_output.csv.gz

command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105325_command_step_output.csv.gz

Единственное различие между ними состоит в том, что время до конца имени файла отличается 105228 (что означает 10:52: 28) против 105325 (что означает 10:53:25), и я хочу иметь возможность сравнить их и дать ему буфер на 1 минуту меньше или на 1 минуту больше в этом примере, используя эту логику, имя файла идентично, и я хочучтобы иметь возможность сравнивать их с помощью этого буфера, я попробовал несколько способов, но это не дало мне решения.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Если вы хотите иметь универсальный компаратор для имен файлов, отметьте это

public static void compareStringsByChar(String in1,String in2) {
    //assuming same strings
    if(in1.length() == in2.length()) {
        //collector of diffs
        StringBuilder sbDiff = new StringBuilder();
        //just for log bellow
        int firstDiffIndex = -1;
        //if diff is not in sequence, then will be used for putting comma in collected data
        int lastDiffIndex = -1;

        for (int i = 0; i < in1.length(); i++) {
            //diff found
            if(in2.charAt(i) != in1.charAt(i)) {
                //first diff found
                if(sbDiff.length() ==0 ) {
                    firstDiffIndex = i;
                }

                //checking if in sequence
                if(lastDiffIndex != -1 && lastDiffIndex != (i-1)) {
                    sbDiff.append(",");
                }
                //finally add char diff and change reference to the last occurence
                sbDiff.append(in2.charAt(i));
                lastDiffIndex = i;
            }
        }

        if(!sbDiff.toString().isEmpty()) {
            System.out.println("Found difference at pos." + firstDiffIndex);
            System.out.println("String1: " + in1.substring(firstDiffIndex));
            System.out.println("String2: " + in2.substring(firstDiffIndex));
            System.out.println("Diffs strings: " + sbDiff.toString());
        }
    }
}

Для ваших данных:

String st1 = "command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105228_command_step_output.csv.gz";
        String st2 = "command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105325_command_step_output.csv.gz";

Вывод:

Found difference at pos.80
String1: 228_command_step_output.csv.gz
String2: 325_command_step_output.csv.gz
Diffs strings: 3,5

#in case of diff sequence:
Found difference at pos.80
String1: 228_command_step_output.csv.gz
String2: 345_command_step_output.csv.gz
Diffs strings: 345
0 голосов
/ 13 февраля 2019

java.time

Чтобы вычислить разницу между временами в двух путях:

    String onePath     = "command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105228_command_step_output.csv.gz";
    String anotherPath = "command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105325_command_step_output.csv.gz";

    LocalDateTime oneTime = extractDateTime(onePath);
    LocalDateTime anboherTime = extractDateTime(anotherPath);

    Duration diff = Duration.between(oneTime, anboherTime);
    diff = diff.abs();

Вызов abs в последней строке преобразует любую отрицательную разницу в положительнуюодин, убедившись, что буфер меньше на 1 минуту и ​​на 1 минуту больше.extractDateTime внизу этого ответа.Чтобы узнать, составляет ли разница менее минуты, есть разные способы, и я хотел бы показать вам несколько вариантов.Сначала просто:

    if (diff.toMinutes() < 1) {
        System.out.println("Within the window: " + diff);
    }

Внутри окна: PT57S

Я напечатал разницу в сообщении, и это выглядит немного забавно.Формат - ISO 8601. Читайте как «период времени в 57 секунд».

Недостатком вышесказанного является то, что он работает только в течение целого числа минут.Что если однажды вы захотите изменить буфер, скажем, на 45 секунд или 1 минуту 30 секунд?Следующее является более общим:

    Duration buffer = Duration.ofMinutes(1);
    if (diff.compareTo(buffer) < 0) {
        System.out.println("Within the window: " + diff);
    }

Мне бы хотелось, чтобы Duration имел метод isShorterThan, но это не так.Если вам трудно прочитать код, используя compareTo, вы не одиноки.Альтернатива - вычесть и посмотреть, если результат отрицательный:

    if (diff.minus(buffer).isNegative()) {
        System.out.println("Within the window: " + diff);
    }

Я обещал вам код вспомогательного метода:

private static LocalDateTime extractDateTime(String path) {
    String dateTimeString = path.replaceFirst("^.*/[0-9a-f-]+_(\\d+_\\d+)_command_step_output\\.csv\\.gz$", "$1");
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd_HHmmss"); 
    return LocalDateTime.parse(dateTimeString, formatter);
}

Я использую replaceFirst и обычныйвыражение для извлечения части 20190213_105228.Затем выполните синтаксический анализ объекта в LocalDateTime.

Ссылки

0 голосов
/ 13 февраля 2019

Сначала извлеките даты:

private Date extractDate(String filename) {
  // Updated to extract the date not from filename, but file and path name
  int startDate = filename.indexof('_', filename.lastIndexof('/'));
  int endDate = startDate + 15;
  String dateStr = filename.substring(start, end);

  // Use a date format for the part of string representing the dates
  SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmss");
  return format.parse(dateStr);
}

Затем напишите функцию, чтобы проверить, находятся ли извлеченные даты на расстоянии менее 1 минуты.

public boolean samePeriod(String filename1, String filename2) {
  Date date1 = extractDate(filename1);
  Date date2 = extractDate(filename2);
  long msDistance = Math.abs(date1.getTime() - date2.getTime());

  // 1 minute is 1000 * 60 milliseconds
  return msDistance <= 1000 * 60;
}

Обратите внимание, что вы должныобогатите этот ответ проверками на нулевые значения и обработкой исключений.Это просто основа для разработки вашего кода.

...