我有一个从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
这里需要一些帮助。
谢谢
答案 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"