जावा lib या ऐप को CSV को XML फ़ाइल में कनवर्ट करने के लिए?

क्या जावा में कोई मौजूदा एप्लिकेशन या लाइब्रेरी है जो मुझे CSV डेटा फ़ाइल को xml फ़ाइल में कनवर्ट करने की अनुमति देगी?

xml टैग संभावित रूप से कॉलम शीर्षलेख वाली पहली पंक्ति के माध्यम से प्रदान किए जाएंगे।

0
जोड़ा संपादित
विचारों: 1
ऐसा लगता है कि एसओ में जावा के टैग के साथ यह पहला सवाल है।
जोड़ा लेखक Paul Vargas, स्रोत
@ बीजेबी 568 आपका क्या मतलब है?
जोड़ा लेखक CodingNinja, स्रोत
@ बीजेबी 568 ओह। haha
जोड़ा लेखक CodingNinja, स्रोत
@ पॉल केवल इतना ही नहीं, यह 123 भी है!
जोड़ा लेखक bjb568, स्रोत
@ टॉमी stackoverflow.com/q/123
जोड़ा लेखक bjb568, स्रोत

16 उत्तर

यह बहुत बुनियादी या समाधान का सीमित हो सकता है, लेकिन आप String.split() फ़ाइल की प्रत्येक पंक्ति पर, xml उत्पन्न करने के लिए पहली पंक्ति के परिणाम सरणी को याद रखना , और बस प्रत्येक लाइन के सरणी डेटा को लूप के प्रत्येक पुनरावृत्ति को जोड़कर उचित xml तत्वों के साथ थूक दें?

0
जोड़ा
यदि आपकी सीएसवी फ़ाइल में कभी भी डेटा में उद्धृत कॉमा शामिल नहीं है, जो काफी आम है।
जोड़ा लेखक Alan Krueger, स्रोत

मुझे समझ में नहीं आता कि आप ऐसा क्यों करना चाहते हैं। यह लगभग कार्गो पंथ कोडिंग की तरह लगता है।

एक सीएसवी फ़ाइल को एक्सएमएल में कनवर्ट करना कोई मूल्य नहीं जोड़ता है। आपका प्रोग्राम पहले ही सीएसवी फ़ाइल पढ़ रहा है, इसलिए तर्क है कि आपको एक्सएमएल की जरूरत नहीं है।

दूसरी तरफ, सीएसवी फ़ाइल पढ़ना, मानों के साथ कुछ कर रहा है, और उसके बाद एक्सएमएल को क्रमबद्ध करना समझ में आता है (ठीक है, जितना अधिक एक्सएमएल का उपयोग कर सकता है ...;) लेकिन आप माना जाता है कि एक्सएमएल को क्रमबद्ध करने का साधन पहले से ही होगा।

0
जोड़ा

मुझे पता है कि आपने जावा के लिए पूछा है, लेकिन यह मुझे एक स्क्रिप्टिंग भाषा के लिए उपयुक्त एक कार्य के रूप में हमला करता है। ग्रोवी में लिखा गया एक त्वरित (बहुत सरल) समाधान यहां दिया गया है।

test.csv

string,float1,float2,integer
hello world,1.0,3.3,4
goodbye world,1e9,-3.3,45
hello again,-1,23.33,456
hello world 3,1.40,34.83,4999
hello 2 world,9981.05,43.33,444

csvtoxml.groovy

#!/usr/bin/env groovy

def csvdata = []
new File("test.csv").eachLine { line ->
    csvdata << line.split(',')
}

def headers = csvdata[0]
def dataRows = csvdata[1..-1]

def xml = new groovy.xml.MarkupBuilder()

// write 'root' element
xml.root {
    dataRows.eachWithIndex { dataRow, index ->
        // write 'entry' element with 'id' attribute
        entry(id:index+1) {
            headers.eachWithIndex { heading, i ->
                // write each heading with associated content
                "${heading}"(dataRow[i])
            }
        }
    }
}

निम्न xml को stdout पर लिखता है:


  
    hello world
    1.0
    3.3
    4
  
  
    goodbye world
    1e9
    -3.3
    45
  
  
    hello again
    -1
    23.33
    456
  
  
    hello world 3
    1.40
    34.83
    4999
  
  
    hello 2 world
    9981.05
    43.33
    444
  

हालांकि, कोड बहुत सरल पार्सिंग करता है (खाते में उद्धृत या बचने वाले अल्पविरामों को नहीं लेता) और यह संभावित अनुपस्थित डेटा के लिए जिम्मेदार नहीं है।

0
जोड़ा
पाठक को व्यायाम छोड़ दिया?
जोड़ा लेखक Alan Krueger, स्रोत
तो आप पार्सिंग करने के लिए एक CSV लाइब्रेरी को कॉल कर सकते हैं और फिर मार्कअप बिल्डर का उपयोग कर सकते हैं। शायद आप इसे दिखाने के लिए अपना जवाब संपादित कर सकते हैं।
जोड़ा लेखक Peter Kelley, स्रोत

Maybe this might help: JSefa

आप इस उपकरण के साथ सीएसवी फ़ाइल पढ़ सकते हैं और इसे एक्सएमएल में क्रमबद्ध कर सकते हैं।

0
जोड़ा

मेरे पास सीएसवी और फ्लैट फाइलों के साथ काम करने के लिए एक ओपनसोर्स फ्रेमवर्क है। शायद यह देखने लायक है: JFileHelpers

उस टूलकिट के साथ आप बीन्स का उपयोग करके कोड लिख सकते हैं, जैसे:

@FixedLengthRecord()
public class Customer {
    @FieldFixedLength(4)
    public Integer custId;

    @FieldAlign(alignMode=AlignMode.Right)
    @FieldFixedLength(20)
    public String name;

    @FieldFixedLength(3)
    public Integer rating;

    @FieldTrim(trimMode=TrimMode.Right)
    @FieldFixedLength(10)
    @FieldConverter(converter = ConverterKind.Date, 
    format = "dd-MM-yyyy")
    public Date addedDate;

    @FieldFixedLength(3)
    @FieldOptional
    public String stockSimbol;  
}

और फिर बस अपनी टेक्स्ट फ़ाइलों का उपयोग करके पार्स करें:

FileHelperEngine engine = 
    new FileHelperEngine(Customer.class); 
List customers = 
    new ArrayList();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

और आपके पास पार्स किए गए ऑब्जेक्ट्स का संग्रह होगा।

उम्मीद है की वो मदद करदे!

0
जोड़ा
एनोटेशन के उपयोग के लिए +1। दुर्भाग्यवश, आज के रूप में, ऐसा लगता है कि परियोजना के पास 2009-08-11 के बाद से कोई नया संस्करण नहीं है ...
जोड़ा लेखक Stephan, स्रोत
हां, मेरे पास तब से विकास के साथ जारी रखने का समय नहीं था लेकिन यह बहुत स्थिर है।
जोड़ा लेखक kolrie, स्रोत

इस समाधान को किसी भी सीएसवी या एक्सएमएल पुस्तकालयों की आवश्यकता नहीं है और, मुझे पता है, यह किसी भी अवैध पात्रों और एन्कोडिंग मुद्दों को संभाल नहीं करता है, लेकिन आपको इसमें रुचि भी हो सकती है, बशर्ते आपका सीएसवी इनपुट ऊपर उल्लिखित नियमों को तोड़ न दे।

Attention: You should not use this code unless you know what you do or don't have the chance to use a further library (possible in some bureaucratic projects)... Use a StringBuffer for older Runtime Environments...

तो अब हम शुरू करें:

BufferedReader reader = new BufferedReader(new InputStreamReader(
        Csv2Xml.class.getResourceAsStream("test.csv")));
StringBuilder xml = new StringBuilder();
String lineBreak = System.getProperty("line.separator");
String line = null;
List headers = new ArrayList();
boolean isHeader = true;
int count = 0;
int entryCount = 1;
xml.append("");
xml.append(lineBreak);
while ((line = reader.readLine()) != null) {
    StringTokenizer tokenizer = new StringTokenizer(line, ",");
    if (isHeader) {
        isHeader = false;
        while (tokenizer.hasMoreTokens()) {
            headers.add(tokenizer.nextToken());
        }
    } else {
        count = 0;
        xml.append("\t");
        xml.append(lineBreak);
        while (tokenizer.hasMoreTokens()) {
            xml.append("\t\t<");
            xml.append(headers.get(count));
            xml.append(">");
            xml.append(tokenizer.nextToken());
            xml.append("</");
            xml.append(headers.get(count));
            xml.append(">");
            xml.append(lineBreak);
            count++;
        }
        xml.append("\t");
        xml.append(lineBreak);
        entryCount++;
    }
}
xml.append("");
System.out.println(xml.toString());

इनपुट test.csv (इस पृष्ठ पर किसी अन्य उत्तर से चोरी):

string,float1,float2,integer
hello world,1.0,3.3,4
goodbye world,1e9,-3.3,45
hello again,-1,23.33,456
hello world 3,1.40,34.83,4999
hello 2 world,9981.05,43.33,444

परिणामी आउटपुट:


    
        hello world
        1.0
        3.3
        4
    
    
        goodbye world
        1e9
        -3.3
        45
    
    
        hello again
        -1
        23.33
        456
    
    
        hello world 3
        1.40
        34.83
        4999
    
    
        hello 2 world
        9981.05
        43.33
        444
    

0
जोड़ा

जैक्सन प्रोसेसर परिवार ने जेएसओएन नहीं बल्कि कई डेटा प्रारूपों के लिए बैकएंड किया है। इसमें एक्सएमएल ( https://github.com/FasterXML/jackson-dataformat-xml) और सीएसवी ( https://github.com/FasterXML/jackson-dataformat-csv/ </ए>) बैकएंड्स।

रूपांतरण सीएसवी बैकएंड के साथ इनपुट पढ़ने पर निर्भर करेगा, एक्सएमएल बैकएंड का उपयोग करके लिखें। यदि आपके पास प्रति पंक्ति (सीएसवी) प्रविष्टियों के लिए POJO है (या परिभाषित) है तो यह करना सबसे आसान है। यह सख्त आवश्यकता नहीं है, क्योंकि सीएसवी की सामग्री को "untyped" भी पढ़ा जा सकता है ( स्ट्रिंग arrays का अनुक्रम), लेकिन

xml आउटपुट पर थोड़ा और काम करने की आवश्यकता है।

एक्सएमएल पक्ष के लिए, आपको क्रमबद्ध करने के लिए ऑब्जेक्ट की सरणी या सूची रखने के लिए एक रैपर रूट ऑब्जेक्ट की आवश्यकता होगी।

0
जोड़ा

For the CSV Part, you may use my little open source library

0
जोड़ा
क्या आपके पास पुस्तकालय के लिए एक और लिंक है? लिंक मर चुका है। इस तरह से सटीक कारण है कि केवल उत्तरों को लिंक क्यों किया जाता है।
जोड़ा लेखक Magnilex, स्रोत
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - समीक्षा से
जोड़ा लेखक Boo Berr'ita, स्रोत

उपरोक्त अन्य लोगों के रूप में, मुझे ऐसा करने का कोई भी कदम नहीं पता है, लेकिन यदि आप बहुत ही सरल बाहरी पुस्तकालयों का उपयोग करने के लिए तैयार हैं, तो मैं सुझाव दूंगा:

OpenCsv for parsing CSV (small, simple, reliable and easy to use)

Xstream to parse/serialize xml (very very easy to use, and creating fully human readable xml)

उपरोक्त के समान नमूना डेटा का उपयोग करके, कोड इस तरह दिखेगा:

package fr.megiste.test;

import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;

import com.thoughtworks.xstream.XStream;

public class CsvToXml {     

    public static void main(String[] args) {

        String startFile = "./startData.csv";
        String outFile = "./outData.xml";

        try {
            CSVReader reader = new CSVReader(new FileReader(startFile));
            String[] line = null;

            String[] header = reader.readNext();

            List out = new ArrayList();

            while((line = reader.readNext())!=null){
                List item = new ArrayList();
                    for (int i = 0; i < header.length; i++) {
                    String[] keyVal = new String[2];
                    String string = header[i];
                    String val = line[i];
                    keyVal[0] = string;
                    keyVal[1] = val;
                    item.add(keyVal);
                }
                out.add(item);
            }

            XStream xstream = new XStream();

            xstream.toXML(out, new FileWriter(outFile,false));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

निम्नलिखित परिणाम का निर्माण: (एक्सस्ट्रीम परिणाम की बहुत अच्छी ट्यूनिंग की अनुमति देता है ...)


  
    
      string
      hello world
    
    
      float1
      1.0
    
    
      float2
      3.3
    
    
      integer
      4
    
  
  
    
      string
      goodbye world
    
    
      float1
      1e9
    
    
      float2
      -3.3
    
    
      integer
      45
    
  
  
    
      string
      hello again
    
    
      float1
      -1
    
    
      float2
      23.33
    
    
      integer
      456
    
  
  
    
      string
      hello world 3
    
    
      float1
      1.40
    
    
      float2
      34.83
    
    
      integer
      4999
    
  
  
    
      string
      hello 2 world
    
    
      float1
      9981.05
    
    
      float2
      43.33
    
    
      integer
      444
    
  

0
जोड़ा

जहां तक ​​मुझे पता है, आपके लिए ऐसा करने के लिए कोई तैयार पुस्तकालय नहीं है, लेकिन सीएसवी से एक्सएमएल में अनुवाद करने में सक्षम एक उपकरण का उत्पादन करने के लिए आपको केवल कच्चे सीएसवी पार्सर लिखने और जेडीओएम (या आपकी एक्सएमएल जावा लाइब्रेरी) पसंद) कुछ गोंद कोड के साथ।

0
जोड़ा

मुझे कुछ भी पता नहीं है जो कम से कम कोड लिखने के बिना ऐसा कर सकता है ... आपको 2 अलग पुस्तकालय की आवश्यकता होगी:

  • एक सीएसवी पार्सर फ्रेमवर्क
  • एक एक्सएमएल सीरियलाइजेशन फ्रेमवर्क

सीएसवी पार्सर मैं अनुशंसा करता हूं (जब तक कि आप अपना स्वयं का सीएसवी पार्सर लिखने के लिए थोड़ा मजा नहीं लेना चाहते) ओपनसीएसवी (सीएसवी डेटा पार्स करने के लिए एक सोर्सफोर्ज प्रोजेक्ट) है

एक्सएमएल सीरियलाइजेशन फ्रेमवर्क ऐसा कुछ होना चाहिए जो बड़े पैमाने पर (या विशाल) सीएसवी फ़ाइल को एक्सएमएल में बदलना चाहे, तो मेरी सिफारिश सन सन स्ट्रीमिंग एक्सएमएल पार्सर फ्रेमवर्क है (देखें यहां ) जो पुल-पार्सिंग और क्रमबद्धता की अनुमति देता है।

0
जोड़ा

डैनियल पार्कर द्वारा अच्छी लाइब्रेरी ServingXML भी है, जो लगभग किसी भी सादे पाठ प्रारूप को एक्सएमएल और वापस परिवर्तित करने में सक्षम है ।

आपके मामले के लिए उदाहरण यहां पाया जा सकता है: यह CSV में फ़ील्ड का शीर्षक उपयोग करता है xml तत्व नाम के रूप में फ़ाइल करें।

0
जोड़ा

आप ग्रोवी का उपयोग करके यह असाधारण रूप से आसानी से कर सकते हैं, और कोड बहुत पठनीय है।

असल में, पाठ चर contactData.csv में प्रत्येक पंक्ति के लिए contact.xml पर लिखा जाएगा, और फ़ील्ड सरणी में प्रत्येक कॉलम होता है।

def file1 = new File('c:\\temp\\ContactData.csv')
def file2 = new File('c:\\temp\\contacts.xml')

def reader = new FileReader(file1)
def writer = new FileWriter(file2)

reader.transformLine(writer) { line ->
    fields =  line.split(',')

    text = """
     ${fields[2]} 
     ${fields[1]} 
     ${fields[9]} 
     password 
    <title> ${fields[4]} </title>
     ${fields[3]} 
    """
}
0
जोड़ा
सीएसवी सरल है, लेकिन आमतौर पर इतना आसान नहीं है कि अल्पविराम पर एक विभाजन पर्याप्त है।
जोड़ा लेखक Alan Krueger, स्रोत

आप XSLT का उपयोग कर सकते हैं। Google इसे और आपको कुछ उदाहरण मिलेगा उदा। xml से CSV यदि आप XSLT का उपयोग करते हैं तो आप एक्सएमएल को जो भी प्रारूप चाहते हैं उसे परिवर्तित कर सकते हैं।

0
जोड़ा

बड़ा अंतर यह है कि JSefa लाता है कि यह आपके जावा ऑब्जेक्ट्स को CSV / xml / आदि फाइलें और जावा वस्तुओं को वापस deserialize कर सकते हैं। और यह एनोटेशन द्वारा संचालित है जो आपको आउटपुट पर बहुत अधिक नियंत्रण देता है।

JFileHelpers भी दिलचस्प लग रहा है।

0
जोड़ा

मुझे एक ही समस्या थी और मेरी परियोजनाओं में से किसी एक के लिए एक CSV फ़ाइल को एक xml फ़ाइल में परिवर्तित करने के लिए एक एप्लिकेशन की आवश्यकता थी, लेकिन नेट पर कुछ भी मुफ्त और पर्याप्त नहीं मिला, इसलिए मैंने अपना स्वयं का जावा स्विंग CSVtoXML एप्लिकेशन कोड किया।

यह मेरी वेबसाइट यहां से उपलब्ध है। आशा है इससे आपकी मदद होगी।

यदि नहीं, तो आप आसानी से कोड कर सकते हैं जैसे मैंने किया; स्रोत कोड जार फ़ाइल के अंदर है इसलिए इसे संशोधित करें क्योंकि आपको इसकी आवश्यकता पूरी नहीं होती है।

0
जोड़ा
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - समीक्षा से
जोड़ा लेखक Matthew Groves, स्रोत