PowerShell 更改 Data.DataTable 对象的数据类型
PowerShell change datatypes of the Data.DataTable object
我正在编写一个脚本,该脚本使用 .csv 文件中的数据创建 Data.DataTable
。一切正常,我的数据库中有正确的值。但是为了提高数据库性能,我想为 Data.DataTable
的列设置数据类型。不幸的是,我所有的值都从 CSV 转换为字符串到 Data.DataTable
列。
我的 CSV 看起来像这样(示例):
"Name";"UserID";"Salary"
"Peter";"1";"1200.03"
"Jennifer";"2";"1000.50"
我尝试了以下方法:
foreach ($object in $csv){
Write-Output "line $countline"
foreach($property in $object.PsObject.get_properties())
{
$property.TypeNameOfValue = [System.Type]::'System.Int32'
***and the other try***
$property.Value = [System.Type]::'System.Int32'
}
}
两次都没有发生(错误除外)。
所以我希望发生以下情况:第一列应该是字符串数据类型 ("name")。其他的应该是double或者float。
有人对此有解决方案吗?
有几种方法可以解决这个难题。我要说的是,Import-CSV
如果您想使用字符串以外的任何东西,会有一些限制,但可以做到。
方法一:Hash Tables
$data = import-csv .\data.csv -Delimiter ';'
$hashtable = [ordered]@{"Name" = ($data).name; "UserID" = ($data).UserID.ToDouble($_); "Salary" = ($data).Salary.ToDouble($_)}
示例输出:
PS C:\> $hashtable.Name
Peter
Jennifer
PS C:\> $hashtable.Name | GM
TypeName: System.String
PS C:\> $hashtable.UserID
1
2
PS C:\> $hashtable.UserID | GM
TypeName: System.Double
方法二:CSV Files with Type Information
这种方法使用我习惯的传统方法稍微容易一些 Import-Csv
但我无法将结果合并到一个变量中。不是世界末日,但还需要做更多的工作来制作更多的 CSV 文件并弄清楚如何对其应用类型。
示例 CSV 文件:
#TYPE System.String
"Name"
"Peter"
"Jennifer"
和
#TYPE System.Double
"UserID";"Salary"
"1";"1200.03"
"2";"1000.50"
使用 Import-Csv
的示例结果:
PS C:\> Import-Csv .\double.csv -Delimiter ';'
UserID Salary
------ ------
1 1200.03
2 1000.50
PS C:\> Import-Csv .\double.csv -Delimiter ';' | GM
TypeName: CSV:System.Double
可选方法:如果你有胆量,请在此处为 Import-Csv
编写代理脚本的人:Importing typed objects with typed properties from a CSV file,但我自己没有测试过。我提到它是因为如果它经常出现,它看起来是一个很好的处理方法。
我发现这篇关于如何处理某些 quirks of hash tables 的文章很有帮助。
我正在编写一个脚本,该脚本使用 .csv 文件中的数据创建 Data.DataTable
。一切正常,我的数据库中有正确的值。但是为了提高数据库性能,我想为 Data.DataTable
的列设置数据类型。不幸的是,我所有的值都从 CSV 转换为字符串到 Data.DataTable
列。
我的 CSV 看起来像这样(示例):
"Name";"UserID";"Salary"
"Peter";"1";"1200.03"
"Jennifer";"2";"1000.50"
我尝试了以下方法:
foreach ($object in $csv){
Write-Output "line $countline"
foreach($property in $object.PsObject.get_properties())
{
$property.TypeNameOfValue = [System.Type]::'System.Int32'
***and the other try***
$property.Value = [System.Type]::'System.Int32'
}
}
两次都没有发生(错误除外)。
所以我希望发生以下情况:第一列应该是字符串数据类型 ("name")。其他的应该是double或者float。
有人对此有解决方案吗?
有几种方法可以解决这个难题。我要说的是,Import-CSV
如果您想使用字符串以外的任何东西,会有一些限制,但可以做到。
方法一:Hash Tables
$data = import-csv .\data.csv -Delimiter ';'
$hashtable = [ordered]@{"Name" = ($data).name; "UserID" = ($data).UserID.ToDouble($_); "Salary" = ($data).Salary.ToDouble($_)}
示例输出:
PS C:\> $hashtable.Name
Peter
Jennifer
PS C:\> $hashtable.Name | GM
TypeName: System.String
PS C:\> $hashtable.UserID
1
2
PS C:\> $hashtable.UserID | GM
TypeName: System.Double
方法二:CSV Files with Type Information
这种方法使用我习惯的传统方法稍微容易一些 Import-Csv
但我无法将结果合并到一个变量中。不是世界末日,但还需要做更多的工作来制作更多的 CSV 文件并弄清楚如何对其应用类型。
示例 CSV 文件:
#TYPE System.String
"Name"
"Peter"
"Jennifer"
和
#TYPE System.Double
"UserID";"Salary"
"1";"1200.03"
"2";"1000.50"
使用 Import-Csv
的示例结果:
PS C:\> Import-Csv .\double.csv -Delimiter ';'
UserID Salary
------ ------
1 1200.03
2 1000.50
PS C:\> Import-Csv .\double.csv -Delimiter ';' | GM
TypeName: CSV:System.Double
可选方法:如果你有胆量,请在此处为 Import-Csv
编写代理脚本的人:Importing typed objects with typed properties from a CSV file,但我自己没有测试过。我提到它是因为如果它经常出现,它看起来是一个很好的处理方法。
我发现这篇关于如何处理某些 quirks of hash tables 的文章很有帮助。