Как изменить формат даты в CSV-файле с помощью Windows CMD? - PullRequest
0 голосов
/ 23 января 2019

У меня есть CSV-файл, загруженный из Salesforce Dataloader, и я хочу изменить формат даты Дата последнего изменения (ГГГГ-ММ-ДДТ00: 00: 00.000Z) на (ГГГГ-ММ-ДД) с помощью Windows cmd.

Я попытался сослаться на старую ссылку ( Изменение формата даты и времени в файлах csv ).Я новичок в 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 голосов
/ 23 января 2019

В 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"
0 голосов
/ 23 января 2019

Учитывая, что ни одно из полей файла 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"
0 голосов
/ 23 января 2019

Это улучшенная версия кода Влама:

@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 (закомментированный) гораздо более быстрой обработкой подстроки. Кроме того, я перенаправляю весь вывод за один раз, что также значительно ускоряет работу (заметно при больших файлах).

0 голосов
/ 23 января 2019

Это работает, но вы должны сначала удалить заголовок из вашего входного файла.

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