繁体   English   中英

如何使用powershell更改csv文件中的值

[英]how to change values in csv files using powershell

我有一个 csv 文件 sample.csv

#Period,Account,Entity,Year,Version,Currency,HSP_Rates,Scenario,Data
Apr,1,9,FY22,F,L,H,A,2

我想将年份值更改为 2022。我编写了一些代码,但没有提供我所需的输出

你的代码工作得很好。

Powershell 对以井号#开头的 CSV 存在问题。 它将# (当作为第一个字符出现时)解释为类型指示符。

如果您可以事先更改输入 CSV,请从#Period中删除哈希,您的代码将按预期工作。

否则,您将需要通过在转换 CSV 之前删除哈希#来解决该限制。

这意味着额外的步骤。 该过程将如下所示:

  • CSV 文件上的 Get-Content -Raw 以获取文件的字符串表示形式。
  • 修剪#period的哈希值
  • 使用ConvertFrom-CSV将结果字符串从 CSV 转换为 PSObject
  • 做你的修改
  • 使用ConvertTo-CSV获取新字符串
  • 插入哈希#符号
  • 将内容导出到文件。

这是一个修改后的示例,可以实现这一点

$csvRaw = Get-Content -Path 'D:\sample.csv' -Raw 
$Csv = $CsvRaw.TrimStart('#') | ConvertFrom-Csv

$NewCsv = $csv | ForEach-Object {
    [PsCustomObject]@{
        Period    = $_.Period
        Account   = $_.Account
        Entity    = $_.Entity
        Year      = "2022"
        Version   = $_.Version
        Currency  = $_.Currency
        HSP_Rates = $_.HSP_Rates
        Scenario  = $_.Scenario
        Data      = $_.Data
    } }
    
$OutCsv = ($NewCsv | ConvertTo-Csv -NoTypeInformation).TrimStart('"#')
# Converting back to CSV surround everything with double quotes. 
# We need to insert back the hash sign for the #period header
$OutCsv[0] = """#" + $OutCsv[0]
$OutCsv | Out-File 'D:\sample_1.csv'

参考

Github 问题 - 如果 # 是标题的第一个字符,则 ConvertFrom-Csv 的行为很奇怪

Github 问题 - Import-Csv / ConvertFrom-Csv 将双引号哈希 (#) 误解为注释行的开头

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM