2011-07-28 12 views
15

मैं शक्तियों का उपयोग कर एक सीएसवी फ़ाइल में पंक्तियों की संख्या कैसे गिन सकता हूं? मैं की तरहपावरशेल: सीएसवी फ़ाइल में पंक्तियों की संख्या कैसे गिनें?

Get-Content -length "C:\Directory\file.csv" 

या

(Get-Content).length "C:\Directory\file.csv" 

लेकिन इन परिणाम एक त्रुटि कुछ करने की कोशिश की।

उत्तर

25

पाइप यह Measure-Object cmdlet

Import-Csv C:\Directory\file.csv | Measure-Object 
+2

धन्यवाद, यह काम करने लगता है, लेकिन यह बहुत धीमी गति से उदा तुलना जीएनयू यूनिक्स utils wc.exe के लिए। – jrara

+1

ऐसा इसलिए है क्योंकि wc.exe (गेट-कंटेंट) के बराबर होगा। तरंगदैर्ध्य जो आयात-सीएसवी की तुलना में बहुत तेज है, यह भी एक संभावित गलत समाधान है जैसा कि स्टीज द्वारा इंगित किया गया है क्योंकि यह पंक्तियों के लिए जिम्मेदार नहीं होगा मल्टीलाइन फ़ील्ड – EBGreen

+0

ग्रेट सामान। मुझे जिस चीज की जरूरत थी... –

6

आम तौर पर (csv या नहीं)

@(Get-Content c:\file.csv).Length 

फ़ाइल केवल एक ही लाइन है, तो, यह असफल हो जायेगी। (आप @ उपसर्ग जरूरत है ... अन्यथा यदि फ़ाइल एक लाइन है, यह केवल कि लाइन में पात्रों की संख्या की गिनती होगी।

Get-Content c:\file.csv | Measure-Object -line 

लेकिन दोनों असफल हो जायेगी यदि कोई रिकॉर्ड एक से अधिक लेता है । पंक्ति तो बेहतर आयात सीएसवी और उपाय:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count 
+0

अंतिम बार एक त्रुटि उत्पन्न होता है: चयन-ऑब्जेक्ट: संपत्ति का विस्तार नहीं कर सकता "गिनती" क्योंकि इसमें विस्तार करने के लिए कुछ भी नहीं है। लाइन पर: 1 char: 64 + आयात-सीएसवी सी: \ निर्देशिका \ file.csv | माप-वस्तु | चयन-ऑब्जेक्ट <<<< -अनेंड गिनती – jrara

+0

अजीब, 'माप-वस्तु' को उस वस्तु को वापस करना चाहिए जिसमें संपत्ति गणना हो। '| चयन-ऑब्जेक्ट ...' को हटाने का प्रयास करें और आप देखेंगे कि यह क्या लौटाता है। – stej

+0

आप शायद PowerShell v1 का उपयोग कर रहे हैं। V1 में, 'चयन-ऑब्जेक्ट-एक्सपैंड गुणनाम' परिणाम एक स्केलर (एक ऑब्जेक्ट) होने पर एक त्रुटि फेंकता है। V2 में अपग्रेड करें और आप जाने के लिए अच्छे हैं। –

31

प्राप्त करें-सामग्री और उपाय-वस्तु छोटे फ़ाइलों के लिए ठीक है, लेकिन दोनों स्मृति सुपर अक्षम हैं मैं बड़ी फ़ाइलों के साथ वास्तविक समस्या नहीं थी

है।। गिनती किसी भी विधि का उपयोग कर 1 जीबी फ़ाइल में पंक्तियां, पावरहेल ने सर्वर पर सभी उपलब्ध मेमोरी (8 जीबी) को गब्बल किया, फिर डिस्क पर पेजिंग शुरू कर दी। मैंने इसे एक घंटे से अधिक छोड़ा, लेकिन यह अभी भी डिस्क पर पेजिंग था इसलिए मैंने इसे मार दिया।

बड़ी फ़ाइलों के लिए मुझे मिली सबसे अच्छी विधि IO.StreamReader का उपयोग डिस्क से फ़ाइल लोड करने और चर के उपयोग से प्रत्येक पंक्ति को गिनने के लिए करना है। यह स्मृति उपयोग को बहुत ही उचित 25 एमबी तक रखता है और 1 जीबी फ़ाइल में पंक्तियों की गिनती करने के लिए लगभग 6 सेकंड या 6 जीबी फ़ाइल के लिए कुछ मिनट लगने के लिए लगभग 30 सेकंड लेता है। यह कभी नहीं रैम अनुचित मात्रा में, ऊपर खाती है चाहे कितना बड़ा अपने फ़ाइल है:

[int]$LinesInFile = 0 
$reader = New-Object IO.StreamReader 'c:\filename.csv' 
while($reader.ReadLine() -ne $null){ $LinesInFile++ } 

भी आप, मिल-सामग्री या उपाय वस्तु का प्रयोग करेंगे बस के लिए $ LinesInFile चर का उल्लेख ऊपर टुकड़ा डाला जा सकता है फ़ाइल की पंक्ति गणना प्राप्त करें।

+0

यहां दिखाए गए किसी अन्य समाधान से तेज़। एक 500 एमबी सीएसवी फ़ाइल को हल करने के लिए 5 सेकंड से कम। – alextc

+0

आपको पाठक ($ reader.Dispose()) का उपयोग करने के बाद भी निपटान करना चाहिए या जब तक आप अपना पीएस सत्र बंद नहीं करते हैं तब तक फ़ाइल खोले जाने का खतरा होता है। –

0

आप कोशिश कर सकते हैं

(Import-Csv C:\Directory\file.csv).count 

या

$a=Import-Csv C:\Directory\file.csv 
$a.count 
+0

मुझे एक बड़ी फ़ाइल पर इस दृष्टिकोण का उपयोग करके 'आउटऑफमेमरी अपवाद' मिलता है। 'सामग्री प्राप्त करें' का उपयोग करना माप-वस्तु 'सीमित मात्रा में स्मृति के साथ काम करता है .. –

0

(Import-Csv C:\Directory\file.csv).count इन में से केवल सही एक है।

मैं 4781 पंक्तियों के साथ एक csv पर अन्य सुझावों के सभी की कोशिश की है, और सभी लेकिन यह एक लौटे 4803.