使用 PowerShell 导入 CSV:日期转换
Import CSV using PowerShell: date conversion
我正在将 CSV 文件导入 MS SQL,在不同的 CSV 文件中我有不同的日期类型。我的代码:
## Input Variables
$csvPath = "F:\Test\table.csv"
$csvDelimiter = ";"
$serverName = "name"
$databaseName = "dbname"
$tableSchema = "dbo"
$tableName = "dates"
$encoding = "windows-1251"
Import-Csv -Path $csvPath -encoding $encoding -Delimiter $csvDelimiter | Write-SqlTableData -ServerInstance $serverName -DatabaseName $databaseName -SchemaName $tableSchema -TableName $tableName -Force
例如,我的 CSV 文件中的日期如下:
12JAN2021:18:03:41.000000
这里的问题是那个字母写的月份
或
17.04.2021
这里的问题是 SQL 读起来像“mm.dd.yyyy”,但它是“dd.mm.yyyy”
如何改进我的代码,使其能够自动正确读取日期并将其写入目标中的日期或日期时间字段table?
非常感谢!
更新 CSV 示例:
product;product_id;product_nm;dttm
220;text;some text;12JAN2021:18:03:41.000000
220;text;some text;1JAN2021:18:03:41.000000
564;text;some text;16JAN2021:18:03:41.000000
如果 CSV 都具有不同的 DateTime 格式,我认为没有 “自动方式” 来解析它们。我相信您需要检查每个文件以查看格式是否有效(将 [datetime]
直接转换为 string
)或者它们是否具有 需要解析的格式.
例如,您的问题都提供了日期,需要进行解析,并且可以使用 [datetime]::ParseExact(..)
:
进行解析
[datetime]::ParseExact(
'12JAN2021:18:03:41.000000',
'ddMMMyyyy:HH:mm:ss.ffffff',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
[datetime]::ParseExact(
'17.04.2021',
'dd.MM.yyyy',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
如果您需要帮助“更新” CSV 中的 DateTime
列,您需要提供更多详细信息。
例如,问题中提供的 CSV 可以更新如下:
# Here you would use this instead:
# $csv = Import-Csv path/to/csv.csv -Delimiter ';'
$csv = @'
product;product_id;product_nm;dttm
220;text;some text;12JAN2021:18:03:41.000000
220;text;some text;1JAN2021:18:03:41.000000
564;text;some text;16JAN2021:18:03:41.000000
'@ | ConvertFrom-Csv -Delimiter ';'
foreach($line in $csv)
{
$line.dttm = [datetime]::ParseExact(
$line.dttm,
'dMMMyyyy:HH:mm:ss.ffffff',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
}
现在,如果我们检查 CSV,它将如下所示:
PS /> $csv | Format-Table
product product_id product_nm dttm
------- ---------- ---------- ----
220 text some text 01.12.2021
220 text some text 01.01.2021
564 text some text 01.16.2021
管道中的所有进程如下所示:
Import-Csv -Path $csvPath -Encoding $encoding -Delimiter $csvDelimiter |
ForEach-Object {
$_.dttm = [datetime]::ParseExact(
$_.dttm,
'dMMMyyyy:HH:mm:ss.ffffff',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
$_
} | Write-SqlTableData.....
我正在将 CSV 文件导入 MS SQL,在不同的 CSV 文件中我有不同的日期类型。我的代码:
## Input Variables
$csvPath = "F:\Test\table.csv"
$csvDelimiter = ";"
$serverName = "name"
$databaseName = "dbname"
$tableSchema = "dbo"
$tableName = "dates"
$encoding = "windows-1251"
Import-Csv -Path $csvPath -encoding $encoding -Delimiter $csvDelimiter | Write-SqlTableData -ServerInstance $serverName -DatabaseName $databaseName -SchemaName $tableSchema -TableName $tableName -Force
例如,我的 CSV 文件中的日期如下:
12JAN2021:18:03:41.000000
这里的问题是那个字母写的月份
或
17.04.2021
这里的问题是 SQL 读起来像“mm.dd.yyyy”,但它是“dd.mm.yyyy”
如何改进我的代码,使其能够自动正确读取日期并将其写入目标中的日期或日期时间字段table?
非常感谢!
更新 CSV 示例:
product;product_id;product_nm;dttm
220;text;some text;12JAN2021:18:03:41.000000
220;text;some text;1JAN2021:18:03:41.000000
564;text;some text;16JAN2021:18:03:41.000000
如果 CSV 都具有不同的 DateTime 格式,我认为没有 “自动方式” 来解析它们。我相信您需要检查每个文件以查看格式是否有效(将 [datetime]
直接转换为 string
)或者它们是否具有 需要解析的格式.
例如,您的问题都提供了日期,需要进行解析,并且可以使用 [datetime]::ParseExact(..)
:
[datetime]::ParseExact(
'12JAN2021:18:03:41.000000',
'ddMMMyyyy:HH:mm:ss.ffffff',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
[datetime]::ParseExact(
'17.04.2021',
'dd.MM.yyyy',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
如果您需要帮助“更新” CSV 中的 DateTime
列,您需要提供更多详细信息。
例如,问题中提供的 CSV 可以更新如下:
# Here you would use this instead:
# $csv = Import-Csv path/to/csv.csv -Delimiter ';'
$csv = @'
product;product_id;product_nm;dttm
220;text;some text;12JAN2021:18:03:41.000000
220;text;some text;1JAN2021:18:03:41.000000
564;text;some text;16JAN2021:18:03:41.000000
'@ | ConvertFrom-Csv -Delimiter ';'
foreach($line in $csv)
{
$line.dttm = [datetime]::ParseExact(
$line.dttm,
'dMMMyyyy:HH:mm:ss.ffffff',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
}
现在,如果我们检查 CSV,它将如下所示:
PS /> $csv | Format-Table
product product_id product_nm dttm
------- ---------- ---------- ----
220 text some text 01.12.2021
220 text some text 01.01.2021
564 text some text 01.16.2021
管道中的所有进程如下所示:
Import-Csv -Path $csvPath -Encoding $encoding -Delimiter $csvDelimiter |
ForEach-Object {
$_.dttm = [datetime]::ParseExact(
$_.dttm,
'dMMMyyyy:HH:mm:ss.ffffff',
[cultureinfo]::InvariantCulture
).ToString('MM.dd.yyyy')
$_
} | Write-SqlTableData.....