如何使用Windows cmd更改CSV文件中的日期格式?

时间:2019-01-23 08:11:25

标签: batch-file cmd datetime-format

我有一个从salesforce数据加载器下载的csv文件,我想使用Windows cmd将“上次修改日期”的日期格式(YYYY-MM-DDT00:00:00.000Z)更改为(YYYY-MM-DD)。

我尝试引用旧链接(Changing datetime format in csv files)。我是Windows cmd的新手,我不完全了解批处理脚本。

这是我正在尝试的批处理脚本代码。

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%x in ('TestCSV1.csv') do (
    for /f "usebackq tokens=1-3* delims=," %%i in ("%%~fx") do (
        for /f "delims=" %%a in ('powershell -command \"{YYYY-MM-DDT00:00:00.000Z}\" -f [datetime]^('%%k'^)') do >>"TestCSV2.csv" echo %%i,%%j, %%a
    )
)

这是我必须在其中进行更改的CSV文件。

FIRSTNAME,LASTNAME,LASTMODIFIEDDATE,PHONE
Test,Last1,2019-01-21T19:07:36.000Z,9876543210
Test,Last2,2019-01-21T19:07:45.000Z,9876543211
Test,Last3,2019-01-22T05:56:20.000Z,9876543212

这里需要一些帮助。

谢谢

4 个答案:

答案 0 :(得分:0)

此方法有效,但是您必须先从输入文件中删除标题。

@echo off
for /f "delims=" %%x in ('dir /b TestCSV1.csv') do (
 for /f "usebackq tokens=1-4* delims=," %%i in ("%%~fx") do (
  for /f "delims=" %%a in ('powershell -command \"{0:yyyy-MM-dd}\" -f [datetime]^('%%k'^)') do >>"%%~nx_new.csv" echo %%i,%%j,%%a,%%l
 )
)

答案 1 :(得分:0)

鉴于CSV文件的所有字段都不为空,以下脚本将满足您的要求:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_CSV=%~1"
set "_SEP=,"

set "HEAD="
for /F "usebackq tokens=1-4 delims=%_SEP% eol=%_SEP%" %%A in ("%_CSV%") do (
    if not defined HEAD (
        echo(%%A%_SEP%%%B%_SEP%%%C%_SEP%%%D
        set "HEAD=#"
    ) else (
        for /F "delims=T eol=T" %%E in ("%%C") do (
            echo(%%A%_SEP%%%B%_SEP%%%E%_SEP%%%D
        )
    )
)

endlocal
exit /B

假设它名为change-date.bat,运行它并提供CSV文件作为命令行参数:

change-date.bat "TestCSV1.csv"

如果要将结果保存到另一个文件中,请使用以下方法:

change-date.bat "TestCSV1.csv" > "TestCSV2.csv"

答案 2 :(得分:0)

这是Vlam代码的改进版本:

@echo off
setlocal enabledelayedexpansion

set "file=testCSV1.csv"

for %%x in ("%file%") do (
  <"%%~fx" set /p "Header="
  (
    echo !Header!
    for /f "skip=1 usebackq tokens=1-4* delims=," %%i in ("%%~fx") do (
      REM for /f "delims=" %%a in ('powershell -command \"{0:yyyy-MM-dd}\" -f [datetime]^('%%k'^)') do echo %%i,%%j,%%a,%%l
      set "day=%%k"
      echo %%i,%%j,!day:~0,10!,%%l
    )
  )>"%%~nx_new.csv"
)

它将原始文件的第一行(标头)复制到变量中以供进一步使用,而for循环处理其余的变量(skip=1)。我用更快的子字符串处理替换了(有效的)Powershell代码(已注释)。而且,我一口气重定向了整个输出,这也大大加快了处理速度(较大的文件中值得注意)。

答案 3 :(得分:0)

在PowerShell中更容易。

Import-Csv -Path '.\fixd.csv' |
    ForEach-Object {$_.LASTMODIFIEDDATE=$_.LASTMODIFIEDDATE.Substring(0, 10); $_} |
    Export-Csv -Path '.\fixdnew.csv' -NoTypeInformation

如果必须从cmd.exe运行:

powershell -NoLogo -NoProfile -Command ^
    "Import-Csv -Path '.\fixd.csv' |" ^
    "ForEach-Object {$_.LASTMODIFIEDDATE=$_.LASTMODIFIEDDATE.Substring(0, 10); $_} |" ^
    "Export-Csv -Path '.\fixdnew.csv' -NoTypeInformation"