2016-03-22 35 views
0

İki csvs'in bir karşılaştırmasını kullanarak verileri bir csv'ye girmeye çalışıyorum. Veriler, iki csvs arasındaki karşılaştırmanın bir sonucudur. Örnek içinCSV Dosyalarının Karşılaştırmalarını Kullanarak CSV Ekleme

: Bu benim ne var

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

çıkış

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

olmalıdır:

CSV 1

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

CSV 2 diyor diyor

Benim sorunum aslen orada ne haricinde hiçbir şey verir karşılaştırma bölümü

$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" 

gibi görünüyor.

+0

Ne tür bir çıktı alıyorsunuz? Bu genellikle sorunun doğası hakkında bir ipucu verir. – Sparky256

+0

"Türlerin Listesi" altında hiçbir şey görünmüyor. Ancak, '$ title.'List Türleri' = "Bu boştur" '... 'IF' ifadesiyle ... yaparsanız, tüm satırlar' Bu boş ' – ShanayL

+0

diyeceksiniz, $ csv1 neden ve csv2 aynı dosyayı içe aktarıyor? Ayrıca, sorgunuzdaki csv2 içeriğiniz dosya ve sütunların dosyanızda tam olarak nasıl biçimlendirildiğini (aka, no type) mı? –

cevap

1

Csv dosyalarınız gerçekten nasıl organize olduklarıyla ilgili olarak bana pek bir anlam ifade etmiyor, ancak bu sizin probleminizin bazı düşüncelerle çözülemeyeceği anlamına gelmiyor ve sorununuzu nasıl aşacağınızı öğrenmek ve hata ayıklayıcısını adım adım öğrenmek için Çalışma.

İstenen çıktıyı vermek için bazı kodları çırptım ve hatta ilerlemeyi görememek için birkaç tane olası yararlı hata ayıklama deyimi (çıktı) ekledim.

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 

Kod

"-=-=-=-=-=-=-= 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" 

Çıktı

-=-=-=-=-=-=-= 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

Bu mükemmel bir cevap ve açıklama olsa da, gerçek verilerimle çalışmıyor. İkisi arasındaki fark, Host'um ile numara arasında boşluklarım var. Eşleştirmelerde, Host 2'de CSV 2'de "Host 2" kelimesi olsaydı, CSV1'de "Host 2" ve "Switch" ifadeleriyle eşleştirebilirim. – ShanayL

+0

Sorun, ana makineleriniz için "Host1 random letters Host2" gibi öğeleri kullanmanızdır; bu, alanı sınırlayıcı olarak gösterir. Örneğin, bu sınırlayıcıyı bir öğede kullanamazsınız, örneğin tırnak içine koymadıkça veya bunun gibi bir şey ('Host1' 'random' 'letters' 'Host2'). Bu verileri nasıl aldığınızı bilmiyorum, bununla ne yapmayı düşünüyorsunuz, ama muhtemelen daha iyi bir yol var. Projenizi ne için çağırıyor olursanız olun, en iyi uygulamalar (veri yapısı, tasarım örüntüleri, çalışma örnek kodu) hakkında bazı araştırmalar yapmanızı öneririz. –