2015-08-12 5 views
7

मेरे मामले में, वैध सीएसवी या तो अल्पविराम या सेमी-कॉलन द्वारा सीमित हैं। मैं अन्य पुस्तकालयों के लिए खुला हूं, लेकिन इसे जावा होना चाहिए। अपाचे सीएसवीपार्सर एपीआई के माध्यम से पढ़ना, केवल एक चीज जो मैं सोच सकता हूं वह ऐसा करने के लिए है जो अक्षम और बदसूरत लगता है।एक CSV फ़ाइल को कैसे पार्स करें जिसमें दो डिलीमीटर हो सकते हैं?

try 
{ 
    BufferedReader reader = new BufferedReader(new InputStreamReader(file)); 
    CSVFormat csvFormat = CSVFormat.EXCEL.withHeader().withDelimiter(';'); 
    CSVParser parser = csvFormat.parse(reader); 
    // now read the records 
} 
catch (IOException eee) 
{ 
    try 
    { 
     // try the other valid delimeter 
     csvFormat = CSVFormat.EXCEL.withHeader().withDelimiter(','); 
     parser = csvFormat.parse(reader); 
     // now read the records 
    } 
    catch (IOException eee) 
    { 
     // then its really not a valid CSV file 
    } 
} 

क्या पहले डेलीमीटर की जांच करने का कोई तरीका है, या शायद दो डिलीमीटर की अनुमति है? अपवाद को पकड़ने से किसी के पास कोई बेहतर विचार है?

+0

मुझे लगता है कि अपने कोड सबसे अच्छा कर रहे हैं है। सामान्य सीएसवी फ़ाइल में डेलीमीटर का पता लगाने के लिए कोई विधि नहीं है। डेलीमीटर का पता लगाने का एकमात्र तरीका कई डिलीमीटरों के साथ पुनः प्रयास कर रहा है। – gilchris

+0

बस एक विचार, यदि आपने अच्छी तरह से सीएसवी बनाया है तो क्या आप अपने विकल्पों में से एक के लिए पैटर्न मिलान कर सकते हैं? यदि प्रत्येक फ़ील्ड उद्धरणों में लपेटा जाता है तो कॉमा से अलग हो जाता है तो आपको पैटर्न के कई उदाहरण मिल सकते हैं "," –

उत्तर

2

हम uniVocity-parsers में इस के लिए समर्थन का निर्माण:

public static void main(String... args) { 
    CsvParserSettings settings = new CsvParserSettings(); 
    settings.setDelimiterDetectionEnabled(true); 

    CsvParser parser = new CsvParser(settings); 

    List<String[]> rows = parser.parseAll(file); 

} 

पार्सर कई और अधिक सुविधाओं है कि मुझे यकीन है कि आप उपयोगी मिल जाएगा हूँ है। कोशिश करो।

अस्वीकरण: मैं इस पुस्तकालय के लेखक हूँ, यह खुला स्रोत और मुफ्त (Apache 2.0 लाइसेंस)

+0

बहुत बढ़िया पार्सर ने मुझे बहुत सी सिरदर्द बचाया। साझा करने के लिए धन्यवाद! – Buffalo

+0

मदद करने के लिए खुशी हुई! कृपया प्रश्न को ऊपर उठाने पर विचार करें और इसका जवाब दें कि आपको यह उपयोगी लगता है। चीयर्स! –

+0

मैंने सभी प्रकार के अजीब सीएसवी पर पार्सर का परीक्षण किया है और सब कुछ ठीक हो गया है। मैंने एक सादा, सरल, "\ r \ n" अलग फ़ाइल का उपयोग करने की कोशिश की और यह हेडर के बाद भी पहली 2-3 पंक्तियों को गले लगाता है .. :(लाइन विभाजक को स्वत: पहचानने/आपूर्ति करने से कोई फर्क नहीं पड़ता। – Buffalo

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