Qgis 中的时间管理器要求日期采用 YYYY-MM-DD 格式。我有一个大型文本文件,其中的日期采用 DD/MM/YYYYY 格式。它太大了,无法手动更改格式。有没有办法自动执行此过程?我尝试在 Libre Office 中更改格式,但它仍然保持原始格式。所需的日期格式为 2020-01-16。人名字段已删除。
Record ID English Name Grid Reference Latitude Longitude Site Name Abundance Record Type Date Comments Time of sighting Squirrel ID Weight (g) CRST Comments
7765235 Red Squirrel SJ0369952368 53.059853 -3.4384031 Clocaenog: Bron Branog: Location 10 1 Adult 01/10/2020 13:09
7765230 Red Squirrel SJ0367552319 53.059408 -3.4387464 Clocaenog: Bron Branog: Location 9 1 Adult 01/10/2020 16:54
7761554 Red Squirrel SH9856552277 53.058084 -3.5149526 Clocaenog: Pentre-llyn-cymmer: Location 5 1 01/10/2020 17:22
7761417 Red Squirrel SJ0454252299 53.059384 -3.4258081 Clocaenog: Main Block East: Location 15 1 01/10/2020 16:36
7761416 Red Squirrel SJ0454252299 53.059384 -3.4258081 Clocaenog: Main Block East: Location 15 1 01/10/2020 08:51
7765217 Red Squirrel SJ0357152125 53.057646 -3.4402395 Clocaenog: Bron Branog: Location 7 1 Adult 02/10/2020 13:42
7765210 Red Squirrel SJ0354052072 53.057164 -3.440686 Clocaenog: Bron Branog: Location 5 1 Sub-adult 02/10/2020 16:07
7765209 Red Squirrel SJ0354052072 53.057164 -3.440686 Clocaenog: Bron Branog: Location 5 1 Adult 02/10/2020 Patchy squirrel 13:54
答案1
如果您想以自由格式的文本重新格式化日期字符串,我建议使用 Perl,因为它允许您将 sed 样式的s/pattern/replacement/
正则表达式搜索和替换与 Unix 样式strptime
和相结合strftime
。例如。
perl -MTime::Piece -pe '
s;\d{4}-\d{2}-\d{2};Time::Piece->strptime($&,"%Y-%m-%d")->strftime("%d/%m/%Y");ge
' yourfile
对于列式数据,我可能会选择 Miller - 它有一个内置的strptime
/ strftime
,您可以逐个字段应用它。
答案2
日期命令将日期转换为您所指定的任何内容......
date -d "10/28/2020" +%Y-%m-%d
2020-10-28
。
。
If there is only dates in the file thedates.txt
10/28/2020
10/29/2020
11/27/2021
12/20/2020
5/6/1999
11/6/73
11/11/2011
...然后可以使用 date 命令读取该文件date -f thedates.txt +%Y-%m-%d
2020-10-28
2020-10-29
2021-11-27
2020-12-20
1999-05-06
1973-11-06
2011-11-11
2020-10-21<---- and if you unintentionally read something like a blank line at the end of the file.. it will translate that to today's date... dont leave blanks or parse them out.
如果文件中不仅仅只有日期(很可能),那么您需要使用我担心的语句来解析dates.txt文件for
并将它们放入变量中,然后使用 -d 标志在$variable上运行date命令,如上所述,然后将格式化的输出发送回所需的位置....
这使得转换变得非常简单,但解析却使其变得笨拙……
至少对于像我这样不熟练使用正则表达式/脚本的人来说是这样。根据尚未看到的样本数据的难度,这可能会帮助另一个答案,即使没有别的。
答案3
我对你的文本文件的结构/外观一无所知,我假装它只有一列,即日期字段:
$ awk '{a=gensub(/(..)\/(..)\/(....)/,"\\3-\\2-\\1","1",$0); print a}' file.txt
2020-02-01
要将其放入文件(而不是屏幕上),请重定向输出:
$ awk '{a=gensub(/(..)\/(..)\/(....)/,"\\3-\\2-\\1","1",$0); print a}' file.txt >new_text_file
其中file.txt
应替换为您的文件的名称。
答案4
在 Calc 中插入新的日期列,将列格式设置为 YYYY-MM-DD。突出显示/复制原始日期列,但在粘贴时选择“特殊”、“粘贴为未格式化的文本”。然后它会保留所需的格式,这样您就可以删除原始(格式错误的)日期列。感谢 Wu-Tang 为我指明了正确的方向。