我有一个文件列表:
使用Groovy(或Java),我需要从文件名列表中提取日期并将其重新格式化,以使年份处于领先地位。像这样...
是否有一种光滑的Groovy方法来实现这一目标?
答案 0 :(得分:3)
我看不到需要使用日期解析/格式化
仅使用正则表达式交换两个部分
def oldName = "xxx_05102019023601017.csv"
def newName = oldName.replaceAll(/^(\D+)(\d{4})(\d{4})/,'$1$3$2')
退出:
xxx_20190510023601017.csv
regexp解释:
https://regex101.com/r/X0u9wv/1
String.replaceAll(正则表达式,替换)
replacement-每个匹配项替换的字符串
$1
$2
和$3
对应于regexp中的每个(...)
,所以我只交换替换的2nd和3d组
答案 1 :(得分:1)
使用正则表达式的Answer by daggett很漂亮。如果好奇的话,这里是处理日期时间的方法。
xxx_05102019023601017.csv
我假设这些数字代表月,日,年,时,分,秒,毫秒。
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格式的“基本”变体。我建议在可行的情况下使用这些标准格式。为了符合规定,请在年月日部分和时分秒部分之间插入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()
;