繁体   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