3

我想不出一个好的 sed、正则表达式或 windows cmd,或两者兼而有之,将 csv 文件中的行重新格式化为可用的日期时间实现很糟糕:

鉴于:

Name,Equip1_SA-TEMP -- ASample,7/8/13   0:00,55.10

Name,Equip1_SA-TEMP -- ASample,7/8/13   0:10,55.50 

我需要“找到”日期时间部分,例如 (7/8/13 0:00) 并重新格式化为类似 SQL 的 DATETIME:

Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:00:00,55.10

Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:10:00,55.50

如您所见,这可能需要在月、日和小时前添加“0”,然后在秒前添加 :00。

获取日期时间区域类似于:

sed -E 's#^([^/]+)/([^/]+)/([0-9]+)

,但我无法首先“找到它”......需要先找到第二个','?

每行总是有 4 个字段:

Name,SomeEquipmentId,DateTime,Value.

是否有 sed + windows cmds 的良好组合来获得这个?还是我最好编写更高级别的代码来完成这一切?

使用 awk 更新:我尝试了一些命令,例如: awk -F 、 "{split($3,a,[:blank:]); vdate=a[1]; tdate=a[2]; print vdate}" 文件.csv

但它在 [ char 上给出了语法错误。逃避它是行不通的。我试过\""%%3s,但仍然返回整个字符串(例如7/18/13 00:10)。是否有更好的 awk 字符串命令可以使用,而不是尝试将它们分解成数组?

4

2 回答 2

2

一种方式GNU awk

awk '
BEGIN {
  FS=OFS=","
}
{
  split($3,ary,/[\/: ]/)
  $3=mktime(20 ary[3]" "ary[1]" "ary[2]" "ary[6]" "ary[7]" "00)
  $3=strftime("%F %T",$3)
}1' csvfile

测试:

$ cat csvfile 
Name,Equip1_SA-TEMP -- ASample,7/8/13   0:00,55.10
Name,Equip1_SA-TEMP -- ASample,7/8/13   0:10,55.50 

$ awk '
BEGIN {
  FS=OFS=","
}
{
  split($3,ary,/[\/: ]/)
  $3=mktime(20 ary[3]" "ary[1]" "ary[2]" "ary[6]" "ary[7]" "00)
  $3=strftime("%F %T",$3)
}1' csvfile
Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:00:00,55.10
Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:10:00,55.50 
于 2013-07-13T04:34:48.007 回答
1

您可能想看看 gawk 与 sed。gawk 是一个循环文本处理器,它使得处理记录中的字段变得相当容易。在您的示例中,时间戳似乎始终是四个字段中的第三个。所以 linux 系统上的 awk 脚本看起来像:

awk 'BEGIN {FS=","} {print $1 "," $2 "," MODIFIED_$3 "," $4}' < datafile

MODIFIED_$3使用 awk 的内置时间函数重新格式化的时间戳在哪里。

于 2013-07-12T20:38:21.927 回答