2013-05-31 48 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