【问题标题】:Object Relational Mapping from CSV with PowerShell?使用 PowerShell 从 CSV 进行对象关系映射?
【发布时间】:2020-11-24 02:09:14
【问题描述】:

“如何遍历来自PowerShell的CSV数据?”可能是另一个问题标题。


这个output很好:

PS /home/nicholas> 
PS /home/nicholas> $flat

Date       Region            New_Tests Total_Tests Positivity Turn_Around
----       ------            --------- ----------- ---------- -----------
2020-01-23 BC                2         2           0          32
2020-01-23 Fraser            0         0           0          0
2020-01-23 Interior          0         0           0          0
2020-01-23 Northern          0         0           0          0
2020-01-23 Unknown           0         0           0          0
2020-01-23 Vancouver Coastal 2         2           0          32
2020-01-23 Vancouver Island  0         0           0          0

..

但我会更感兴趣,例如,基本的SQL:

SELECT * FROM $flat limit 3

或使用WHERE 子句。甚至可能只是返回行/记录n?最好represented为:

Date        : 2020-11-19
Region      : Vancouver Island
New_Tests   : 1682
Total_Tests : 118623
Positivity  : 1.4
Turn_Around : 12.7

我认为perhaps、fields 或 properties 属于通用 Object。

我如何将CSV 中的一行从Powershell 映射到Linux 上的Object?

【问题讨论】:

  • 很抱歉,但这没有多大意义。您要返回数据中不存在的记录吗?
  • 请尝试做更多研究并更具体地回答您的问题,请参阅:How do I ask a good question?

标签: sql powershell oop object orm


【解决方案1】:

你测试Import-Csv CmdLet:

Import-Csv 'your_file.csv' -Delimiter ';'

在你的情况下ConvertFrom-Csv CmdLet :

$labs_csv | ConvertFrom-Csv -Delimiter ';'

【讨论】:

    【解决方案2】:

    为了让您了解 PowerShell 中的一些一般概念,我尝试在下面回答您的每个特定(子)问题:

    “如何遍历来自PowerShell的CSV数据?”也许会 成为备用问题标题。

    PowerShell 中的大多数cmdlets 都使用PowerShell Pipeline。 Foreach-Object 是一个原生对象,用于遍历管道中的每个对象(行),其中 $_ is the current object 和 Region 是一个示例属性:

    PS C:\> $Flat | Foreach-Object { $_.Region }
    BC
    Fraser
    Interior
    Northern
    Unknown
    Vancouver Coastal
    Vancouver Island
    

    您也可以使用Foreachmethod 来遍历对象:

    PS C:\> $Flat.Foreach{ $_.Region }
    BC
    Fraser
    Interior
    Northern
    Unknown
    Vancouver Coastal
    Vancouver Island
    

    但我会更感兴趣,例如,基本的SQL:
    SELECT * FROM $flat limit 3

    SQL命令SELECT * FROM $flat limit 3的PowerShell补充,
    将是Select-Object cmdlet:

    PS C:\> $Flat | Select-Object * -First 3
    
    Date        : 2020-01-23
    Region      : BC
    New_Tests   : 2
    Total_Tests : 2
    Positivity  : 0
    Turn_Around : 32
    
    Date        : 2020-01-23
    Region      : Fraser
    New_Tests   : 0
    Total_Tests : 0
    Positivity  : 0
    Turn_Around : 0
    
    Date        : 2020-01-23
    Region      : Interior
    New_Tests   : 0
    Total_Tests : 0
    Positivity  : 0
    Turn_Around : 0
    

    或使用WHERE 子句。甚至可能只是返回行/记录n?

    要选择特定对象(行),您可以使用Select-Object -Index <index> Parameter:

    PS C:\> $Flat | Select-Object -Index 3
    
    Date        : 2020-01-23
    Region      : Northern
    New_Tests   : 0
    Total_Tests : 0
    Positivity  : 0
    Turn_Around : 0
    

    或者直接index into the object array:

    PS C:\> $Flat[3]
    
    Date        : 2020-01-23
    Region      : Northern
    New_Tests   : 0
    Total_Tests : 0
    Positivity  : 0
    Turn_Around : 0
    

    要查找具有特定属性的对象,您可以使用 Where-Object cmdlet:

    PS C:\> $Flat | Where-Object Turn_Around -eq 32
    
    Date        : 2020-01-23
    Region      : BC
    New_Tests   : 2
    Total_Tests : 2
    Positivity  : 0
    Turn_Around : 32
    
    Date        : 2020-01-23
    Region      : Vancouver Coastal
    New_Tests   : 2
    Total_Tests : 2
    Positivity  : 0
    Turn_Around : 32
    

    或者Where方法:

    PS C:\> $Flat.Where{ $_.Turn_Around -eq 32 }
    
    Date        : 2020-01-23
    Region      : BC
    New_Tests   : 2
    Total_Tests : 2
    Positivity  : 0
    Turn_Around : 32
    
    Date        : 2020-01-23
    Region      : Vancouver Coastal
    New_Tests   : 2
    Total_Tests : 2
    Positivity  : 0
    Turn_Around : 32
    

    要选择特定属性(列),您可以使用Select-Object -ExpandProperty <property> 参数:

    PS C:\> $Flat | Select-Object -ExpandProperty Region
    BC
    Fraser
    Interior
    Northern
    Unknown
    Vancouver Coastal
    Vancouver Island
    

    或使用Member Enumeration 功能:

    PS C:\> $Flat.Region
    BC
    Fraser
    Interior
    Northern
    Unknown
    Vancouver Coastal
    Vancouver Island
    

    最好represented为:

    大多数 cmdlet 默认将结果输出到管道(请参阅:Write-Output)。如果命令是管道中的最后一个命令,则对象将显示在控制台中。 PowerShell 使用默认格式化程序来定义对象类型的显示方式,但您可以使用格式化 cmdlet,例如Format-Table 和 Format-List,以您自己的方式格式化输出到控制台:

    PS C:\> $Flat | Select-Object * -First 3 | Format-Table
    
    Date       Region   New_Tests Total_Tests Positivity Turn_Around
    ----       ------   --------- ----------- ---------- -----------
    2020-01-23 BC       2         2           0          32
    2020-01-23 Fraser   0         0           0          0
    2020-01-23 Interior 0         0           0          0
    

    我认为perhaps、fields 或 properties 属于通用 Object。

    在 PowerShell 中,它们称为 Properties,属于特定对象。
    要列出对象的属性和方法,您可以使用 Get-Member cmdlet:

    PS C:\> $Flat | Get-Member
    
       TypeName: 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()
    Date        NoteProperty string Date=2020-01-23
    New_Tests   NoteProperty string New_Tests=2
    Positivity  NoteProperty string Positivity=0
    Region      NoteProperty string Region=BC
    Total_Tests NoteProperty string Total_Tests=2
    Turn_Around NoteProperty string Turn_Around=32
    

    如何将Linux 上的Powershell 中的一行从CSV 映射到Object?

    Import-Csv ./Flat.csv | ... (e.g. Where-Object ... or Select-Object ..) | ...
    

    您没有使用 Join 这个词,但是如果您正在寻找一种方法将对象列表(来自 csv 文件)与另一个对象列表(驻留在 PowerShell 中)基于相关属性,您可能需要检查此外部 Join-Object cmdlet(另请参阅:In Powershell, what's the best way to join two tables into one?)

    请注意,PowerShell Core 基于 .Net Core 框架,两者都旨在跨平台。这意味着在支持 PowerShell Core 的任何操作系统之间选择对象和属性(映射)基本上没有区别。

    【讨论】:

    • 我已经从我的回答中删除了标题(可能是否定的方法),并在问题的评论中添加了一个小评论。
    猜你喜欢
    • 2011-04-24
    • 2013-05-27
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多