PowerShell更改Data.DataTable对象的数据类型

时间:2015-04-16 14:50:15

标签: powershell csv datatable

我正在编写一个脚本,该脚本使用.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")。其他应该是双倍或浮动。

有人有解决方案吗?

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个难题。我会说,Import-CSV如果你想使用除字符串之外的任何东西都有一些限制,但是可以这样做。

方法1: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

方法2: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的帮助。