【问题标题】:Copying header from one csv to another, for multiple files将标题从一个csv复制到另一个,用于多个文件
【发布时间】:2021-09-01 18:32:27
【问题描述】:

我对任何类型的脚本都很陌生,所以真的不知道该怎么做,但我想知道是否有一个脚本可以获取 CSV 的第一行/标题,并将其放在顶部一个不同的。

我有两个不同的文件夹,看起来像这样,

newcsv1.csv
newcsv2.csv
newcsv3.csv

文件夹一,文件夹二的样子,

oldcsv1.csv
oldcsv2.csv
oldcsv3.csv

问题是,文件夹一中的所有文件都没有标题,并且它们应该具有的标题位于旧 CSV 文件夹中的文件上。有没有办法从旧的 CSV 文件中取出标题行,并将其放在新 CSV 文件的第一行?一直在列表中?

newcsv1.csvoldcsv1.csv中的数据布局相同,只是更新了数据。这对于这两个文件夹中的所有其他文件仍然适用。

不太确定这是否清楚,但我很感激任何和所有的答案。

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    为简单起见,以下假设:

    • 您的文件夹包含相同数量的 CSV 文件
    • 并且这些文件由Get-ChildItem按相应顺序报告;也就是说,old-files 文件夹中的第一个文件包含 new-files 文件夹中第一个文件的标题,依此类推。

    注意事项

    • 该命令更新目标 CSV 文件;为了安全起见,请先备份原件。
    • PowerShell 从不保留输入文件的字符编码;在输出到文件时,应用相应 cmdlet 的默认字符编码;使用-Encoding参数控制输出编码,如下图。
    # Set the directory paths to the old and new files; adjust as needed.
    $oldFolder = 'C:\path\to\old'
    $newFolder = 'C:\path\to\new'
    
    # Get the full file paths of the old and new CSV files.
    $oldCSVs = (Get-ChildItem $oldFolder\*.csv).FullName
    $newCSVs = (Get-ChildItem $newFolder\*.csv).FullName
    
    # Loop over the file-path pairs.
    foreach ($i in 0..($newCSVs.Count-1)) {
      # Extract the old CSV's header, and the new CSV's content,
      # then write them in sequence back to the new CSV file.
      # Adjust -Encoding as needed.
      Set-Content $newCSVs[$i] -NoNewline -Encoding utf8 -Value `
        ((Get-Content -TotalCount 1 $oldCSVs[$i]) + 
         [Environment]::NewLine + 
         (Get-Content -Raw $newCSVs[$i]))
    }
    
    • (Get-Content -TotalCount 1 $oldCSVs[$i]) 从旧的 CSV 获取标题行。

    • (Get-Content -Raw $newCSVs[$i]) 将新 CSV 的内容作为单个多行字符串完整加载到内存中。

    • Set-Content ... -NoNewLine ... 将标题行和新内容保存回新文件。

    以上假设每个新的 CSV 文件都足够小以适合整个内存,这允许使用Get-Content-Raw 开关,从而大大加快处理速度。

    如果文件太大,管道中的流式 PowerShell 解决方案是可能的,但可能太慢;请参阅this answer 的中间部分了解流式解决方案,并参阅底部部分了解使用 .NET API 的快速解决方案。

    【讨论】:

    • 我对此有一个奇怪的问题。我知道我之前说过它可以工作,但是脚本似乎将标题放在第一行的 NEXT 上,而不是放在它的顶部。任何帮助将不胜感激并感谢咖啡哈哈。例如,它将获取标题,并将其放在第一行数据的前面,这会将第 1 行向右移动并在其左侧有标题。
    • @eharper,我的错:我忘记了 -NoNewLine 不仅抑制 trailing 换行符,而且还抑制 between 多个输入字符串,因此您的症状。请看我的更新,它现在构造了一个 single 输出字符串,在标题和其余部分之间有一个明确的换行符。
    • 哥们,你太棒了。你帮了大忙!
    • 很高兴听到这个消息,@eharper;我的荣幸。
    猜你喜欢
    • 2015-11-21
    • 2022-01-04
    • 2018-09-29
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多