2017-04-18 44 views
1

一切我在網上看了說,進口CSV創建一個數組,如果是這樣的話,那麼這兩個命令創建兩個單獨的數組:手工定義陣列與進口-CSV

$file1 = @(import-csv -Path "C:\FileInfo\Fileslocal.csv") 
$file2 = @(import-csv -Path "C:\FileInfo\Files.csv") 

而且這兩個命令來創建數組:

$a = @("Scott","Angela","Mike") 
$B = @("Scott","Robert","Angela") 

然而,當我這樣做

$b | Where {$a -NotContains $_} 

我得到Robert爲r E打開

但是當我做

$file2 | Where {$file1 -NotContains $_} 

我沒有得到任何回報。

+5

'Import-CSV'會創建一個'[object]'的數組,其中'$ a'是一個字符串數組。你有列標題嗎?如果列標題是'Name',那麼'$ file2 |例如,其中{$ file1.Name -NotContains $ _。Name}。如果你沒有標題,假設第一行是一個,除非你再加上'-Header Name' ..例如。您將蘋果與略有不同的蘋果進行比較,但有一個重要區別。 – Matt

+0

還有更多的可能解釋,但我們沒有看到你的任何文件中的數據,所以我只是覆蓋幾條途徑。 – Matt

+0

其實我正在使用添加列名稱的一個修復程序運行腳本,並且似乎解決了問題 – scripter78

回答

1

你不會顯示你的文件的內容,而是來自評論和假設,我們將說他們包含一個帶有列標題的文件名列表。所以看看你正在比較的兩種數據類型。

我們有你定義的字符串數組$a$b。然後你有$file1$file1,其中Import-CSV。看着MSDN Import-CSV ...

創建表樣自定義對象從一個CSV文件的項目

雖然它們共享相似的屬性,但它們實際上是不同類型的對象。如果您使用Get-Member查看$file1的成員,您會看到每列的NoteProperty。

現在來到你的代碼

$file2 | Where {$file1 -NotContains $_} 

我本來以爲你會得到東西回雖然你想不是。如果您要比較CSV對象中的列,則應在邏輯中使用列名稱

$file2 | Where {$file1.Name -NotContains $_.Name} 

這將在$file1


返回所有「行」的$file2其中$文件2的name是不是在name是清單沒有考慮太多細節這種類型的比較邏輯還有其他選擇。

  • Get-Content只要閱讀他們,並跳過第一行,如果它有Select-Object -Skip 1
  • 頭考慮Compare-Object。雖然它被認爲是一個性能豬,它應該適用於較小的數據集。
  • 將列表導入爲哈希表,它打開了更多比較選項,這些選項對性能友好,但可能不會出現那麼簡單。