Perl 格式化日期字段

Perl 格式化日期字段,perl,datetime,Perl,Datetime,我想重新格式化数据以填充数据库 这是一个9GB60列CSV文件的示例,我想重新格式化它 DATE,TIME,CRSPTM1,CRSPME1,CRSPLC1,CRSPMI1,CRSPSC1,CRSPMC1,CRSPSX1,CRSPTMT 20140303,9:30:00,1407.02,1394.69,1399.76,1426.59,1444.68,1498.23,1460.91,1495.53 20140303,9:30:01,1403.34,1391.57,1396.47,1422.47,14

我想重新格式化数据以填充数据库

这是一个9GB60列CSV文件的示例,我想重新格式化它

DATE,TIME,CRSPTM1,CRSPME1,CRSPLC1,CRSPMI1,CRSPSC1,CRSPMC1,CRSPSX1,CRSPTMT
20140303,9:30:00,1407.02,1394.69,1399.76,1426.59,1444.68,1498.23,1460.91,1495.53
20140303,9:30:01,1403.34,1391.57,1396.47,1422.47,1439.05,1488.27,1454.67,1491.61
20140303,9:30:02,1402.23,1390.97,1395.69,1420.78,1435.81,1486.59,1451.49,1490.43
20140303,9:30:03,1402.23,1391.01,1395.72,1420.72,1435.65,1486.62,1451.37,1490.43
20140303,9:30:04,1402.31,1391.15,1395.83,1420.70,1435.57,1486.63,1451.28,1490.52
20140303,9:30:05,1402.13,1390.95,1395.64,1420.58,1435.42,1486.56,1451.10,1490.33
20140303,9:30:06,1402.00,1390.84,1395.50,1420.29,1435.32,1486.58,1450.99,1490.18
20140303,9:30:07,1401.96,1390.83,1395.47,1420.15,1435.24,1486.47,1450.91,1490.14
20140303,9:30:08,1401.75,1390.55,1395.24,1420.17,1435.11,1486.27,1450.76,1489.92
前两个字段是,例如,
20140303,9:30:00
,我需要将其更改为MySQL日期时间格式

DATETIME类型用于同时包含日期和时间部分的值。MySQL以“YYYY-MM-DD HH:MM:SS”格式检索并显示日期时间值


我在几篇文章中看到Perl有一个
DateTime
模块,并且希望使用它。

正如我所看到的,您实际上需要更改每行的前8个字符(但是 首先)。您需要在年份部分(4个字符)和月份之后插入
-
字符 部分(另2个字符)

假设输入文件为inp.txt,则可以使用以下一行脚本:

perl –lne "print s/^(\d{4})(\d{2})(\d{2})/$1-$2-$3/r" inp.txt
为了避免创建任何额外的变量,我使用了 非破坏性(-r)选项,因此
s/../../
指令的结果 是替换结果(不是替换的数量)

第一行(列名)不会更改,因为它不匹配 使用的正则表达式

如果要将结果存储在另一个文件中,请将
>out\u file.txt
添加到上述命令中

如果还有什么不清楚的地方,你可能应该读一读:

  • perl选项(至少是这里使用的选项)
  • perl一行
  • 正则表达式

    • 此处不需要
      DateTime
      模块。这是简单的文本重新格式化

      perl -pe 's/^(\d\d\d\d)(\d\d)(\d\d),/$1-$2-$3 /' myfile.csv
      

      请将您的问题显示为文本,而不是显示该文本的图像。请看,您的问题可以通过在两个位置插入破折号并用空格替换逗号来解决。关于日期字符串上的普通正则表达式替换,这里已经有成百上千的问题了。当你有了一些代码并需要帮助时,也许可以删除这个问题并问一个新问题(但请理解,重复删除你自己的问题是有问题的,因为其他原因)。@tripleee是的,我明白你的意思。你能帮我理解我的思维过程吗?我知道Awk将有助于处理大文件,在阅读你的评论后,我可以考虑使用grep,这是有意义的。我主要是一名R程序员,我想了解Perl在这里是否可以与Awk以相同的能力使用。我将用Grep答案/尝试更新我的问题。谢谢gg是什么?这在任何正则表达式工具中都很容易做到;如果你想学习Perl,一定要学习。使用
      -aF、
      进行类似Awk的字段拆分可能会有所帮助。该脚本似乎基本上不相关。这实际上是Perl或Awk中的一行程序
      grep
      不是提供替换功能的工具。如果我正确阅读了要求,您还需要将第一个逗号替换为空格。感谢您的回答和重新格式化。我已经找到了答案,现在我有了更好的装备,可以每天钻研一点perl。我试图从和文档中推断代码的用法。但与此同时,另一个快速的新手问题是:在格式化大文件时,我认为应该使用
      操作数从bash提示符保存标准输出。关于如何有效地执行此操作,这里还有其他快速提示吗?可能是一种不将文件复制到新文件或以某种方式减少机器开销的方法。@B.L.Sher:“以某种方式减少机器开销”目前的解决方案是否存在问题?我将删除该注释,因为我主要关心的是,处理此命令的时间,如果没有问题,执行此perl命令只需约5分钟。关于不复制的第二部分不是一个真正的问题,复制并删除它。但就我的理解而言,我想知道这个微不足道的区别▬ 如果必须这样做,您需要制作一个副本,即,您不会进入
      csv
      文件并一次更改一行。这就是我从您那里收集到的对先前评论的回答。@B.L.Sher:除非新行长度与旧行长度相同,否则您无法轻松地在位编辑文件。如果它们的长度不同,那么无论如何都必须移动数据,并且将它们移动到不同的文件中没有任何好处。