2012-12-09 12 views
5

गुड दोपहर के साथ एक यूटीएफ -8 फ़ाइल में पहली पंक्ति की लंबाई। मान लीजिए मेरे पास एक ही अक्षर वाला एक यूटीएफ -8 फ़ाइल है, "एफ" (नहीं \ n और रिक्त स्थान) कहें और मैं लाइन लम्बाई का अनुक्रम प्राप्त करने का प्रयास करता हूं।बीओएम

(with-open [rdr (reader "test.txt")] 
    (doall (map #(.length %) (line-seq rdr)))) 

और मैं

=> (2) 

क्यों मिलता? क्या पहली स्ट्रिंग की सही लंबाई प्राप्त करने का कोई शानदार तरीका है?

+0

मैं इसे पुन: पेश नहीं कर सकता। मैंने यूटीएफ -8 फाइल के साथ अपना कोड इस्तेमाल किया जिसमें एक या दो-बाइट वर्ण होते हैं, दोनों अंत में या बिना \ n' के होते हैं। सभी मामलों में मुझे '(1)' मिला। आपका क्लोजर संस्करण क्या है? – Jan

+2

बस एक यादृच्छिक विचार, क्या होगा यदि आप अपनी टेस्ट फाइलों में बीओएम डालते हैं? – SirDarius

+0

मेरा क्लोजर संस्करण 1.4 है। हां, हकीकत में यह बीओएम है। मैं समस्या को कैसे बाधित कर सकता हूं? –

उत्तर

7

जावा में बीओएम की समस्या Reading UTF-8 - BOM marker में शामिल है। ऐसा लगता है कि यह अपाचे के कॉमन्स से BOMInputStream का उपयोग कर दूर निकाला जा सकता है या इसे मैन्युअल रूप से हटा दिया जाना चाहिए, यानी

(defn debomify 
    [^String line] 
    (let [bom "\uFEFF"] 
    (if (.startsWith line bom) 
     (.substring line 1) 
     line))) 

(doall (map #(.length %) (.split (debomify (slurp "test.txt")) "\n"))) 

आप क्योंकि यह बहुत बड़ा है एक फ़ाइल lazily line-seq का उपयोग कर, उदाहरण के लिए पढ़ना चाहते हैं, तो आप का इलाज करने के लिए है debomify का उपयोग कर पहली पंक्ति। शेष को सामान्य रूप से पढ़ा जा सकता है। इसलिए:

(defn debommed-line-seq 
    [^java.io.BufferedReader rdr] 
    (when-let [line (.readLine rdr)] 
    (cons (debomify line) (lazy-seq (line-seq rdr))))) 
+0

धन्यवाद। शायद यह एक समाधान है। –

+0

अधिक विस्तृत संस्करण के लिए धन्यवाद। –

+0

शायद अधिक इष्टतम विधि बस करना है (debomify (slurp "test.txt")) और फिर इसे विभाजित करें। –