2013-04-16 5 views
5

के रूप में मैं Powershell नौसिखिया हूँ सबसे अच्छा अभ्यास पर मदद के लिए देख रहे हैं,powershell फिल्टर सीएसवी

मैं एक csv फ़ाइल है और मैं युक्त "स्थापित नहीं"

पंक्तियों के अलावा csv में प्रत्येक पंक्ति को फ़िल्टर करना चाहते हैं

मैं फिर उन परिणामों को एक अलग सीएसवी फाइलों के खिलाफ फ़िल्टर करना चाहता हूं जो कंप्यूटर की एक सूची में आवास रखते हैं और किसी भी पंक्ति वाली किसी भी पंक्ति को बहिष्कृत करते हैं।

कोई भी मदद या शुरुआती बिंदु की सराहना की जाएगी!

उत्तर

5

पहले भाग के लिए, आप उपयोग कर सकते हैं Select-String -Notmatch ... जैसे:

$file = "data.csv" 
$csv = Get-Content $file 
$csv | Select-String -Notmatch 'Not Installed' | Out-File $file -Enc ascii 

अपनी CSV फ़ाइल यूनिकोड होने वाला है, तो "-Enc ascii" भाग बाहर फ़ाइल के लिए डिफ़ॉल्ट के बाद से हटाने यूनिकोड है। आपके प्रश्न के दूसरे भाग के लिए, आपको थोड़ी अधिक विशिष्ट होने की आवश्यकता होगी। हालांकि, अगर आप आयात-csv और निर्यात-Csv पर मदद पर गौर करना चाहिए:

man Import-Csv -full 
man Export-Csv -full 
+0

यह वास्तव में बहुत अच्छी तरह से काम करता है। मेरे पास पहले समान आदेश थे लेकिन एएनसीसी एसीआईआई निर्दिष्ट नहीं किया गया था, इसलिए यह मुझे अवांछित परिणाम खेलता है। दूसरे भाग को नई डेटा.csv फ़ाइल की तुलना किसी अन्य सीएसवी सूची से करने की आवश्यकता है जिसमें बहिष्करण किए जाने वाले बहिष्करण हैं। उपर्युक्त आदेश शायद काम करेगा, शायद मैं बहिष्करण सूची को केवल सरणी में प्राप्त कर सकता हूं और $ बहिष्करण 'इंस्टॉल नहीं किया गया' बदल सकता हूं? – user2284702

+1

यदि आप दोनों CSV फ़ाइलों को खींचने के लिए आयात-सीएसवी का उपयोग करते हैं, तो आप ऑब्जेक्ट्स की एक सरणी के साथ हवाएं करते हैं जहां प्रत्येक ऑब्जेक्ट में CSV फ़ाइल में फ़ील्ड से संबंधित गुण होते हैं। तो आप इस '$ importedCsv1 की तरह कुछ कर सकते हैं जहां {$ csv1Field = $ _ फ़ील्ड; ($ importedCsv2 | कहां {$ _। फ़िल्टरफिल्ड -एक $ csv1 फ़ील्ड})। गणना -eq 0} ' –

+0

$ csv | सिलेक्ट-स्ट्रिंग-नॉटमैच $ बहिष्करण | आउट-फ़ाइल $ होस्ट -Enc ascii data.csv फ़ाइल से सभी बहिष्करण को हटाने के लिए काम करता है लेकिन यह हटाए गए प्रत्येक मैच के लिए शीर्ष पर एक खाली पंक्ति छोड़ देता है। कोई विचार? – user2284702

3

get-help *csv*

get-help import-csv -examples

उदाहरण csv फ़ाइल test.txt

header1,header2,header3 
installed,2,3 
not installed,2,3 

आयात एक powershell चर में फ़ाइल कहा जाता है और यह फ़िल्टर करें।

$p = Import-CSV .\test.txt 
$p | Where { $_.header1 -eq 'installed'} 
0

इस सवाल के पार आया जब बाहर काम करने के लिए कैसे एक ही बात अपने आप को ऐसा करने के लिए कोशिश कर रहा।

क्या मैं के साथ के रूप में एक समाधान के रूप में था आया था इस प्रकार है:

$Filtered = $Table|Select-String -Pattern $ExcludeStrings -NotMatch -SimpleMatch 
$FilteredArray = @() 
$Filtered.Line | foreach {$split = $_ -split ';'; 
          $tidied = $split -replace '@|{|}|^ '; 
          $obj = New-Object System.Object 
          $tidied|foreach {$obj|Add-Member -MemberType NoteProperty -Name ($_.split('=')[0]) -Value ($_.split('=')[1]) 
              } 
          $FilteredArray += $obj 
          } 

पहली पंक्ति बस मुझे सरणी है कि मैं Import-CSV के माध्यम से मिला ही परिणाम रहा चाहता था पाने के लिए छानने दिखा रहा है।

दुर्भाग्य से, यह एक MatchInfo सरणी के साथ मुझे छोड़ देता है, प्रत्येक सरणी निम्न स्वरूप में होने के साथ:

@{Column1=Value1; Column2=Value2; Column3=Value3;} 

यह अच्छी तरह से सब पर सीएसवी के लिए बाहर वापस निर्यात नहीं करता है, के रूप में।

तो, मैंने एक नया आउटपुट सरणी ($FilteredArray) बनाने का विकल्प चुना।

मैं तो एक foreach लूप में Select-String से matchinfo सरणी के Line संपत्ति पहुंचाया, और प्रत्येक पंक्ति के लिए, मैं इसे सेमी-कोलन पर विभाजित, तो मैं @ {} वर्ण और उसके आगे रिक्त स्थान को हटा दें।

मैं तो एक नया System.Object, तो पाइप एक और foreach लूप में tidied उत्पादन बनाने के लिए, obj में नए NotePropertys बनाते समय, उन्हें = चरित्र को ऊपर tidied उत्पादन में वर्तमान पंक्ति से, नामकरण और मूल्य जा रहा है शेष = चरित्र के बाद पाठ।

क्या मैं के साथ समाप्त होता है:

PS C:\Users\Graham> $obj 

Column1   : Value1 
Column2   : Value2 
Column3   : Value3 

और फ़िल्टर्ड सरणी की तरह दिखता है:

PS C:\Users\Graham> $FilteredArray[0..3]|Format-table 

Column1   Column2  Column2          
-------   -------  ------- 
Value1   Value2   Value3 
Value1   Value2   Value3 
Value1   Value2   Value3 
+0

@ पॉल-रोलैंड द्वारा दिए गए समाधान ने 'नॉटमैच' फ़िल्टर का उपयोग करते हुए, इस परिणाम को एक सरल फैशन में हासिल किया होगा। यह पता लगाएं कि आपका टेक्स्ट कौन सा कॉलम है कि आप (या मिलान) को बाहर करना चाहते हैं - मेरे नमूने में, "ओएसनाम" वह कॉलम है जिसमें ऑपरेटिंग सिस्टम नाम हैं, और मैं सर्वर ओएस को बाहर करना चाहता हूं। प्रविष्टियों के साथ एक फ़िल्टर की गई तालिका का उत्पादन करने के लिए पीएससी कस्टमऑब्जेक्ट्स आगे प्रसंस्करण के लिए तैयार हैं, सीएसवी आयात करें, फिर कुछ करें '$ filtered = $ csv | जहां {$ _। OSName -notmatch 'सर्वर'} ' – Trix