使用powershell编辑CSV,但意外只导出一列

问题描述 投票:0回答:2

我正在尝试获取 CSV(制表符分隔的 txt 文件),并将其中一列从“姓氏、名字”更改为“名字姓氏”。我想我已经差不多可以将其转换为另一个程序的正确格式了,但是我导出的文件只有一列,即具有我编辑的名称的列。

`Import-CSV -Path import.txt  -Delimiter "`t" -Header @("col0", "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9", "cal1", "cal2", "cal3", "cal4", "cal5") |
foreach{ 

$last,$first = $_.col3 -split ", "
new-object psobject -Property @{name = "$first $last"}
$_
} | 

Export-CSV done.txt -Delimiter "`t" -NoTypeInformation

(Get-Content -Path done.txt ).Replace('"','') | Select-Object -Skip 1 | 
Set-Content -Path done.txt
(gc done.txt) | ? {$_.trim() -ne "" } | set-content done.txt`

我尝试导出到 txt 或 csv。最后两行更多的是格式,但我尝试排除它们。也没有标题。所以我添加了它们并在最后将它们取下。如果不添加 new-object,它根本不起作用。谢谢!

powershell csv export-to-csv
2个回答
1
投票
  • 直接修改每个输入对象的

    .col3
    属性 - 无需
    New-Object

  • 使用

    ConvertTo-Csv
    代替
    Export-Csv
    在内存中生成 CSV (TSV) 数据,作为行流,这允许您通过
    Select-Object
     跳过标题行-Skip 1
    ,然后使用
    Set-Content
    将剩余行写入输出文件。

Import-CSV -Path import.txt  -Delimiter "`t" -Header col0, col1, col2, col3, col4, col5, col6, col7, col8, col9, cal1, cal2, cal3, cal4, cal5 |
  ForEach-Object{ 
    $last, $first = $_.col3 -split ", "
    $_.col3 = "$first $last"
    $_
  } | 
  ConvertTo-Csv -Delimiter "`t" -NoTypeInformation |
  Select-Object -Skip 1 | 
  Set-Content -Encoding utf8 done.txt

注:

  • 我已将

    -Encoding utf8
    添加到
    Set-Content
    调用中,以提醒您可能希望显式控制字符编码;鉴于
    Set-Content
    默认使用系统的活动旧版 ANSI 代码页;请注意,
    -Encoding utf8
    在 Windows PowerShell 中总是生成带有 BOM 的 UTF-8 文件。

  • Windows PowerShell 中,您无法控制输出 CSV (TSV) 数据中的字段是否用双引号引起来 - 它们全部都是,但对于行为良好的 CSV / TSV 阅读器来说,应该这样做没有什么区别。

  • PowerShell(核心)7+

    中:

    do
      可以通过
    • ConvertTo-CsvExport-Csv
      参数控制
      -UseQuotes
      -QuoteFields
      的引用行为。
      此外,这两个 cmdlet 现在支持 
      -NoHeader
    • 开关以避免发出/写入标题行,并且不再需要使用
    • -NoTypeInformation
      此外,(无 BOM)UTF-8 现在是
      一致
    • 默认编码。
    因此,在
  • PowerShell (Core) 7+
中,代码可以简化为以下内容:

# PS 7+ only Import-CSV -Path import.txt -Delimiter "`t" -Header col0, col1, col2, col3, col4, col5, col6, col7, col8, col9, cal1, cal2, cal3, cal4, cal5 | ForEach-Object{ $last, $first = $_.col3 -split ", " $_.col3 = "$first $last" $_ } | Export-Csv done.txt -Delimiter "`t" -UseQuotes Never -NoHeader

上面省略了字段中的双引号,并创建了一个无 BOM 的 UTF-8 输出文件。
    

如果有示例源和示例目标字符串,我会很高兴,但我想你需要这样的东西

0
投票
Get-Content -Path import.txt | foreach { $tmp = $_ -split "\t"; $tmp[3] = $tmp[3] -replace "^([^,]*), ?(.*)",'$2 $1'; $tmp -join "`t" } | Set-Content -Path import.txt

它逐行读取文本文件。 按选项卡拆分列。 通过采用逗号之前的第一部分来更改第四列,并且(后面可能跟一个空格)采用以下字符作为第二部分。第二部分现在成为第一部分,后面是空格和第一部分。 现在所有列都通过选项卡重新连接在一起。
    

© www.soinside.com 2019 - 2024. All rights reserved.