2017-01-17 16 views
0

У меня есть CSV-файл с столбцом даты с форматом dd/MM/YYY HH:mm:ss, например. 14/11/2016 00:00:00.Преобразование строки даты CSV в другой формат

Я пытаюсь конвертировать в форматирование на этой колонке формат даты ISO-8601: YYYY-mm-dd HH:mm:ss

Я попытался: (я редактировал я имел ошибку на формате ввода строки ...)

Import-Csv someCSV.csv | % { 
    $_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss").ToString('yyyy-MM-dd HH:mm:ss')) 
} | Export-Csv 'C:\testBis.csv' -NoTypeInformation 

Я получаю сообщение об ошибке:

Cannot find an overload for "ParseExact" and the argument count: "2". 
At line:1 char:69 
+ ... Date]' ; ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYY HH ... 
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

Я имел взгляд и судимый с Try разбором и разъединить несколько идей, но ничего не шов, чтобы работать.

Я не знаю, что я иду не так. какие-либо предложения?

+2

ParseExact требуется * три * параметры –

+2

.. почему люди на самом деле не в состоянии прочитать сообщения об ошибках, как это вещь? – specializt

ответ

1

pattern для соответствия году должно быть yyyy (с нижним регистром y), в вашей выборке нет запятой дату, и вам необходимо предоставить информацию о культуре для ParseExact(). Я также рекомендовал бы избежать косых черт, иначе они будут соответствовать любому разделителю дат, настроенному в региональных настройках компьютера. И вам нужно повторить измененную запись в конвейере, иначе экспорт не будет.

$culture = [Globalization.CultureInfo]::InvariantCulture 
Import-Csv someCSV.csv | ForEach-Object { 
    $_.'[Date]' = [DateTime]::ParseExact($_.'[Date]', 'dd\/MM\/yyyy HH:mm:ss', $culture).ToString('yyyy-MM-dd HH:mm:ss') 
    $_ # <-- feed modified record back into pipeline 
} | Export-Csv 'C:\testBis.csv' -NoType 
+1

не было бы культурой в качестве параметра в функции ParseExact? – maco1717

+0

Я сделал это, и это сработало. Благодарю. – maco1717

+0

@ maco1717 Действительно. Исправлена. –

0

DateTime.ParseExact требует не менее трех параметров. Третий параметр - используемая культура. Вы можете передать инвариант культуры [System.Globalization.CultureInfo]::InvariantCulture, например:

([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture) 

или более чистую версию:

$inv = [System.Globalization.CultureInfo]::InvariantCulture 
$fmtFrom = "dd/MM/YYY HH:mm:ss" 
$fmtTo = "yyyy-MM-dd HH:mm:ss" 

Import-Csv someCSV.csv | % { 
    $_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),$fmtFrom, $inv).ToString($fmtTo)) 
    } | Export-Csv 'C:\testBis.csv' -NoTypeInformation 

я удалил , из строки формата, так как вы упомянули, что фактический формат dd/MM/YYY HH:mm:ss, не dd/MM/YYY, HH:mm:ss

+0

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

Смежные вопросы