我有很多行包含'输入'作为列下的子字符串'列1'但不是连续的形式。对于这种类型的每次出现,我想要设置值'一些数据'在同一行的另一列中。 这应该是它的样子。
Column1 Column2
This function takes input.
Other value don't care
String as input old_data
Column1 Column2
This function takes input. new_data
Other value don't care
String as input old_data, new_data
如果列是空的,它应该只是添加数据,但如果它已经包含一些old_data,它应该附加用逗号分隔的new_data。 有没有办法使用PowerShell或其他方式自动执行此任务。
修改 在你的帮助下,我修改了代码,它看起来像这样。 如果column3的值包含'输入'如果已经存在任何数据(字符或','),我已在第5列中检查过。但if语句中存在一些问题。
$path = "d:\Book.csv"
$data = Import-Csv $path
$check = "ACCESS"
$new_value = "access"
$data | ForEach-Object {
if($_.Column3 -match 'ACCESS'){
if($_.Column5.Trim() -eq "") {
$_.Column5 = $newvalue
} elseif ($_.Column5 -match [\w,]) {
$_.Column5 += "; $newvalue"
}
}
}
$data | Export-Csv d:\Book11.csv -NoTypeInformation
答案 0 :(得分:2)
下次展示一些努力,例如你试过什么此处的关键字为Import-CSV
,Export-CSV
和Foreach-Object / %
。
#Sample csv
$data = @"
Column1,Column2
This function takes input.,
Other value,don't care
String as input,old_data
"@ | ConvertFrom-Csv
#To import a real csv-file, uncomment the lines below
#$path = "c:\mydata.csv"
#$data = Import-Csv $path
$oldvalue = "old_data"
$newvalue = "new_data"
$data | ForEach-Object {
if($_.Column2.Trim() -eq "") {
$_.Column2 = $newvalue
} elseif ($_.Column2 -match [regex]::Escape($oldvalue)) {
$_.Column2 += ", $newvalue"
}
}
$data | Export-Csv $path -NoTypeInformation
修改后的数据:
$data | ft -AutoSize
Column1 Column2
------- -------
This function takes input. new_data
Other value don't care
String as input old_data, new_data
您的csv文件将如下所示:
PS C:\Users\Frode> $data | ConvertTo-Csv -NoTypeInformation
"Column1","Column2"
"This function takes input.","new_data"
"Other value","don't care"
"String as input","old_data, new_data"