2013-05-31 90 views
1

我是新來的PowerShell,所以我希望我不會錯過任何非常明顯的東西。我試圖搜索網站,但很難找到這個確切問題的參考。我試圖用管道分隔符從csv文件中只輸出特定的列(對象)。我的實際文件有40多列和數千個條目。我希望使用其他的powershell命令來排序和唯一的數據按特定的列。不幸的是,我甚至無法簡單地減少數據的工作。麻煩操縱導入的CSV數據導致空行

我的示例文件:

Letter | Number | IpAddress | Machine | User | Garbage 
a | 5 | 127.0.0.1 | tower | Admin | randomcharacters 
f | 193 | 127.0.0.2 | laptop | administrator | charactersrandom% 
r | 2882 | 127.0.0.8 | workstation | user1 | [email protected] 

兩個

import-csv .\sample.txt -Delimeter "|" | get-member 
import-csv .\sample.txt -Delimeter "|" | select-object | get-member 

提供相同的結果

Name  MemberType Definition        
----  ---------- ----------        
Equals  Method  bool Equals(System.Object obj)   
GetHashCode Method  int GetHashCode()      
GetType  Method  type GetType()       
ToString Method  string ToString()      
Garbage  NoteProperty System.String Garbage=randomcharacters 
IpAddress NoteProperty System.String IpAddress =127.0.0.1  
Letter  NoteProperty System.String Letter =a    
Machine  NoteProperty System.String Machine =tower   
Number  NoteProperty System.String Number =5    
User  NoteProperty System.String User =Admin  

但是當我指定的對象,System.String消失,輸出就是空行。

import-csv .\sample.txt -Delimiter "|" | select-object User | get-member 


    TypeName: Selected.System.Management.Automation.PSCustomObject 

Name  MemberType Definition      
----  ---------- ----------      
Equals  Method  bool Equals(System.Object obj) 
GetHashCode Method  int GetHashCode()    
GetType  Method  type GetType()     
ToString Method  string ToString()    
User  NoteProperty User=null 

我在哪裏出錯了?我只想導入數據,然後只輸出幾列。指定一個或多個失敗。我甚至嘗試使用{$ _。User}對象,因爲我曾閱讀過類似的文章,但它返回相同的問題。

回答

0

問題是,在最後使用空格創建屬性名稱。所以你必須這樣做:

import-csv .\sample.txt -Delimiter "|" | select-object "User " 

那麼如何解決這個問題呢?

我想你可以手動修復或使用Import-Csv使用一些這樣的代碼之前:

(Get-Content -path .\sample.txt) -replace ' \| ','|' | Set-Content -Path .\sample.txt 

這也將確保您的屬性值沒有多餘的空間,在其中。

+0

我沒有意識到它保留了尾部空間。我想如果前面的空間不被使用,它不會使用尾隨的空間。謝謝 !我覺得這很簡單,我正在絞盡腦汁。 – foolty

0

按照Andy的說法,您將擁有具有額外空格的屬性名稱和值。這是解析文件的另一種方法。

Get-Content .\sample.txt | 
ForEach-Object {$_ -replace ' \| ','|'} | 
ConvertFrom-Csv -Delimiter '|' 
+0

再次感謝,抱歉,我無法提升您的評論, – foolty