将一列复制到另一列

时间:2019-03-07 15:12:11

标签: powershell

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

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

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

让我们调用第一个表table_1和第二个表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循环之外,是否有一种简便的方法可以将一列的内容复制到另一列?

1 个答案:

答案 0 :(得分:2)

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

如果直接使用它,将很难像这样阅读

class IsTerm a where
  type TermType a :: *
instance IsTerm Lit where
  type TermType Lit = Int
instance IsTerm a => IsTerm (Inc a) where
  type TermType (Inc a) = TermType a

class IsTerm a => Eval a   
  where eval :: a -> Term (TermType a) 

instance Eval Lit  where    
         eval (Lit i) = ToTerm i

-- needs UndecidableInstances
instance (Eval a, Num (TermType a)) => Eval (Inc a)  where    
         eval (Inc i) = ToTerm (fromTerm (eval i) + 1)

因此,最好将其包装成一个函数并使用它。

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