【问题标题】:CSV file data manipulationCSV 文件数据操作
【发布时间】:2014-05-18 12:12:38
【问题描述】:

我有很多行包含“输入”作为“列 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

【问题讨论】:

    标签: powershell csv data-manipulation


    【解决方案1】:

    下次表现出一些努力,例如。你试过什么。这里的关键字是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"
    

    【讨论】:

    • 感谢您的及时回复。我只有一个疑问。正则表达式匹配中'::Escape'的目的是什么。我搜索了它,但找不到它。
    • Export-Csv:无法将参数绑定到参数“InputObject”,因为它为空。在 D:\BTP\manipulate.ps1:26 char:19 + $data | Export-Csv
    • -match 是一个运算符,用于测试字符串是否与正则表达式模式匹配。由于您要匹配特定文本,因此我们需要转义特殊字符,例如 . () \ [] {} + ? 等。如果在 $data | export-csv 上失败,那么您的 $data 为空,这意味着可能从未导入过。该示例有效。请务必将$path 变量更改为您的文件,并取消注释以$path = $data = import 开头的行。
    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2018-11-04
    相关资源
    最近更新 更多