gpt4 book ai didi

powershell - 合并多个 CSV 文件

转载 作者:行者123 更新时间:2023-12-02 23:47:04 27 4
gpt4 key购买 nike

所以我整天都在上网寻找一种组合多个 CSV 文件的方法。无论我查找过 30 多种 PowerShell 方法中的哪一种,我都会遇到问题。

我正在尝试将多个 CSV 文件合并为一个,基本上采用“完全连接”样式。我需要将所有 CSV 中的所有行和所有列组合在一起,但我想基于一个通用标识符组合行。这个讨论:“Merging two CSV files by shared column”,完全符合我的预期,但有两个异常(exception)。首先,它只为两个 CSV 构建,其次,如果两个 CSV 都不包含“名称”,它会删除行。我想保留该行,即使它不在两个 CSV 中,只需在另一个 CSV 中没有数据的地方创建空白条目。

CSV1.csv

Name,Attrib1,Attrib2

VM1,111,True
VM2,222,False

CSV2.csv
Name,AttribA,Attrib1

VM1,AAA,111
VM3,CCC,333

CSV3.csv
Name,Attrib2,AttribB

VM2,False,YYY
VM3,True,ZZZ

期望的组合结果:
Name,Attrib1,Attrib2,AttribA,AttribB

VM1,111,True,AAA,
VM2,222,False,,YYY
VM3,333,True,CCC,ZZZ

有人对此有任何想法吗?如果您需要我的更多信息,请告诉我。

更新:这是我当前使用 SQLite shell 的代码尝试:
$db  = Join-Path $env:TEMP 'temp.db'
$dir = "C:\Users\UserName\Downloads\CSV Combination"
$outfile = Join-Path $dir 'combined.csv'

@"
CREATE TABLE a (Name varchar(20),OS varchar(20),IP varchar(20),Contact varchar(20),Application varchar(20));
CREATE TABLE b (Name varchar(20));
CREATE TABLE c (Name varchar(20),Quiesce varchar(20));
CREATE TABLE d (Name varchar(20),NoQuiesce varchar(20));
.mode csv
.import '$((Join-Path $dir csv1.csv) -replace '\\', '\\')' a
.import '$((Join-Path $dir csv2.csv) -replace '\\', '\\')' b
.import '$((Join-Path $dir csv3.csv) -replace '\\', '\\')' c
.import '$((Join-Path $dir csv4.csv) -replace '\\', '\\')' d
SELECT a.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce
FROM a
LEFT OUTER JOIN b ON a.Name = b.Name
LEFT OUTER JOIN c ON a.Name = c.Name
LEFT OUTER JOIN d ON a.Name = d.Name
UNION
SELECT b.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce
FROM b
LEFT OUTER JOIN a ON a.Name = b.Name
LEFT OUTER JOIN c ON b.Name = c.Name
LEFT OUTER JOIN d ON c.Name = d.Name
UNION
SELECT c.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce
FROM c
LEFT OUTER JOIN a ON a.Name = c.Name
LEFT OUTER JOIN b ON b.Name = c.Name
LEFT OUTER JOIN d ON c.Name = d.Name;
"@ | filesystem::"C:\Users\UserName\Downloads\CSV Combination\sqlite3.exe" $db >$outfile

Remove-Item $db

这当前返回以下错误消息:

sqlite3.exe:错误:C:\Users\brandon.andritsch\Downloads\CSV Combination\csv1.csv 第 1 行:预期 5 列数据,但找到 6

最佳答案

我创建了一个 Join-Object 名为 Merge-Object 的代理命令(别名 Merge )似乎合并对象与 SQL MERGE 略有相似。语句经常被使用。 Merge-Object 的默认参数命令设置为:JoinType = 'Full'Property= {{If ($Null -ne $RightIndex) {$Right.$_} Else {$Left.$_}}}} .这意味着所有左侧对象都使用右侧属性值更新,左侧对象列表中不存在的右侧对象将添加到结果中:

Import-Csv CSV1.csv | 
Merge (Import-Csv CSV2.csv) -On Name |
Merge (Import-Csv CSV3.csv) -On Name |
Format-Table

结果:
Name Attrib1 Attrib2 AttribA AttribB
---- ------- ------- ------- -------
VM1 111 True AAA
VM2 222 False YYY
VM3 333 True CCC ZZZ

关于powershell - 合并多个 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17752072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com