CSV文件数据操作

时间:2014-04-06 09:43:06

标签: powershell csv data-manipulation

我有很多行包含'输入'作为列下的子字符串'列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

1 个答案:

答案 0 :(得分:2)

下次展示一些努力,例如你试过什么此处的关键字为Import-CSVExport-CSVForeach-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"