簡體   English   中英

將日期格式轉換為 CSV 導出

[英]Convert date format to CSV export

我是 Poweshell 的新手,我編寫了一個腳本,將 SQL Select 的結果導出到 csv。 但是,我有兩列的日期格式為 mm-dd-yyyy,我希望它的格式為 yyyy-MM-dd HH:mm:ss.fff。 我只能轉換一列,而在另一列中我找不到轉換的方法。

有人可以幫我轉換兩列嗎?

#Connect to SQL and run QUERY 
$SQLServer = "xxxx" 
$SQLDBName = "xxxx"
$SQLUsername = "xxxx"
$SQLPassword = "nxxx"

$OuputFile = "c:\SQL_Export.csv"

$SqlQuery = "SELECT  
    rtrim(HANDLE) as Handle,
    rtrim(EMPRESA) as Empresa,
    rtrim(FILIAL) as Filial,
    rtrim(OPERACAO) as Operacao,
    rtrim(PESSOA) as Pessoa,
    rtrim(dataemissao) as Dataemissao,
    rtrim(documentodigitado) as Documentodigitado,
    rtrim(dataultimaliq) as Dataultimaliq,
    rtrim(ehprevisao) as Ehprevisao,
    rtrim(status) as Status,
    rtrim(entradasaida) as Entradasaida
  FROM [$SQLDBName].[dbo].[FN_DOCUMENTOS]
  where DATAULTIMALIQ >= '20200101'
  ORDER BY handle ASC"

##Delete the output file if it already exists
If (Test-Path $OuputFile ){
    Remove-Item $OuputFile
}

Write-Host "INFO: Exporting data from $SQLDBName to $OuputFile" -foregroundcolor white -backgroundcolor blue

## - Connect to SQL Server using non-SMO class 'System.Data':
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; User ID = $SQLUsername; Password = $SQLPassword"

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd

$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 

#Output RESULTS to CSV
$DataSet.Tables[0] | select-Object -ExcludeProperty Dataemissao @{Name="Dataemissao";Expression={([datetime]$_.Dataemissao).ToString("yyyy-MM-dd HH:mm:ss.fff")}}, * | Export-Csv $OuputFile
(Get-Content $OuputFile) | Foreach-Object {$_ -replace '"', ""} | Set-Content $OuputFile -Encoding `UTF8`

我需要轉換的列是“Dataemissao”和“Dataultimaliq”

在這種情況下,您需要在 Select-Object 中有很長的一行:

$DataSet.Tables[0] | 
    Select-Object -ExcludeProperty Dataemissao, Dataultimaliq @{Name = "Dataemissao";   Expression= { '{0:yyyy-MM-dd HH:mm:ss.fff}'-f [datetime]$_.Dataemissao }},
                  @{Name = "Dataultimaliq"; Expression= { '{0:yyyy-MM-dd HH:mm:ss.fff}'-f [datetime]::ParseExact($_.Dataultimaliq, 'MMM dd yyyy hh:mm tt', [cultureinfo]"en-US") }},
                  * | Export-Csv -Path $OuputFile -Encoding UTF8 -NoTypeInformation

或者,您可以在代碼上方添加一個小助手 function

function Format-Date () {
    param (
        [string]$dateString,
        [string]$format = 'MMM dd yyyy hh:mm tt'
    )
    $date = Get-Date
    if ([datetime]::TryParseExact($dateString, $format, [cultureinfo]"en-US", 0, [ref]$date)) {
        return '{0:yyyy-MM-dd HH:mm:ss.fff}'-f $date
    }
}

並將其用於Dataultimaliq

@{Name = "Dataultimaliq"; Expression= { Format-Date $_.Dataultimaliq }},

如您所見,我在其中添加了第二個參數$format ,默認為 ''MMM dd yyyy hh:mm tt',因為這是返回的 Dataultimaliq 字段的格式。
您也可以在 Dataemissao 字段上使用它,但我不知道它是什么格式。(顯然,您的系統可以將其轉換為 DateTime object 沒有任何問題)

我看到您稍后閱讀了 csv 文件並從中刪除了引號。 這會導致各種問題,因為有時 CSV 文件中需要引號,您不應該簡單地刪除所有引號。 看看這個答案的代碼如何安全地做到這一點

PS '{0:yyyy-MM-dd HH:mm:ss.fff}'-f [datetime]$_.Dataemissao是一種以特定格式獲取日期的更“PowerShelly”方式。 它返回與([datetime]$_.Dataemissao).ToString("yyyy-MM-dd HH:mm:ss.fff") ,但更簡潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM