Powershell解析包含逗号的CSV文件

时间:2015-02-26 11:47:23

标签: parsing powershell csv

考虑CSV文件:

Node Name,Client Name,Job Directory,Policy Name
server1,test.domain.com,"vmware:/?filter= VMHostName AnyOf "server2.domain.com", "server3.domain.com"",TEST

我的代码:

$events = Import-Csv "C:\file.csv" | foreach {
New-Object PSObject -prop @{
Server = $_.{Node Name};
Client = $_.{Client Name};
{JobDirectory/Script} = $_.{Job Directory};
Policy = $_.{Policy Name};  
}
}

当我尝试解析第三个字段时,我遇到了一些问题。我不确定它是因为逗号,还是双引号。

这是我想要的对象:

Node Name           : server1
Client Name         : test.domain.com
JobDirectory/Script : vmware:/?filter= VMHostName AnyOf "server2.domain.com", "server3.domain.com"
Policy Name         : TEST

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

好的,所以最简单的方法就是用Get-Content读取文件,然后将逗号不在引号内的每一行分开。我从这个solution借用了正则表达式。

使用您当前的输入数据我会做这样的事情

$filedata = Get-Content C:\temp\test.csv
$asObject = ForEach($singlerow in ($filedata | Select-Object -Skip 1)){
    $props = @{}
    $singlerow = $singlerow -split ',(?=(?:[^"]*"[^"]*")*[^"]*$)'
    [pscustomobject][ordered]@{
        Server = $singlerow[0]
        Client = $singlerow[1]
        "JobDirectory/Script" = $singlerow[2]
        Policy = $singlerow[3]
    }
}
来自$asObject | Format-List

示例输出

Server              : server1
Client              : test.domain.com
JobDirectory/Script : "vmware:/?filter= VMHostName AnyOf "server2.domain.com", "server3.domain.com""
Policy              : TEST

答案 1 :(得分:1)

使用起始代码的另一种方式

$obj = gc c:\temp\test.csv |
% { $_ -replace '"(\b[^"]*\b)"','$1' } |
    convertfrom-csv | % {  [pscustomobject][ordered] @{
    Server = $_.{Node Name}
    Client = $_.{Client Name}
    {JobDirectory/Script} = $_.{Job Directory}
    Policy = $_.{Policy Name} }
  }