2013-02-11 14 views
9

जब मैं opencsv का उपयोग कर एक csv-file पढ़ रहा हूं, तो स्ट्रिंग के अंत में '\' का सामना करते समय यह ठीक से काम नहीं करता है। यह "जैसा कि मैं चाहता हूं 'की बजाय स्ट्रिंग का हिस्सा बनाता हूं। मुझे लगता है कि इसे' \ 'से बचने के लिए' '' जोड़ने के लिए कुछ तरीका होना चाहिए - इसके बजाय चरित्र? के बिना ।। मैन्युअल रूप से सीएसवी-फ़ाइल को संपादित मैं खोज की है, लेकिन कुछ भी नहीं मिलाopencsv का उपयोग कर '' युक्त स्ट्रिंग को कैसे पढ़ा जाए?

मेरी समस्या स्पष्ट करने के लिए है, यह इस तरह दिखता है:

सीएसवी फ़ाइल

"A",  "B",  "C",  "D" 
"value 1", "value 2", "value 3", "value 4" 
"value 5", "value 6\", "value 7", "value 8" 

मेरे कोड इस तरह दिखता है (वास्तव में नहीं, लेकिन यह मेरी समस्या दिखाता है):

String inFile = "in.csv"; 
CSVReader reader = new CSVReader(new FileReader(inFile)); 
String[] line; 

while ((line = reader.readNext()) != null) { 
    for (int i = 0; i < line.length(); i++) { 
     System.out.println(i + " " + line[i]); 
    } 
} 

मैं प्रत्येक पंक्ति के लिए प्रत्येक तत्व के साथ एक स्ट्रिंग [] में पार्स करना चाहता हूं, लेकिन अंतिम पंक्ति नीचे दिए गए आउटपुट में दिखाए गए अनुसार केवल दो तत्वों में पार्स करती है।

CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(inFile), "UTF-8")); 

लेकिन किसी भी भाग्य के बिना:

1 A 
2 B 
3 C 
4 D 
1 value 1 
2 value 2 
3 value 3 
4 value 4 
1 value 5 
2 value 6",value 7,value 8 

मैं करने के लिए पाठक को बदलने की कोशिश की है।

उत्तर

11

शायद रीडर के निर्माता में एस्केप वर्ण बदलने के लिए चुन सकते हैं का उपयोग करें?

CSVReader(new InputStreamReader(new FileInputStream(inFile), ',', '"', '|') 

यह | संभालने है अपने सीवीएस में नहीं किया जाता है फ़ाइल

अधिक जानकारी यहाँ: http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/CSVReader.html

+0

धन्यवाद! अब मैं उस पंक्ति को पढ़ने के लिए सक्षम हूं। हालांकि, मेरे पास फ़ाइल में ** ** ** चरित्र भी है। क्या बचने के चरित्र को छोड़ने का कोई तरीका है? –

+4

'' \ 0'' 'आज़माएं। मुझे लगता है कि यह सीवीएस – user000001

+0

के लिए अमान्य है! उसने ऐसा किया आपका बहुत बहुत धन्यवाद! –

3

बैकस्लैश " से बचने के लिए है क्योंकि कुछ मानों में " वर्ण हो सकता है, और बैकस्लैश के बिना आप चरित्र को शामिल नहीं कर पाएंगे।

तो यदि आप \ का उपयोग करना चाहते हैं तो आपको इसे \ के साथ भी बचाना होगा, जैसा कि आप इसे नियमित जावा स्ट्रिंग में रखना चाहते हैं।

"A",  "B",   "C",  "D" 
"value 1", "value 2", "value 3", "value 4" 
"value 5", "value 6\\", "value 7", "value 8" 

या तो आप अपनी CSV फ़ाइल को संशोधित करने या आप CSVReader से दूसरे निर्माता जिसमें से आप भागने चरित्र

+0

और मैं कोड के माध्यम से इसे कैसे प्राप्त कर सकता हूं? –

+0

@CristofferKarlsson संपादित करें – Alex

+0

उपयोगकर्ता स्पष्ट रूप से कहता है कि वे csv को संशोधित नहीं कर सकते हैं। कल्पना करें कि यह बाहरी स्रोत से गंदा डेटा आ रहा है। –

0

अधिक स्वच्छ और सुझाए गए समाधान के डिफ़ॉल्ट CSVParser के बजाय RFC4180Parser उपयोग करने के लिए है:

RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build(); 
CSVReader csvReader = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(rfc4180Parser).build(); 

संदर्भ: https://sourceforge.net/p/opencsv/support-requests/50/

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