【问题标题】:how to prepend filename to every record in a csv?如何将文件名添加到csv中的每条记录?
【发布时间】:2020-01-06 15:07:27
【问题描述】:

我们如何将文件名添加到特定目录中的所有 csv 文件?

我有一堆 csv 文件,每个文件看起来像这样:

ExampleFile.Csv

2323, alex, gordon
4382, liza, smith

我想要的输出是:

ExampleFile.Csv, 2323, alex, gordon
ExampleFile.Csv, 4382, liza, smith

我们如何将文件名添加到特定目录中的所有 csv 文件?

我尝试了以下解决方案:

Get-ChildItem *.csv | ForEach-Object {
    $CSV = Import-CSV -Path $_.FullName -Delimiter ","
    $FileName = $_.Name

    $CSV | Select-Object *,@{E={$FileName}} | Export-CSV $_.FullName -NTI -Delimiter ","
}

但是,这不起作用,因为它改变了第一行。 (我的数据没有标题行)。此外,此脚本将追加到每条记录的末尾,而不是 prepend 在开头。

【问题讨论】:

  • @JeffZeitlin 很想知道您认为这是重复的原因?
  • 看过副本了吗?在我看来,您所要求的与建议的副本所做的唯一区别是 where 您正在寻求添加新属性的记录...
  • 我的观点完全正确;)。有几个不同,
  • 同样的技术也可以。在您的情况下,“计算”值是数据来自的文件名,您只需将该值 放在 之前的 * 中 Select-Object。阅读并理解;如果你只是盲目地接受你不理解的代码作为答案,你怎么知道它不是恶意的?

标签: powershell command-line


【解决方案1】:

我认为您缺少列标题名称。看看副本(或原件,更确切地说),看看谢伊的回答。你的Select-Object 应该是这样的:

$CSV | Select-Object @{Name='FileName';Expression={"$filename"}},* | Export-Csv -Path $FileName -NoTypeInformation -Delimiter ','

当逐字使用其余示例代码时,在一个目录中有多个 CSV 对我来说效果很好。

【讨论】:

    【解决方案2】:

    如果您的文件没有标题并且列数未知或不可预测,您可以使用Get-Content 读取每一行,进行更改,然后使用Set-Content 进行更新。

    Get-ChildItem *.csv | ForEach-Object {
        $Filename = $_.Name
        $Fullname = $_.FullName
        $contents = Get-Content -Path $Fullname | Foreach-Object {
            "{0}, {1}" -f $Filename,$_
        }
        $contents | Set-Content -Path $Fullname
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多