Манипуляция строк и выходное форматирование данных CSV для вставки в базу данных SQL - PullRequest
0 голосов
/ 06 мая 2019

Я новичок в PowerShell и пытаюсь импортировать данные из файла журнала CSV в базу данных SQL.

Я использую ForEach для форматирования таблицы и вставки значений в запрос, используя Invoke-Sqlcmd, который работает нормально, за исключением того, что необходимо изменить формат даты и времени.

Я начал с переформатирования даты и времени в соответствии с форматом smalldatetime.

Я просмотрел различные сайты, пытаясь выяснить, как отформатировать текст обратно в исходную форму. Помимо повторной обработки его в новый CSV-файл и повторения процесса, я не могу придумать, как выполнить это нарочно (и я даже не знаю, сработает ли это как задумано или нет).

$CSVImport = Import-CSV $FileBrowser.FileName -Header $FSHeader | Select $_ | ? Time -NotLike 'Time'
             $CSVRowCount = $CSVImport.Count
             "Inserting $CSVRowCount rows from CSV into SQL Table"
             ForEach ($CSVLine in $CSVImport) {
                $CSVLine
                $CSVLine = $CSVLine -Replace '(\d{1,2})\/(\d{1,2})\/(\d{4})', '$3/$1/$2'
$CSVLine = $CSVLine -Replace '(\d{1,2})\/(\d{1,2})\/(\d{4})', '$3/$1/$2'

Выход из моего Переменная $ CSVLine показывает:

Date           ColumnB ColumnC ColumnD 
-------------- ------- ------- ------
2/7/2017 13:28 Second  Third   Last    

После этого формат меняется на.

@{Date=2017/2/7 13:28; ColumnB=Second; ColumnC=Third; ColumnD=Last}

Я не уверен, как использовать выходные данные для запроса или переформатировать его обратно в таблицу, которая существовала ранее.

Есть какие-нибудь рекомендации, как поступить с этим?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019
  • После импорта с использованием пользовательских заголовков Date,ColumnB,ColumnC,ColumnD
    $ CSVImport - это объект со свойствами, как и $ CSVLine.

Ваша команда

$CSVLine = $CSVLine -Replace ...

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

@{Date=2017/2/7 13:28; ColumnB=Second; ColumnC=Third; ColumnD=Last}

Вы можете сделать замену только на $CSVLine.Date
но лучше преобразовать в [datetime], как предложено в thom-schumacher s answer.

В зависимости от вашей страны простого приведения может не хватить, тогда попробуйте

[datetime]::ParseExact($CSVLine.Date,"M/d/yyyy HH:mm",$Null)
0 голосов
/ 07 мая 2019

Если вы введете дату в тип DateTime

[datetime]'2017/2/7 13:28'

После этого у вас будет объект даты и времени, с которым вы можете работать для форматирования вашего сердца:

[datetime]'2017/2/7 13:28' | gm


   TypeName: System.DateTime

Name                 MemberType     Definition                                                                                                                  
----                 ----------     ----------                                                                                                                  
Add                  Method         datetime Add(timespan value)

......

См. Эту предыдущую статью для получения справки о дате и времени Как отформатировать DateTime в PowerShell

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...