如何在CSV文件中的特定日期/时间字段值中修改单个数字小时到两位数小时?

时间:2018-01-01 13:04:02

标签: batch-file windows-scripting

我有一个文本文件(.txt),其中包含以下格式的多行文本:

ABCD|TEST|123456|12/10/2017 5:41|Sample|CODENOTE123|Comment text|11/27/2017|12383697

可以看出,有9个列由管道|运算符分隔。我需要编辑时间,即5:14,并将其转换为05:14。如果小时已经有两位数,则不需要对该行进行任何更改。 日期和时间始终是第4列元素。 编辑后的行应如下所示:

ABCD|TEST|123456|12/10/2017 05:41|Sample|CODENOTE123|Comment text|11/27/2017|12383697

必须对文本文件中的每一行进行此编辑,并且必须创建一个包含正确时间格式的所有行的新文本文件。

PS:列数(由管道运算符分隔)可以在9到14之间,但日期和时间将始终显示在第4列。

1 个答案:

答案 0 :(得分:0)

执行批处理文件的Windows命令解释程序用于运行命令和可执行文件,但不用于编辑文本或二进制文件。因此,几乎所有其他脚本或编程语言都适用于此CSV文件编辑任务。

How can you find and replace text in a file using the Windows command-line environment?包含许多解决方案,主要使用应用程序或其他脚本语言来搜索和替换文件中的字符串。

提供的解决方案之一是由{strong> Dave Benham 编写的JREPL.BAT,它是批处理文件/ JScript混合。 Microsoft的JScript支持正则表达式替换。因此,只要使用文本编辑器对文本文件执行简单的正则表达式搜索和替换Perl(如正则表达式语法),通常也可以使用批处理文件中的 jrepl.bat 来完成。< / p>

下面的批处理代码要求 jrepl.bat 与包含已发布命令行的批处理文件位于同一目录中。要在此批处理文件中指定要修改的文件,名称为DataFile.csv

@echo off
if not exist "DataFile.csv" goto :EOF
if not exist "%~dp0jrepl.bat" goto :EOF

call "%~dp0jrepl.bat" "(\|[01][0-9]/[0-3][0-9]/(?:19|20)[0-9][0-9]) (?=[0-9]:[0-5][0-9]\|)" "$1 0" /F "DataFile.csv" /O -

编写搜索表达式是为了查找时间在两个|格式为MM/DD/YYYY h:mm之间的日期,并在单个数字小时之前的空格字符后插入0。每年的世纪必须是1920

搜索字符串以任何形式查找此格式的日期/时间,因为我觉得在日期/时间字符串中更改其字段位置时,这对未来会更好。也可以使用搜索字符串将此搜索/替换限制为第四个|分隔字段值:

^((?:[^|]*\|){3}[01][0-9]/[0-3][0-9]/(?:19|20)[0-9][0-9]) (?=[0-9]:[0-5][0-9]\|)
此批处理脚本直接修改

DataFile.csv。用文件名替换 jrepl.bat 命令行末尾的-会生成一个新文件,该文件是DataFile.csv的副本,所有小时值都转换为两位数值。