powershell - 将一列复制到另一列
问题描述
我有两个 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
假设我想复制colB
到col3
,所以我的第一个数组应该包含:
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循环之外,是否有任何简单的方法可以将一列的内容复制到另一列?
解决方案
有一种方法可以使用 .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
推荐阅读
- c# - Azure Function 中的 DI 使用 Simple Injector
- javascript - 如何使用javascript中的价格和数量之和创建一个包含唯一对象的新对象数组
- java - Android Studio:Firestore:RecyclerView 未显示和错误
- azure - 如果我有基于 CSP 的订阅,如何使用 REST API 从 Azure 获取公共价目表?
- prometheus - Prometheus - JMX:为什么 Prometheus 不通过 JMX 端口提取信息,而不是要求在目标系统上安装 Jar?
- ruby-on-rails - 我需要当前用户仅查看他的待办事项列表并收到错误:nil:NilClass 的未定义方法“列表”
- powershell - Win10 无法连接 Powershell Azure AD 模块
- pandas - 在 Pandas Dataframe 中提取特定键值对的值
- python - Celery 与rabbitmq 通讯不稳定
- mongodb - 仅当文档比 MongoDB 中的新文档旧时,我如何才能更新插入?