更改 CSV 文件中的日期格式

更改 CSV 文件中的日期格式

我有一个以以下格式输出数据的程序

date, time,field1,field2,field3,fieldn
12/20/14,08:01:53,318.622,0.93712,21.6867,1.1089

该文件有很多列,所有这些列都需要保持不变

日期格式是美国,但我需要非美国即

date, time,field1,field2,field3,fieldn,....
20/12/14,08:01:53,318.622,0.93712,21.6867,1.1089,....

实现这一目标的最简单方法是什么?我查了一下,有一些例子,但不完全是我的情况。还研究了 date 命令、awk 和 sed,但我不知道足以创建命令。例如这个答案使用 awk 看起来不错,但对我的文件没有任何作用。

我使用的是 Mac,因此需要适用于 OSX 提供的版本的命令。

答案1

sed -E 's,^([0-9]+)/([0-9]+),\2/\1,'

解释

  • sed -E:将 sed 与扩展正则表达式一起使用,这样我们就不必转义()等。
  • s/foo/bar/sed:这是搜索foo并将其替换为 的通用语法bar。在这里,我使用,代替,因为表达式中/有s,这将简化它(再次避免令人困惑的转义。因此, ./s,foo,bar,
  • ^([0-9]+)/([0-9]+):搜索行的开头^,后跟一个或多个数字[0-9]+,并将其放入捕获组中()。这是这个月。接下来是/另一个捕获组中的一个或多个数字(即日期)。
  • \2/\1:将其替换为第二个捕获组(天),后跟/,然后是第一个捕获组(月)。

用法

您可以将文件通过管道传输到此命令中,即 ie <your_command_here>| sed…,也可以直接在您的文件上运行它,即sed… file.txt。这将直接输出到命令行。要写入新文件,请附加> output.txt到命令中。

答案2

我建议您在重新格式化日期时使用标准 (ISO) 格式:YYYY-mm-dd

perl -MTime::Piece -F, -lane '
  if ($.>1) {$F[0] = Time::Piece->strptime($F[0], "%m/%d/%y")->strftime("%F")}
  print join ",", @F
'

另外,当您考虑非本地日期时间时,该时间戳属于哪个时区?是世界标准时间吗?

相关内容