2016-03-22 200 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'),否則您不能嘗試在該項目中使用該分隔符。我不知道你是如何得到這些數據的,你打算如何處理這些數據,但可能有更好的方法。建議您針對您的項目要求的最佳實踐(數據結構,設計模式,工作示例代碼)進行一些研究。 –