Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing Powershell正在分析包含逗号的CSV文件_Parsing_Powershell_Csv - Fatal编程技术网

Parsing Powershell正在分析包含逗号的CSV文件

Parsing Powershell正在分析包含逗号的CSV文件,parsing,powershell,csv,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 @{ Se

考虑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

有人能帮我吗?

好的,所以最简单的方法是用
Get Content
读入文件,然后在逗号不在引号内的地方拆分每一行。我为此借用了这里的正则表达式

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

$filedata=获取内容C:\temp\test.csv
$asObject=ForEach($filedata | Select Object-Skip 1)中的单行){
$props=@{}
$singlerow=$singlerow-split',(?=(?:[^“]*”[^“]*”)*[^“]*”*”*[^“]*$)'
[pscustomobject][ordered]@{
服务器=$singlerow[0]
客户端=$singlerow[1]
“JobDirectory/Script”=$singlerow[2]
策略=$singlerow[3]
}
}
样本输出来自
$asObject |格式列表

服务器:server1
客户:test.domain.com
JobDirectory/Script:“vmware:/?filter=VMHostName AnyOf”server2.domain.com“,“server3.domain.com”
政策:测试

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

$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} }
  }

你的csv真的是这样形成的吗?第二行实际上是前一行的延续吗?你对这个csv的创建方式有任何控制吗?我编辑了我的原始帖子。现在我想它更清楚了。我无法控制cvs文件的创建。是的,这是因为没有结束双引号。从未见过这种行为。如果您手动添加结束报价,它可以工作。可以使用
get content
进行此操作,我想您刚刚更改了csv内容。我正在根据以前的内容编写答案。现在没有新行吗?抱歉,马特,没有新行。(我再次更正了代码格式)。谢谢!谢谢Matt。代码很好。这个伪代码呢?。如果我找到一个双引号和一个分号,用逗号替换分号。
If($thirdfield | Select String-Pattern'','){$thirdfield=$String-replace',“,;”}
不确定您调用的是什么上下文。
$thirdfield
是如何定义的?为什么要用分号替换最后一个逗号。如果您不想使用我的代码并有其他途径,请更新此问题或问另一个问题。不,不……您的代码非常完美,工作非常好!我很嫉妒……)我在胡扯。谢谢!