我的csv文件包含ISO格式的日期,如下所示。
id,x1,x2,x3
AIR,Partner,2015-10-20T04:00:00.000Z,2015-10-20T04:00:00.000Z,2016-02-12T05:00:00.000Z
CMX,Partner,Tier,2017-03-23T04:00:00.000Z
WKA,Partner,Tier,2017-05-22T04:00:00.000Z
APP,Partner,2017-10-04T04:00:00.000Z,Tier
BUN,2017-09-27T04:00:00.000Z,Partner,,2017-09-27T04:00:00.000Z
除了第1列之外,没有任何固定列可以显示在任何列中。
我想将所有出现的ISO日期转换为DD-MON-YYYY或DD / MM / YYYY格式。
请帮忙。
答案 0 :(得分:2)
您可以通过UNIX管道使用以下内容:
sed -E 's#\b([0-9]{4})-([0-9]{2})-([0-9]{2})T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z\b#\3/\2/\1#g'
另一个选项是以下PCRE,它在开始时明确强制执行,
分隔符(因为你提到这个字段不能是第一个),并且,
或EOL结束时匹配的表达式:
cat | perl -pe 's#,\K([0-9]{4})-([0-9]{2})-([0-9]{2})T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z(?=,|$)#$3/$2/$1#g'
答案 1 :(得分:0)
您可以将之前的答案与How to Print Spelled out month names rather than numbers结合使用,以获得以下两个选项,具体取决于您最喜欢的两个答案中的哪一个:
第一个选项是不使用任何库,只是使用直接嵌入月份名称:
cat 48941818.txt | perl -pe '@m = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); s#,\K([0-9]{4})-([01][0-9])-([0-3][0-9])T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z(?=,|$)#$3-$m[$2]-$1#g'
第二个选项是在http://perldoc.perl.org/POSIX.html#strftime中使用C,并根据Embedding evaluations in Perl regex将替换部分视为使用e
修饰符的perl代码,并且,最终,如http://perldoc.perl.org/perlrequick.html#Search-and-replace所述,这使得它更加灵活,因为您可以对日期格式进行进一步改进(尽管在我的系统上%v
没有工作,{{1}在一位数的日子里有额外的空间。)
%e