首页 > 解决方案 > 将一列复制到另一列

问题描述

我有两个 csv 文件,我想按以下方式合并它们。两个文件的行数相同。我想用第二个文件中第 j 列的内容替换第一个文件中第 i 列的内容。

这是一个简短的例子。第一个文件包含:

col0 col1 col2 col3
0 1 2 3
1 2 3 4
2 3 4 5

第二个文件包含:

colA colB
4 5 
5 6
6 7

假设我想复制colBcol3,所以我的第一个数组应该包含:

col0 col1 col2 col3
0 1 2 5
1 2 3 6
2 3 4 7

让我们调用 first tabletable_1和 second table table_2

$table_1 = Import-Csv -Delimiter " " -Path .\file1.csv
$table_2 = Import-Csv -Delimiter " " -Path .\file2.csv

# `$table_1.col3 = $table_2.colB` # -> error
`$table_2.colB.CopyTo($table_1.col3,0)` # -> no error, does nothing

$table_1| Export-Csv -Path .\file1.csv -Delimiter " " -Encoding Oem -NoTypeInformation

除了执行基于索引的显式for循环之外,是否有任何简单的方法可以将一列的内容复制到另一列?

标签: powershell

解决方案


有一种方法可以使用 .Net 的“Zip”方法。

直接用的话,就很难读成这样了,

[Linq.Enumerable]::Zip($table_1, $table_2, [Func[Object, Object, Object]]{ param($t1, $t2) $t1.col3 = $t2.colB })

所以你最好用一个函数包装它并使用它。

function zip ($obj1, $obj2, $rs) { [Linq.Enumerable]::Zip($obj1, $obj2, [Func[Object, Object, Object]]$rs) }

$table_1 = Import-Csv -Delimiter " " -Path .\file1.csv
$table_2 = Import-Csv -Delimiter " " -Path .\file2.csv

zip $table_1 $table_2 { param($t1, $t2) $t1.col3 = $t2.colB }

$table_1 | Export-Csv -Path .\file1.csv -Delimiter " " -Encoding Oem -NoTypeInformation

推荐阅读