【问题标题】:Changing just one value in a csv file with powershell使用 powershell 仅更改 csv 文件中的一个值
【发布时间】:2017-05-23 15:57:40
【问题描述】:

我正在编写一个 powershell 脚本,它接收存储在 csv 文件中的电话号码。 csv 文件有一个“taken”字段,表示电话号码是否在使用中。现在,我有一个简单的 foreach 循环,它读取所取字段的值并将no 更改为yes

Import-Csv '\\papertransport.com\files\UserDocuments\mneis\Code\phone_numbers2.csv' | ForEach-Object 
{
    if ($_.taken -eq 'no') 
    {
        $_.taken = 'yes'
        break
    }
    $_
} | Export-Csv \\papertransport.com\files\UserDocuments\mneis\Code\phone_numbers.csv -NoTypeInformation

我的问题是:我怎样才能得到它,以便循环在遇到第一个否时停止?中断显然不起作用。此外,是否可以写入同一个 csv 文件而不是写入第二个文件?当我写入原件时,它会删除其中的所有值。

【问题讨论】:

  • 使用foreach($item in Import-Csv ...){} 而不是| ForEach-Object 使break 语句起作用
  • 我试过了,csv文件没有任何变化。
  • 你的问题有点不清楚。你到底想完成什么?您是否想要一个 csv 文件,其中只有第一次出现的“否”已更改为“是”,并且每隔一行保持不变?
  • @MathiasR.Jessen 抱歉,如果有点不清楚。基本上,我希望它循环遍历 csv 文件,并在所取列中的“否”时停止,将其从循环中断开,其余的“否”保持不变。然后它将“否”更改为“是”,以便下次迭代 csv 文件时将执行相同的操作,这一次传递先前更改的“否”。这有意义吗?

标签: powershell csv


【解决方案1】:

要获取循环,请将break 替换为return,或将您的代码更改为以下内容。

可以写入同一个文件;也在下面的代码中。我建议您对现有文件进行备份,以确保您不会丢失任何数据。添加了一个 try/catch 语句来执行此操作,并在无法创建副本时停止脚本(您还可以在此处看到 return 的操作)

$myFile       = '\\papertransport.com\files\UserDocuments\mneis\Code\phone_numbers2.csv'
$backup       = '\\papertransport.com\files\UserDocuments\mneis\Code\$((Get-Date).ToString"yyyyMMdd")_phone_numbers2.csv'

try{
    Copy-item $myFile $backup -ErrorAction Stop
}catch{
    Write-Host "File could not be copied"
    return;
}


$phoneNumbers = Import-Csv $myFile

Foreach($number in $phoneNumbers)
{
    if ($number.taken -eq 'no') 
    {
        $number.taken = 'yes'
        break
    }

    # you will need to ensure all of the headers in your original file are here, otherwise they will not be in your output file
    [array]$myNewPhoneNumbers += New-Object psobject -Property{
             taken        = $number.taken
             FirstHeader  = $number.FirstHeader
             SecondHeader = $number.SecondHeader
    }

}


$myNewPhoneNumbers | Export-Csv '\\papertransport.com\files\UserDocuments\mneis\Code\$((Get-Date).ToString"yyyyMMdd")_phone_numbers.csv'

# I would recommend ensuring the code works how you want before uncommenting this.
#$myNewPhoneNumbers | Select-Object FirstHeader, SecondHeader, ThirdHeader |Export-Csv $myFile -Force

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2020-05-05
    • 2017-06-07
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多