2016-03-22 124 views
0

我正尝试使用两个csvs的比较将数据输入到一个csv中。数据是两个csvs之间比较的结果。使用CSV文件比较追加CSV

例如:

CSV 1说

Host,Type 
Host1,Server 
Host2,Switch 
Host3,Hub 
Host4,Router 

CSV 2说:

List of Types, Hosts 
       ,Host1 random letters Host2 
       ,random letters Host3 Host2 
       ,Host4 Host3 Host2 

输出应该

List of Types,Hosts 
server switch,Host1 random letters Host2 
hub switch,random letters Host3 Host2 
router hub switch,Host4 Host3 Host2 

这是我有:

我的问题似乎是比较部分

$CSV1 = Import-Csv "Pathname1.csv" 

Foreach ($title in $CSV1) 
{ 
    $Hosts =$title."Hosts" 
    $Type=$title."Type" 
} 

$csv2 = Import-Csv "Pathname2.csv" 

foreach($title in $CSV2) 
{ 
    $Typelist = $title."List of Types" 
    $Hostlist = $title."Hosts" 

    if ($Hostlist -contains $Hosts) 
    { 
    $title.'List of Types'= $Type 
    } 
} 

$csv2 | export-csv "export.csv" 

,输出绝对没有,除了什么最初那里。

+0

你会得到什么样的输出?这通常有关于问题性质的线索。 – Sparky256

+0

“类型列表”下不显示任何内容。但是,如果我做了'$ title.'Lists of Types'=“这是空白的''......用'IF'语句...所有的行都会说'这是空白的' – ShanayL

+0

为什么$ csv1和$ csv2导入相同的文件?另外,你的问题中的csv2的内容格式是如何行和列在你的文件(又名,没有类型)? –

回答

1

您的csv文件对我的组织结构确实没有多大意义,但这并不意味着您的问题无法通过一些思考解决,并学习如何打破问题并逐步通过调试器来获取它加工。

我掀起了一些代码,以提供所需的输出,甚至添加了几行可能有用的调试语句(输出),可以取消注释以查看进度。

CSV1

Host,Type 
Host1,Server 
Host2,Switch 
Host3,Hub 
Host4,Router 

CSV2

List of Types,Hosts 
,Host1 random1 letters1 Host2 
,random2 letters2 Host3 Host2 
,Host4 Host3 Host2 

代码

"-=-=-=-=-=-=-= start" 

$content1 = Get-Content d:\junk\c1.csv 
$data1 = $content1 | ConvertFrom-Csv -Header @('Host','Type') 
"c1====" 
$content1 
"csv1====" 
$data1 | ft 

$content2 = Get-Content d:\junk\c2.csv 
$data2 = $content2 | ConvertFrom-Csv -Header @('Type','Hosts') 
"c2====" 
$content2 
"csv2====" 
$data2 | ft 

#"data====" 
$output = @() 
foreach ($hostList in ($data2.Hosts | select -Skip 1)){ 
    # don't use variable name $host. it is a reserved variable. 
    # see about_Automatic_Variables 
    # https://technet.microsoft.com/en-us/library/hh847768.aspx 
    $subHosts = $hostList -split ' ' 

    #"subhosts====" 
    #$subHosts 

    $types = @() 
    foreach ($subHost in $subHosts) 
    { 
     #$("sh = $subHost") 
     $typeMatch = (($data1 | select -Skip 1) | where {$_.Host -eq $subHost}).Type 

     if ($typeMatch) 
     { 
      $types += $typeMatch 
     } 
    } 
    $types = $types -join ' ' 

    #"types====" 
    #$types 

    $matches = @{} 
    $matches.Add($types, $hostList) 
    $output += $matches 
} 

"final list====" 
$output 

"-=-=-=-=-=-=-=- end" 

输出

-=-=-=-=-=-=-= start 
c1==== 
Host,Type 
Host1,Server 
Host2,Switch 
Host3,Hub 
Host4,Router 
csv1==== 

Host Type 
---- ---- 
Host Type 
Host1 Server 
Host2 Switch 
Host3 Hub 
Host4 Router 

c2==== 
List of Types,Hosts 
,Host1 random1 letters1 Host2 
,random2 letters2 Host3 Host2 
,Host4 Host3 Host2 
csv2==== 

Type   Hosts      
----   -----      
List of Types Hosts      
       Host1 random1 letters1 Host2 
       random2 letters2 Host3 Host2 
       Host4 Host3 Host2   

final list==== 

Name    Value      
----    -----      
Server Switch  Host1 random1 letters1 Host2 
Hub Switch  random2 letters2 Host3 Host2 
Router Hub Switch Host4 Host3 Host2   
-=-=-=-=-=-=-=- end 
+0

然而,这是一个很好的答案和解释,它不适用于我的实际数据。两者的区别在于我的主机和号码之间有空格。 如果我在Hosts下的CSV 2中有'Host 2'这个词,我该如何匹配让我们说CSV1中的'Host 2'和'Switch'。 – ShanayL

+0

问题是,您正在使用诸如“Host1随机字母Host2”之类的项目作为主机,这意味着将空格作为分隔符。例如,除非将其放在引号或其他类似内容中(例如,'Host1''随机''字母''Host2'),否则您不能尝试在该项目中使用该分隔符。我不知道你是如何得到这些数据的,你打算如何处理这些数据,但可能有更好的方法。建议您针对您的项目要求的最佳实践(数据结构,设计模式,工作示例代码)进行一些研究。 –