2012-08-16 17 views
5

मैं एक csv फ़ाइल (details.csv) की तरहग्रूवी स्प्लिट सीएसवी

ID,NAME,ADDRESS 
1,"{foo,bar}","{123,mainst,ny}" 
2,"{abc,def}","{124,mainst,Va}" 
3,"{pqr,xyz}","{125,mainst,IL}" 

जब मैं का उपयोग किया है (ध्यान दें: मैं इस जो निर्देशिका से सभी csv फ़ाइलें पढ़ता ऊपर अन्य बंद है)

if(file.getName().equalsIgnoreCase("deatails.csv")) { 
input = new FileInputStream(file) 
reader = new BufferedReader(new InputStreamReader(input)) 
reader.eachLine{line-> def cols = line.split(",") 
println cols.size() } 
इसके बजाय आकार 3 मैं मूल्यों के साथ 6 हो रही होने का

1 
"{foo 
bar}" 
"{123 
mainst 
ny}" 

गिरा (",") अल्पविराम से बंटवारे डेटा है (,), लेकिन मैं अपने परिणामों एक चाहते एस

1 
"{foo,bar}" 
"{123,mainst,ny}" 

मैं इस बंद को कैसे ठीक कर सकता हूं। कृपया सहायता कीजिए! धन्यवाद

+0

String.split (स्ट्रिंग रेगेक्स) आप जो भी रेगेक्स पास करते हैं उस पर विभाजित होंगे। चूंकि आप बस "में गुजर रहे हैं," यह मानों में निहित अल्पविरामों पर भी विभाजित है। आपको एक रेगेक्स की आवश्यकता है जो उन अल्पविरामों को अनदेखा करे, या जावा/ग्रोवी लाइब्रेरी ढूंढें जो सीएसवी फाइलों को पार करती है। – smcg

उत्तर

20

एक सीएसवी पार्सर लिखना एक मुश्किल व्यवसाय है।

मैं किसी और कड़ी मेहनत करते हैं होता है, और का उपयोग कुछ like GroovyCsv


यहाँ

कैसे GroovyCsv

// I'm using Grab instead of just adding the jar and its 
// dependencies to the classpath 
@Grab('com.xlson.groovycsv:groovycsv:1.0') 
import com.xlson.groovycsv.CsvParser 

def csv = '''ID,NAME,ADDRESS 
1,"{foo,bar}","{123,mainst,ny}" 
2,"{abc,def}","{124,mainst,Va}" 
3,"{pqr,xyz}","{125,mainst,IL}"''' 

def csva = CsvParser.parseCsv(csv) 
csva.each { 
    println it 
} 

कौन सा प्रिंट के साथ यह पार्स करने के लिए है:

ID: 1, NAME: {foo,bar}, ADDRESS: {123,mainst,ny} 
ID: 2, NAME: {abc,def}, ADDRESS: {124,mainst,Va} 
ID: 3, NAME: {pqr,xyz}, ADDRESS: {125,mainst,IL} 

तो, दूसरी पंक्ति का NAME फ़ील्ड प्राप्त करने के लिए, आप यह कर सकते हैं:

def csvb = CsvParser.parseCsv(csv) 
println csvb[ 1 ].NAME 

कौन सा प्रिंट

{abc,def} 
बेशक

, अगर सीएसवी एक फ़ाइल है, तो आप कर सकते हैं:

def csvc = new File('path/to/csv').withReader { 
    CsvParser.parseCsv(it) 
} 

फिर जैसा कि ऊपर

+0

नहीं, इस एपी ने मेरी मदद नहीं की! – springpress

+1

@springpress क्यों नहीं? कोई स्पष्टीकरण? –

+0

जब मैं इस एपीआई को आजमाता हूं तो यह मेरे हेडर को मूल्यों के साथ कैसे जोड़ रहा है और प्रारूप में नहीं दे रहा है। चूंकि मुझे उस ASAP को पूरा करने की आवश्यकता है, इसलिए मैंने नीचे दिए गए मेरे उत्तर में पहले दृष्टिकोण का पालन किया है। – springpress

0

के दो तरीके हैं इसका इस्तेमाल करते हुए। एक

def processCsvData(Map csvDataMap, File file) 
{ 

    InputStream inputFile = new FileInputStream(file); 
    String[] lines = inputFile.text.split('\n') 
    List<String[]> rows = lines.collect {it.split(',')} 
      // Add processing logic 
} 

इकट्ठा यहाँ समस्या यह है यह कोष्ठकों ({}) यानी बीच में अल्पविराम को हटा रहा है उपयोग कर रहा है "{foo, बार}" हो जाता है "{foo बार}" जावा का उपयोग करने का एक और तरीका है, और यह ठीक काम करता है

public class CSVParser { 

    /* 
    * This Pattern will match on either quoted text or text between commas, including 
    * whitespace, and accounting for beginning and end of line. 
    */ 
    private final Pattern csvPattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)"); 
    private ArrayList<String> allMatches = null;   
    private Matcher matcher = null; 
    private int size; 

    public CSVParser() {     
     allMatches = new ArrayList<String>(); 
     matcher = null; 
    } 

    public String[] parse(String csvLine) { 
     matcher = csvPattern.matcher(csvLine); 
     allMatches.clear(); 
     String match; 
     while (matcher.find()) { 
       match = matcher.group(1); 
       if (match!=null) { 
         allMatches.add(match); 
       } 
       else { 
         allMatches.add(matcher.group(2)); 
       } 
     } 

     size = allMatches.size();     
     if (size > 0) { 
       return allMatches.toArray(new String[size]); 
     } 
     else { 
       return new String[0]; 
     }       
    }  

} 

आशा है कि इससे मदद मिलती है!

+0

आप ग्रोवी में उस पूरे जावा क्लास को 'पब्लिक क्लास सीएसवीपार्सर {पब्लिक स्ट्रिंग [] पार्स (स्ट्रिंग सीएसवीएलआईएन) के रूप में फिर से लिख सकते हैं {def matcher = csvLine = ~/"([^"] *) "| (? <=, | ^) ([^,] *) (?:, | $) /; matcher.collect {it [1]}}} ' –

+0

और मैं अभी भी एक प्री-लिखित सीएसवी पार्सिंग लाइब्रेरी का उपयोग करूंगा –

+0

मुझे इसे आज़माएं और वापस आएं आप के लिए। – springpress