【问题标题】:Change values in an array using foreach使用 foreach 更改数组中的值
【发布时间】:2016-09-15 20:56:48
【问题描述】:

我有一个导入的 CSV 文件,我需要更改列的格式 (backed_up_ts) 以删除列中的原始数据并用更新的格式替换它。

列中每一行的原始数据如下所示:

Tue Sep 13 07:46:26 MDT 2016 

我的代码的第一部分格式化每一行,以便可以将其与日期进行比较:

$csv = Import-Csv -Path "C:\Users\user\Desktop\NewReport.csv" | Select display_client_name, backed_up_ts
$csv = foreach ($budate in $csv.backed_up_ts) {
$budate = $budate.Substring(3)
$budate = $budate.Replace("MDT", "")
$budate = $budate.Replace("MST", "")
$budate = $budate.Split(" ")
$budate = $budate[1] + " " + $budate[2] + " " + $budate[5]
$budate = ($budate | Get-Date -Format d)

从这里我需要采用更新的格式(在$budate 值中)并替换$csv.backed_up_ts 数组中的原始数据。

但是,$budate 的值只是 foreach 循环中对象的最后一个值(2016 年 3 月 30 日)。
$csv.backed_up_ts 的值以其原始格式保留在数组中(2016 年 8 月 30 日,星期三,美国东部标准时间)。

我需要将原始数组$csv.backed_up_ts 替换为$budate 创建的协调值。

谢谢。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    根据对所需数据转换的说明更新了答案。

    代码

    # demonstrate changing columnn data in csv input
    $input = @"
    header1, header2
    value11, "Tue Sep 13 07:46:26 MDT 2016"
    value21, "Tue Oct 19 07:46:26 MDT 2017"
    "@
    
    $csv = ConvertFrom-Csv $input
    
    "original"
    $csv
    
    foreach ($item in $csv)
    {
        # modify the header2 column in our csv input
        $parts = $item.header2.Split(' ')
        $newDate = $parts[1] + " " + $parts[2] + " " + $parts[5]
        $item.header2 = [DateTime]::Parse($newDate) | Get-Date -Format d
    }
    
    "new"
    $csv
    

    输出

    original
    header1 header2                     
    ------- -------                     
    value11 Tue Sep 13 07:46:26 MDT 2016
    value21 Tue Oct 19 07:46:26 MDT 2017
    new
    value11 9/13/2016                   
    value21 10/19/2017    
    

    【讨论】:

    • 所以 - 在尝试使用您的格式时,它不接受它。让我进一步解释一下。标题 2 中的原始数据是“Wed Mar 30 10:03:45 MDT 2016”所以在 foreach 部分 - 我需要删除很多数据,然后才能将其转换为日期。 foreach ($item in $csv.header2) {$item = $item.replace("MDT", "") 这会将数据转换为可以转换为日期的格式。当我将其转换为日期时,我会尝试您的代码 $item.header2 = $item.header2 -replace *, $item 但这不起作用。
    • 您能否更新您的问题或添加您想要完成的评论?也许有更好的方法。对于格式为“Wed Mar 30 10:03:45 MDT 2016”的值,您究竟希望将其更改为什么?
    • 所以你的代码可以工作 - 如果 -replace 参数接受通配符 * - 所以它会删除该对象中的所有内容,并完全替换它。此外,它不能被静态“2”替换 - 它被动态变量替换。
    • 更新了我的问题。希望它更容易理解。
    • 更新了我的答案。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 2012-09-11
    • 1970-01-01
    • 2015-08-02
    • 2019-10-10
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多