【问题标题】:Trouble manipulating imported csv data results in blank lines处理导入的 csv 数据时出现空行时出现问题
【发布时间】:2013-05-31 17:01:09
【问题描述】:

我是 powershell 的新手,所以我希望我不会遗漏任何非常明显的东西。我尝试搜索该站点,但很难找到对这个确切问题的参考。我试图从带有管道分隔符的 csv 文件中仅输出某些列( objects )。我的实际文件有大约 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} 对象,就像我在类似帖子中看到的那样,但它返回了相同的问题。

【问题讨论】:

    标签: object powershell


    【解决方案1】:

    问题是创建的属性名称末尾有一个空格。所以你必须这样做:

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

    那么如何解决这个问题?

    我想您可以在使用Import-Csv 之前手动修复它或使用类似这样的代码:

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

    这也将确保您的属性值没有多余的空间。

    【讨论】:

    • 我没有意识到它保留了尾随空格。我想如果不使用前面的空格,它就不会使用后面的空格。谢谢 !我觉得这很简单,我绞尽脑汁。
    【解决方案2】:

    正如 Andy 所说,您可以使用带有额外空格的属性名称和值。这是解析文件的另一种方法。

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

    【讨论】:

    • 再次感谢,对不起,我无法提升您的评论,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多