問題的新變量,有人問是編輯後審的方法PowerShell的:從一個CSV到另一個CSV變量與和創建基於該
回答
ConnorLSW's helpful answer效果很好,但你可以簡化爲一個單一的Select-Object
呼叫定義計算財產,這也執行得更好:
$file1Objects = Import-Csv .\file1.csv -Delimiter "`t"
$file2Objects = Import-Csv .\file2.csv -Delimiter "`t"
$decoratedFile1Objects = $file1Objects | Select-Object *,
@{ n='Patched'; e={ ('No', 'Yes')[$file2Objects.CommanName -contains $_.CommanName] } }
Get-Help -Detailed Select-Object
簡要介紹了計算性能是如何工作的;有關更詳細的解釋,請參閱我的this answer。
注意使用成語(<choice-A>, <choice-B>)[<Boolean-Test>]
的用於基於布爾測試的結果的兩個選擇之一:
('No', 'Yes')
是一個字符串陣列具有元素No
(指數0
)和Yes
(索引1
)。$file2Objects.CommanName -contains $_.CommanName
是,在一個數組索引([...]
)的上下文中使用時被強制轉換爲布爾表達式要麼0
(如果$False
)或1
(如果$True
)。換句話說:
- 如果布爾表達式返回
$False
,索引0
被使用,導致串No
。 - 如果布爾表達式返回
$True
,則使用索引1
,從而產生字符串Yes
。
- 如果布爾表達式返回
注意,這種方法是解決方法對PowerShell的缺乏三元條件語句其他語言,如C#,已經和其中的分支指定的順序是逆轉:
- C#僞代碼:
<Boolean-Test> ? "Yes" : "No"
- PowerShell的解決方法:
('No', 'Yes')[<Boolean-Test>]
- 除了分支/選擇的排序之外,還有另一個重要的區別:如果您的數組元素是命令/表達式,那麼他們是所有評估,無論選擇哪一個(無短路)。
- 有一個出色的feature request for ternary conditionals。
- C#僞代碼:
至於你試過:
你嵌套foreach
-loop方法:
- 爲未 -patched不創建的輸出對象行
- ,併爲修補行創建一個新的對象,其只有屬性是新的。
下面的代碼解決這些問題,再次依靠Select-Object
添加新的屬性:
$decoratedFile1Objects = foreach ($f1 in $file1) {
# Add property and default to 'No'
$f1Decorated = Select-Object -InputObject $f1 *, @{ n='Patched'; e={ 'No' } }
foreach($f2 in $file2) {
if ($f1.CommanName -eq $f2.CommanName) {
# Match found: set property to 'Yes' and exit the inner loop
$f1Decorated.Patched = 'Yes'
break
}
}
$f1Decorated # Output the decorated object.
}
然而,使用PowerShell的-contains
和-in
陣列成員測試運營商的不僅是方便多了,但也表現更好。
@AtulD:很高興聽到它。爲了清楚起見,我添加了一個類似於'$ all = ...'的變量賦值。 – mklement0
您的CSV文件格式不正確,所以我可以「T可以肯定,如果這是你所需要的東西,但是這個應該指向你在正確的方向:
$File1 = Import-Csv .\file1.csv -Delimiter "`t"
$File2 = Import-Csv .\file2.csv -Delimiter "`t"
$NewFile1 = $File1 | % {
$Obj = [PSCustomObject]$_
$Obj | Add-Member -Mem NoteProperty -Name Patched -Value ([bool]($_.CommanName -in $File2.CommanName))
return $Obj
}
$NewFile1
將輸出
Server HotfixID CommanName Patched
------ -------- ---------- -------
apdk778 kb3333 apdk778 kb3333 True
apdk778 yn2919 apdk778 yn2919 True
apdk778 lk4898 apdk778 lk4898 True
iijka211 kb3333 iijka211 kb3333 False
iijka211 yn2919 iijka211 yn2919 True
iijka211 lk4898 iijka211 lk4898 True
我更換了前兩個集空格與選項卡爲了讀取CSV文件。
這是否會檢查給定的'服務器',或只是'CommanName'跨所有服務器?我認爲你必須過濾掉'$ File2'的一個子集,例如'$ serverDetails = $ File2 | Where-Object {$ _。Server -eq $ Obj.Server}'。欣賞這個不清楚的問題 – gms0ulman
@ gms0ulman他已經包含了一個包含服務器名稱和更新的列 - 我想 - 如果我錯了關於Csv格式,我可以用雙循環解決方案更新,我想這個對他來說沒問題。 – ConnorLSW
好點,我錯過了'CommanName'是另外兩列合起來的。 – gms0ulman
- 1. 創建一個從CSV
- 2. 從NSMutableArray創建一個csv
- 3. 基於另一個變量的增量創建變量
- 4. 基於另一個csv中的另一個值在csv列中寫入值
- 5. 從另一個csv文件中創建一個新的csv文件
- 6. Powershell - 基於CSV文件更改變量
- 7. 連接多個變量/ CSV格式和出口爲一個CSV文件Powershell的
- 8. 從csv插入一個值到另一個csv,使用python
- 9. 從一個CSV文件添加列到另一個CSV文件
- 10. 建立一個CSV與4列和2個變量
- 11. CSV與另一個POJO POJO
- 12. 從CSV創建變量
- 13. 從CSV創建變量
- 14. 如何從另一個變量的值創建一個變量
- 15. JMeter:無法將CSV變量複製到另一個變量中
- 16. 簡單PowerShell腳本,通過1個CSV文件循環創建從另一個
- 17. 將cmdlet輸出和另一個變量發送到CSV文件
- 18. 創建從一個大的CSV
- 19. 使用變量創建一個CSV文件名和路徑
- 20. 創建一個CSV文件
- 21. 使用python從另一個.csv填充一個.csv文件
- 22. 通過從另一個csv中提取值附加一個csv
- 23. 從.csv創建一個共現矩陣
- 24. Tensorflow從csv創建一個tfrecords文件
- 25. 基於另一個變量的基於變量的Python參考
- 26. 一個CSV內容添加到另一個CSV
- 27. 基於另一個值中的值從一個CSV中提取值
- 28. 基於另一個列表從csv文件生成子表格
- 29. Jmeter:從csv讀取變量並將其傳遞到另一個變量中
- 30. 基於另一個變量增加一個變量
您的所有csv文件都無法工作,您能否更新它們以逗號或製表符分隔,以便我們可以確切地看到您要讀取的內容? – ConnorLSW