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

How to change date format in CSV file using windows cmd?

我有一个从 salesforce dataloader 下载的 csv 文件,我想使用 windows命令。

我试着引用旧的 link (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

这里需要一些帮助。

谢谢

这个有效,但您必须先从输入文件中删除 header。

@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
 )
)

鉴于 CSV 文件的 none 字段为空,以下脚本将执行您想要的操作:

@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"

这是 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"
)

它将原始文件的第一行(Header)复制到一个变量以供进一步使用,for 循环处理其余部分(skip=1)。我用更快的子字符串处理替换了(工作中的)Powershell 代码(已注释掉)。此外,我一次性重定向了整个输出,这也加快了很多速度(对于较大的文件很明显)。

在 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"