2016-03-22 20 views
0

2つのcsvの比較を使用して1つのCSVにデータを入力しようとしています。データは、2つのcsvの比較結果です。例についてはCSVファイルの比較を使用したCSVの追加

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 

でなければなりません。これは私が持っているものです::

CSV 1は

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

CSV 2は言う言います

私の問題は、もともとあったものをを除いて絶対に何も出力しない比較部

$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

'List of Types'には何も表示されません。しかし、もし私が '$ title.'Typeのリスト="これは空白です "' ... 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

これは優れた答えと説明ですが、私の実際のデータでは機能しません。 2つの違いは、ホストと番号の間にスペースがあることです。 ホストの下のCSV 2に「ホスト2」という単語があった場合、どのようにしてCSV1の 'Host 2'と' Switch 'と言うことができますか? – ShanayL

+0

問題は、あなたのホストに "Host1 random letters Host2"のような項目を使用していることです。これはスペースを区切り文字として意味します。引用符で囲んだもの( 'Host1' 'ランダム' '文字' 'Host2')に置かない限り、その区切り文字を項目で使用することはできません。私はあなたがこのデータをどのように入手しているのか、あなたがそれを使って何をしようとしているのかは分かりませんが、おそらくより良い方法があります。あなたのプロジェクトが求めているもののベストプラクティス(データ構造、デザインパターン、作業サンプルコード)に関するいくつかの調査をお勧めします。 –

関連する問題