2010-06-17 16 views
30

मैं opencsv का उपयोग csv फ़ाइलें पार्स करने के लिए, और मेरे कोडस्काला इकाई प्रकार

while((line = reader.readNext()) != null) { .... } 

मैं एक संकलक चेतावनी कह मिल गया है?

उत्तर

17

आपके मामले में (लाइन = reader.readNext()) एक कार्यात्मक शाब्दिक है जो यूनिट लौटाता है। इस प्रकार आप कोड को फिर से लिखने हो सकता है:

while({line = reader.readNext(); line!= null}) { .... } 
+8

कृपया इस उत्तर को स्वीकार न करें: जबकि सच है कि यह मूर्खतापूर्ण स्कैला नहीं है और आप जो चाहते हैं उसे प्राप्त करने के कई बेहतर तरीके हैं (नीचे मेरा उत्तर देखें) –

+3

@oxbow_lakes, शायद आप यहां थोड़ा कठोर हो रहे हैं? जबकि कीवर्ड को कोर टीम द्वारा 2.8 मानक लाइब्रेरी में सैकड़ों बार उपयोग किया जाता है और यह उत्तर निष्पादक, संक्षिप्त और सबसे महत्वपूर्ण बात है, मेरे उत्तर की तरह दिखता है; @)) –

+10

मैं टिप्पणी से खड़ा हूं, मुझे डर है। यह मूर्खतापूर्ण नहीं है।यह * कार्यात्मक * उत्तरों की तुलना में और भी अधिक प्रदर्शन नहीं है क्योंकि आपका कोड फ़ंक्शन (यानी ऑब्जेक्ट) तत्काल –

3

स्कैला में असाइनमेंट कोई मान नहीं देता है, यूनिट सी या सी ++ में शून्य के समान है।

कोशिश

var line = "" 

while ({line = reader.readNext(); line != null}) { ... } 

यह काम करता है क्योंकि एक ब्लॉक में पिछले अभिव्यक्ति के मूल्य दिया जाता है और इस मामले में यह एक बूलियन जिसके द्वारा आवश्यक है जबकि

+1

'स्केल में यूनिट' 'शून्य 'की तुलना में' शून्य' के समान है। – Jesper

+0

अच्छा बिंदु धन्यवाद, मैं उपरोक्त को सही कर दूंगा। –

67

एक काम अभिव्यक्ति टाइप स्काला में Unit है। यही आपके संकलक चेतावनी का कारण है।

वहाँ स्काला में एक अच्छा मुहावरा है कि जब तक पाश से बचा जाता है है:

val iterator = Iterator.continually(reader.readNext()).takeWhile(_ != null) 

यह आपको जो कुछ reader.readNext रिटर्न पर एक iterator देता है।

continually विधि एक "अनंत" पुनरावर्तक देता है और takeWhile उस का उपसर्ग लेता है, लेकिन पहले शून्य सहित नहीं।

(स्काला 2.8)

+0

हम्म पर संकलित हो जाएगा। मेरा जवाब वास्तव में सवाल से मेल नहीं खाता है। मैं इसे रखूंगा, यह वैसे भी उपयोगी हो सकता है। – mkneissl

+0

आपको क्यों नहीं लगता कि आपका उत्तर प्रश्न से मेल खाता है? –

+0

@ केन: पोर्टोलेट ने यूनिट के बारे में चेतावनी के लिए स्पष्टीकरण मांगा। मैंने एक लूप मुहावरे के साथ जवाब दिया। मैंने जवाब को पूरा करने के लिए चेतावनी के लिए स्पष्टीकरण जोड़ा है। स्पष्टीकरण के लिए – mkneissl

9

आप स्काला कोड वे जिस तरह से आप यह जावा में लिखते थे लिख रहे हैं। इसे और अधिक स्कैला जैसी तरीके से करने का प्रयास करें। लाइन द्वारा एक पाठ फ़ाइल लाइन पढ़ सकते हैं और प्रत्येक पंक्ति के साथ कुछ करने के लिए, इस प्रयास करें:

import java.io.File 
import scala.io.Source 

Source.fromFile(new File("myfile.txt")).getLines.foreach { line => 
    // Do something with the line, for example print it 
    println(line) 
} 
+0

वह सादे फाइल आईओ नहीं कर रहा है। वह सीएसवी आईओ कर रहा है। –

+0

@ केन सीएसवी फाइलें आम तौर पर रेखा-उन्मुख टेक्स्ट फाइलें होती हैं, और ऊपर उनका कोड स्निपेट लाइन द्वारा टेक्स्ट फ़ाइल लाइन पढ़ने के बारे में है। मेरा जवाब वास्तव में उनके प्रश्न का सीधा जवाब नहीं है, मैं सिर्फ एक रास्ता दिखाना चाहता था जो स्कैला मुहावरे के साथ अधिक फिट बैठता है; उसका मूल कोड स्कैला में जावा मुहावरे है। – Jesper

17

आप एक Stream उपयोग कर सकते हैं कि आप क्या चाहते प्राप्त करने के लिए:

Stream.continually(reader.readLine()).takeWhile(_ ne null) foreach { line => 
    //do Stuff 
} 

यह अन्य के अतिरिक्त लाभ दिया है साथ ही कूल सामग्री:

Stream.continually(reader.readLine()).takeWhile(_ ne null) match { 
    case head #:: tail => //perhaps you need to do stuff with the first element? 
    case _    => //empty 
} 

संपादित - धन्यवाद ओर इशारा करते हुए के लिए mkneissl को मैं इस चेतावनी दी शामिल किया जाना चाहिए था आईएनजी:

scala> Stream.continually(1).take(100000000).foreach(x=>()) 

scala> val s = Stream.continually(1).take(100000000) 
s: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

scala> s.foreach(x=>()) java.lang.OutOfMemoryError: Java heap space 
+3

आप स्मृति से बाहर निकलने से बचने के लिए स्ट्रीम के सिर को न रखने के लिए चेतावनी जोड़ना चाहेंगे। बड़ी फाइलें पढ़ने पर हाल ही में इसे पकड़ा गया है। स्केला> Stream.continually (1) .take (100000000) .foreach (x =>()) ठीक है, लेकिन स्केला> वैल एस = Stream.continually (1) .take (100000000) रों : scala.collection.immutable.Stream [Int] = स्ट्रीम (1,?) स्कैला> s.foreach (x =>()) java.lang.OutOfMemoryError: जावा हीप स्पेस [बाह, टिप्पणियों में कोई स्वरूपण नहीं , पेस्टी देखें: http://paste.pocoo.org/show/226682/] – mkneissl

+2

जब तक आपको वास्तव में स्ट्रीम की आवश्यकता न हो, तो आप Stream.continually के बजाय Iterator.continually भी उपयोग कर सकते हैं, फिर आपको स्ट्रीम के साथ समस्याओं के बारे में कोई चिंता नहीं है । –

+1

राइट सेठ, इस सवाल का मेरा जवाब देखें: http://stackoverflow.com/questions/3062804/scala-unit-type/3063092#3063092 और स्ट्रीम बनाम इटरेटर की तुलना के लिए http://stackoverflow.com/ देखें प्रश्न/1527962/अंतर-बीच-इटरेटर-एंड-स्ट्रीम-इन-स्कैला। – mkneissl

संबंधित मुद्दे