返回

PowerShell:如何将列添加到 CSV 文件末尾?

windows

PowerShell: 将列添加到 CSV 文件末尾

问题

有时需要将一列数据(例如创建日期)添加到 CSV 文件中,但不是在开头,而是在结尾。本文将提供一个 PowerShell 解决方案来解决这个问题。

解决方案

Get-ChildItem . -Recurse -File -Filter *.txt -Exclude merged.csv -PipelineVariable csv |
ForEach-Object FullName | # parameter binding problem otherwise...
Import-Csv |
Select-Object @{Name='Filename';Expression={$csv.Name}},@{Name='Timestamp';Expression={$csv.LastWriteTime.ToString('s')}} |
Export-Csv -Append -Path merged.csv

步骤分解

1. 获取 CSV 文件

Get-ChildItem . -Recurse -File -Filter *.txt -Exclude merged.csv -PipelineVariable csv

这将获取当前目录及其子目录中所有 TXT 文件(排除 merged.csv),并将其存储在 $csv 变量中。

2. 导入 CSV 文件

ForEach-Object FullName | Import-Csv

这会逐个导入 CSV 文件,并将其转换为 CSV 对象。

3. 选择列

Select-Object @{Name='Filename';Expression={$csv.Name}},@{Name='Timestamp';Expression={$csv.LastWriteTime.ToString('s')}}

这会选择 FilenameTimestamp 列。Timestamp 列从文件的最后写入时间派生。

4. 导出 CSV 文件

Export-Csv -Append -Path merged.csv

这会将选定的列导出到合并的 CSV 文件(merged.csv),并追加到现有数据中。

附加说明

  • 确保合并的 CSV 文件已关闭,否则导出将失败。
  • 创建日期已转换为“s”格式,表示秒。你可以根据需要调整格式。
  • 对于大文件,使用 Export-Csv 的 -NoTypeInformation 参数可以提高性能。

常见问题解答

  1. 如何将列添加到 CSV 文件开头?

    相反,使用以下表达式:@{Name='Timestamp';Expression={$csv.LastWriteTime.ToString('s')}},@{Name='Filename';Expression={$csv.Name}}

  2. 如何将列添加到特定位置?

    使用 Insert-Column cmdlet 指定插入位置。

  3. 如何获取文件的最后访问时间?

    使用 $csv.LastAccessTime.ToString('s')

  4. 如何选择特定文件进行添加?

    使用 Where-Object 筛选器,例如 Where-Object Name -eq 'myfile.csv'

  5. 我可以使用其他格式导出创建日期吗?

    是的,可以使用 ToString() 方法指定格式,例如 ToString('MMMM d, yyyy')

结论

通过使用 PowerShell 中的管道命令,我们可以轻松地将列添加到 CSV 文件的末尾。这对于各种数据处理场景非常有用,例如日志分析或数据聚合。我们希望本文提供的解决方案能够满足你的需求,并帮助你提高处理 CSV 文件的效率。