2015-04-16 15 views
0

我正在處理一個腳本,該腳本使用.csv文件中的數據創建Data.DataTable。一切工作正常,我有我的數據庫中正確的值。但爲了幫助我的數據庫性能,我想爲Data.DataTable的列設置數據類型。不幸的是,我所有的值都被轉換爲字符串從CSV到Data.DataTable列。PowerShell更改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' 
     } 
    } 

兩個時間什麼都沒有發生(除非錯誤)。

所以我想要發生以下情況:第一列應該是字符串(「名稱」)的數據類型。其他人應該是雙人或浮動。

有沒有人有解決方案?

回答

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" 

並使用Import-Csv

#TYPE System.Double 
"UserID";"Salary" 
"1";"1200.03" 
"2";"1000.50" 

示例結果:

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有幫助。