【问题标题】:Edit CSV header field with powershell使用 powershell 编辑 CSV 标头字段
【发布时间】:2014-01-10 16:22:45
【问题描述】:

希望有人可以帮助解决 PowerShell 问题。 我有一个这样的文件

test1.dat

H,customername,4110,001,69,001
d,item,desc,number
d,item,desc,number
d,item,desc,number

我想要做的是将最后一列 (001) 替换为第三列 (4110) 中的左 3 位

所以它会是这样的:

H,customername,4110,001,69,411
d,item,desc,number
d,item,desc,number
d,item,desc,number

我只想修改标题而不是细节。我尝试了下面的代码。

$file = "C:\files\test1.dat"

 (Get-Content  $file)[0 .. 0] | Foreach-Object {$_ -replace "411", "001"} | 
Set-Content  $file

这个问题是 我还没有找到一种方法来使用左字符串替换来从字段中获取前 3 个字符。 此代码将删除详细信息并仅写入第一行。

任何帮助都会有所帮助,

谢谢

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    导入文件:

    $file = "C:\files\test.dat"
    $dat = get-content $file
    

    选择第一行:

    $headers = $dat | select -first 1
    

    将第一行拆分成一个数组:

    $headers = $headers -split ","
    

    用第三个标题的前 3 个字符替换最后一个标题:

    $headers[5] = $headers[2].Substring(0,3)
    

    再次将数组连接到一个字符串中,值以逗号分隔:

    $headers = $headers -join ","
    

    将文件的第一行设置为连接的字符串:

    $dat[0] = $headers
    

    输出文件:

    $dat | set-content $file
    

    【讨论】:

      【解决方案2】:

      这样的事情应该可以工作:

      $file = "C:\files\test1.dat"
      
      $data = Get-Content $file
      
      ($data | select -First 1) -replace '^((?:.*?,){2}(...).*)...$', '$1$2' |
          Out-File $file
      $data | select -Skip 1 | Out-File $file -Append
      

      正则表达式分解:

      • ^(?:.*?,){2} 匹配标题行的前两个字段
      • (...) 匹配接下来的 3 个字符并将它们捕获在一个组中
      • ...$ 匹配最后 3 个字符

      ^(?:.*?,){2}(...)...$ 之间的 .* 与第 3rd 字段的前 3 个字符和字符串的后 3 个字符之间的其余标题行匹配。外圆括号将除最后 3 个字符之外的所有内容分组,以便在替换中使用。

      【讨论】:

        猜你喜欢
        • 2018-07-25
        • 2014-01-15
        • 2020-01-17
        • 1970-01-01
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多