如何将 CSV 文件中特定 date/time 字段值中的一位数小时修改为两位数小时?

How to modify single digit hour to two digit hour in a specific date/time field value in a CSV file?

我有一个包含多行文本的文本文件 (.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列。

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

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

所提供的解决方案之一是由 Dave Benham 编写的 JREPL.BAT,它是批处理文件/JScript 混合体。 Microsoft 的 JScript 支持正则表达式替换。因此,每当可以使用文本编辑器对文本文件执行类似 Perl 中的正则表达式语法的简单正则表达式搜索和替换时,通常也可以从内部使用 jrepl.bat 来完成一个批处理文件。

下面的批处理代码需要 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]\|)" " 0" /F "DataFile.csv" /O -

编写搜索表达式以查找时间介于两个 | 之间的日期,格式为 MM/DD/YYYY h:mm,并在一位数小时之前的 space 字符后插入 0。世纪必须是 1920.

搜索字符串以这种格式在行中的任何位置找到 date/time,因为我认为这对将来更好,以防 date/time 字符串在行中更改其字段位置。也可以使用搜索字符串将此 search/replace 限制为第四个 | 分隔字段值:

^((?:[^|]*\|){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 的副本,所有小时值都转换为两个数字值。