合并两个CSV文件

合并两个CSV文件,csv,powershell,powershell-2.0,export-to-csv,Csv,Powershell,Powershell 2.0,Export To Csv,我想合并两个CSV文件,其中有相同的头到一个CSV文件。 我有两个如下所示的文件,即DevData.csv和ProdData.csv,它们具有相同的cfname和不同的IDs ID cfname -------------------- ----------------------------------- 10201 Risk ID 10202 Issue ID

我想合并两个CSV文件,其中有相同的头到一个CSV文件。 我有两个如下所示的文件,即
DevData.csv
ProdData.csv
,它们具有相同的
cfname
和不同的
ID
s

ID cfname -------------------- ----------------------------------- 10201 Risk ID 10202 Issue ID 10203 Dependency ID 10204 Server ID 10205 Parent Application ID 10206 Application Service ID 10207 Application Supportability 10208 Application Compatibility 10300 Application Status 10301 Contact ID Type 2 10302 Contact ID Type 3 10303 Contact ID Type 4 10304 Business Service Manager 10308 Server Location Name: 10309 Rack Position: 10310 Rack Number: 10311 Data Centre 10312 Server Group (14 rows affected) 您可以在这两个集合上执行嵌套的foreach循环,但这两个集合可以避免执行时间相对于输入大小呈指数增长,更好的策略是将一个集合加载到哈希表中(使用公共属性
cfname
作为键),然后在另一个集合上循环并连接这两个集合:

$DevData = @'
ID,cfname
10201,Risk ID
10202,Issue ID
10203,Dependency ID
10204,Server ID
10205,Parent Application ID
10206,Application Service ID
10207,Application Supportability
10208,Application Compatibility
10300,Application Status
10301,Contact ID Type 2
10302,Contact ID Type 3
10303,Contact ID Type 4
10304,Business Service Manager
10308,Server Location Name:
10309,Rack Position:
10310,Rack Number:
10311,Data Centre
10312,Server Group
'@ |ConvertFrom-Csv

$ProdData = @'
ID,cfname
201,Risk ID
202,Issue ID
203,Dependency ID
204,Server ID
205,Parent Application ID
206,Application Service ID
207,Application Supportability
208,Application Compatibility
209,Application Status
210,Contact ID Type 2
211,Contact ID Type 3
212,Contact ID Type 4
213,Business Service Manager
214,Server Location Name:
'@ |ConvertFrom-Csv

# throw one set into a hashtable
# we can use this as a lookup table for the other set
$ProdTable = @{}
foreach($line in $ProdData){
    $ProdTable[$line.cfname] = $line.ID
}

# Output the DevData with the appropriate ProdData value
$DevData |Select-Object @{Label='DevID';Expression={$_.ID}},@{Label='ProdID';Expression={$ProdTable[$_.cfname]}},cfname |Export-Csv .\new.csv -NoTypeInformation

您可以尝试以下简单的命令管道:

Out-file -FilePath '.\csv3.csv' -InputObject "ProdID,ID,cfname"; ForEach($CFName In $Csv1) { $Csv2.Where({$_.cfname -eq $CFName.cfname}) | %{ "$($_.ProdID),$($CFName.ID),$($_.cfName)" } | Out-File .\csv3.csv -Append}

其中,我假设Csv1.csv是第一个具有ID和cfname列的文件,第二个文件Csv2.csv具有ProdID和cfname列。这将生成包含合并内容的第三个文件csv3.csv,因为您要从SQL Server导出数据,需要添加参数
-W
-s“,”
,以便命令创建实际的csv输出:

sqlcmd -S server -d db -E -Q "query" -W -s"," -o output.csv
一旦您拥有实际的CSV文件,您就可以这样处理它们:

# create a hashtable from the second CSV, so you can look up IDs by the
# values in the "cfname" column
$proddata = @{}
Import-Csv 'C:\path\to\ProdData.csv' | ForEach-Object {
  $proddata[$_.cfname] = $_.ID
}

Import-Csv 'C:\path\to\DevData.csv' |
  Select-Object @{n='DevID';e={$_.ID}},
                @{n='ProdID';e={$proddata[$_.cfname}}, cfname |
  Export-Csv 'C:\path\to\merged.csv'

这假定您的
ProdData.csv
仅包含同样出现在
DevData.csv
中的
cfname
值,并且您的
cfname
值至少在
ProdData.csv
中是唯一的。双向合并更加复杂,因为您需要检查
$proddata
中的whick键在
DevData.csv
中不存在,并相应地追加它们。如果您的
cfname
值不唯一,您将无法对齐记录。

“两个csv文件,具有相同的标题”-但是
ID、cfname
DevID、ProdID、cfname
不相同?DevID和ProdID将出现在输出csv文件中。我对开发(创建Devdata.csv)和生产执行了相同的查询(创建Proddata.csv)db,该db创建具有不同ID的相同输出。因此,我想将这两个文件与ProdID、DevID和cfname合并为最终输出csv文件的标题。您需要添加标题。
import csv-path“.csv”-Header-DevID、ProdID、Cfname
和merge-two-csv
$merged=$csv1+$csv2$merged | Select-Property*-Unique
您的输入数据看起来像数据库查询(DB2?)的输出,而不像实际的csv(逗号分隔的值)。您需要编写自己的解析器来处理该问题。此外,您尝试做的不是串联(将文件B附加到文件A),而是合并文件(或以数据库术语“连接”)。如果您正在使用数据库,最好在数据库中执行联接,然后将结果导出到CSV。如果不可能,您需要通过匹配
cfname
值从文件B添加ID的代码。哈希表查找是实现这一点的常用方法。或者有没有任何方法可以以正确的CSV格式获得结果?请遵循ing是我用来从数据库sqlcmd-S-d JIRAD-E-Q“从[JIRAD].[dbo].[customfield]中选择[ID],[cfname],其中[CUSTOMFIELDTYPEKEY]='com.valiantys.jira.plugins.SQLFeed:com.valiantys.jira.plugins.SQLFeed.customfield.type'”输出文件“C:\Users\d-test\Desktop\data2.csv”它在output.csv文件
Sqlcmd:''“'中打印以下错误:意外参数。请输入'-?'以获取帮助。
这看起来像一个排版引号。不要在代码中使用它们。这很有效。非常感谢:)还有一件事,因为创建的csv文件是csv(Macintosh)格式的。我希望它是CSV格式的(逗号dilimited)。是否有任何参数以逗号dilimited格式获取它?谢谢@Mathias。如果我像您提到的那样将CSV数据复制粘贴到变量中,这会非常好,但在执行导入CSV时不会。我不能一直复制粘贴数据,是否有任何方法可以使用导入csv实现相同的效果?@Supriya如果csv文件的内容与我的示例中的字符串相同,则导入csv的输出将与您从上面的
ConvertFrom csv
中看到的相同
sqlcmd -S server -d db -E -Q "query" -W -s"," -o output.csv
# create a hashtable from the second CSV, so you can look up IDs by the
# values in the "cfname" column
$proddata = @{}
Import-Csv 'C:\path\to\ProdData.csv' | ForEach-Object {
  $proddata[$_.cfname] = $_.ID
}

Import-Csv 'C:\path\to\DevData.csv' |
  Select-Object @{n='DevID';e={$_.ID}},
                @{n='ProdID';e={$proddata[$_.cfname}}, cfname |
  Export-Csv 'C:\path\to\merged.csv'