我是powershell的新手所以我希望我不会错过任何非常明显的东西。我尝试搜索网站,但很难找到这个确切问题的参考。我正在尝试使用管道分隔符从csv文件中仅输出某些列(对象)。我的实际文件有40多个列和数千个条目。我希望使用其他powershell命令仅按特定列对数据进行排序和唯一。不幸的是,我甚至无法将最简单的数据缩减工作。
我的示例文件:
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 | nothi$gher@e
两个
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 :(得分:0)
问题是正在使用末尾的空格创建属性名称。所以你必须这样做:
import-csv .\sample.txt -Delimiter "|" | select-object "User "
那么如何解决这个问题?
我想您可以在使用Import-Csv
之前手动修复它或使用这样的代码:
(Get-Content -path .\sample.txt) -replace ' \| ','|' | Set-Content -Path .\sample.txt
这也将确保您的属性值中没有额外的空间。
答案 1 :(得分:0)
正如Andy所说,你可以拥有额外空格的属性名称和值。这是解析文件的另一种方法。
Get-Content .\sample.txt |
ForEach-Object {$_ -replace ' \| ','|'} |
ConvertFrom-Csv -Delimiter '|'