Как переформатировать имя даты в списке файлов - PullRequest
0 голосов
/ 21 мая 2019

У меня есть список файлов:

  • xxx_05102019023601017.csv
  • xxx_05092019023601036.csv
  • xxx_05082019023600900.csv

Используя Groovy (или Java), мне нужно извлечь дату из списка имен файлов и переформатировать их, чтобы год был ведущим. Вот так ...

  • xxx_20190510023601017.csv
  • xxx_20190509023601036.csv
  • xxx_20190508023600900.csv

Есть ли отличный способ добиться этого?

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Я не вижу необходимости использовать разбор / форматирование даты

используйте только регулярное выражение для замены двух частей

def oldName = "xxx_05102019023601017.csv"
def newName = oldName.replaceAll(/^(\D+)(\d{4})(\d{4})/,'$1$3$2')

из

xxx_20190510023601017.csv

regexp объясните:

enter image description here

https://regex101.com/r/X0u9wv/1

String.replaceAll (регулярное выражение, замена)

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java.lang.String-

замена - строка, которая будет заменяться для каждого совпадения

$1 $2 и $3 соответствуют каждому (...) в регулярном выражении, поэтому я просто заменяю 2-ю и 3-ю группы вместо

1 голос
/ 22 мая 2019

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

java.time

xxx_05102019023601017.csv

Я предполагаю, что цифры представляют день месяца, месяц, год, час, минуту, секунду, миллисекунду.

Input

Разбейте строку на подчеркивании, позвонив по номеру String::split.

String input = "foobar_05102019023601017.csv" ;
String[] parts = string.split( "_" ) ;
String part1 = parts[0]; // foobar
String part2 = parts[1]; // 05102019023601017.csv

Определите форматер для соответствия второй части.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMuuuuHHmmssSSS'.csv'" ) ;

Анализировать как LocalDateTime объект, поскольку в вашем входе отсутствует индикатор часового пояса или смещения от UTC.

LocalDateTime ldt = LocalDateTime.parse( part2 , f ) ;

выход

Определите форматер для вывода.

DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern( "uuuuMMddHHmmssSSS" ) ;

Генерировать вывод.

String datetimeOutput = ldt.format( formatterOutput ) ;
String prefix = part1 + "_" ;
String suffix = ".csv" ;
String output = prefix + datetimeOutput + suffix ;

Или, более кратко, используйте StringBuilder для однострочного.

String output = new StringBuilder()
    .append( part1 ) 
    .append( "_" ) 
    .append( ldt.format( formatterOutput ) )
    .append( ".csv") 
    .toString() 
;

ISO 8601

Ваш формат близок к «базовому» варианту стандартного ISO 8601 формата. Я предлагаю использовать эти стандартные форматы везде, где это возможно. Для соответствия вставьте T между частью года-месяца-дня и частью часа-минуты-секунды.

Для этого измените шаблон DateTimeFormatter. Вставьте букву внутри пары одинарных кавычек: 'T'.

DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmmssSSS" ) ;

Зона / Смещение

Дата и время без назначенного часового пояса или смещения от UTC неоднозначны и поэтому могут быть неверно истолкованы. Я предлагаю всегда включать зону или смещение, чтобы общаться четко.

Если эти дата и время должны были представлять момент в UTC (в общем, хорошая идея), добавьте просто Z. Эта буква означает UTC или смещение нуля часов-минут-секунд. Буква произносится как «зулу».

String output = new StringBuilder()
    .append( part1 ) 
    .append( "_" ) 
    .append( ldt.format( formatterOutput ) )
    .append( "Z" ) 
    .append( ".csv") 
    .toString() 
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...