CSV या CSV को XML फ़ाइल में कनवर्ट करने के लिए ऐप? [बन्द है]


114

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

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


47
ऐसा लगता है कि एसओ में जावा के टैग के साथ यह पहला सवाल है।
पॉल वर्गास

8
@ पाओल ही नहीं, यह 123 भी है!
bjb568


1
@ bjb568 ओह। haha

4
कोई आश्चर्य नहीं कि एसओ में जावा के लिए पहली पोस्ट को ऑफ-टॉपिक के रूप में बंद कर दिया गया था: डी
सर।

जवाबों:


66

शायद यह मदद कर सकता है: JSefa

आप इस उपकरण के साथ CSV फ़ाइल को पढ़ सकते हैं और इसे XML में अनुक्रमित कर सकते हैं।


47

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

CSV को पार्स करने के लिए ओपनसीएसवी (छोटा, सरल, विश्वसनीय और उपयोग में आसान)

Xstream पार्स करने के लिए / serialize एक्सएमएल (बहुत बहुत उपयोग करने के लिए आसान है, और पूरी तरह से मानव पठनीय एक्सएमएल बनाने)

ऊपर के समान नमूना डेटा का उपयोग करते हुए, कोड ऐसा दिखेगा:

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<String[]> item = new ArrayList<String[]>();
                    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();
        }
    }
}

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

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

27

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

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 में लिखते हैं:

<root>
  <entry id='1'>
    <string>hello world</string>
    <float1>1.0</float1>
    <float2>3.3</float2>
    <integer>4</integer>
  </entry>
  <entry id='2'>
    <string>goodbye world</string>
    <float1>1e9</float1>
    <float2>-3.3</float2>
    <integer>45</integer>
  </entry>
  <entry id='3'>
    <string>hello again</string>
    <float1>-1</float1>
    <float2>23.33</float2>
    <integer>456</integer>
  </entry>
  <entry id='4'>
    <string>hello world 3</string>
    <float1>1.40</float1>
    <float2>34.83</float2>
    <integer>4999</integer>
  </entry>
  <entry id='5'>
    <string>hello 2 world</string>
    <float1>9981.05</float1>
    <float2>43.33</float2>
    <integer>444</integer>
  </entry>
</root>

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


इसलिए आप पार्सिंग करने के लिए CSV लाइब्रेरी को कॉल कर सकते हैं और फिर मार्कअप बिल्डर का उपयोग कर सकते हैं। हो सकता है कि आप इसे दिखाने के लिए अपना उत्तर संपादित कर सकें।
पीटर केली

18

मेरे पास सामान्य रूप से CSV और फ्लैट फ़ाइलों के साथ काम करने के लिए एक ओपनसोर्स ढांचा है। शायद यह देखने लायक है: 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<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

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

और आपके पास पार्स की गई वस्तुओं का संग्रह होगा।

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


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

हां, मेरे पास तब से विकास जारी रखने का समय नहीं था लेकिन यह बहुत स्थिर है।
कोली

17

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

ध्यान दें: आपको इस कोड का उपयोग तब तक नहीं करना चाहिए जब तक आप यह नहीं जानते कि आप क्या करते हैं या आपको आगे की लाइब्रेरी (कुछ नौकरशाही परियोजनाओं में संभव है) का उपयोग करने का मौका नहीं है ... पुराने रनटाइम एनवायरनमेंट के लिए एक स्ट्रिंगर का उपयोग करें ...

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

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<String> headers = new ArrayList<String>();
boolean isHeader = true;
int count = 0;
int entryCount = 1;
xml.append("<root>");
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<entry id=\"");
        xml.append(entryCount);
        xml.append("\">");
        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</entry>");
        xml.append(lineBreak);
        entryCount++;
    }
}
xml.append("</root>");
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

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

<root>
    <entry id="1">
        <string>hello world</string>
        <float1>1.0</float1>
        <float2>3.3</float2>
        <integer>4</integer>
    </entry>
    <entry id="2">
        <string>goodbye world</string>
        <float1>1e9</float1>
        <float2>-3.3</float2>
        <integer>45</integer>
    </entry>
    <entry id="3">
        <string>hello again</string>
        <float1>-1</float1>
        <float2>23.33</float2>
        <integer>456</integer>
    </entry>
    <entry id="4">
        <string>hello world 3</string>
        <float1>1.40</float1>
        <float2>34.83</float2>
        <integer>4999</integer>
    </entry>
    <entry id="5">
        <string>hello 2 world</string>
        <float1>9981.05</float1>
        <float2>43.33</float2>
        <integer>444</integer>
    </entry>
</root>

15

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

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


14

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

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

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


14

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

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

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 = """<CLIENTS>
    <firstname> ${fields[2]} </firstname>
    <surname> ${fields[1]} </surname>
    <email> ${fields[9]} </email>
    <employeenumber> password </employeenumber>
    <title> ${fields[4]} </title>
    <phone> ${fields[3]} </phone>
    </CLIENTS>"""
}

7
CSV सरल है, लेकिन आमतौर पर कभी भी इतना सरल नहीं होता है कि अल्पविराम पर एक विभाजन पर्याप्त हो।
एलन क्रुएगर

12

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


8

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

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


7

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

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

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

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


7

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


4

जैक्सन प्रोसेसर परिवार के पास JSON ही नहीं, कई डेटा प्रारूपों के लिए बैकएंड भी हैं। इसमें XML ( https://github.com/FasterXML/jackson-dataformat-xml ) और CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ) बैकेंड दोनों शामिल हैं ।

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

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


3

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

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

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



3

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


2
यदि आपकी CSV फ़ाइल में कभी भी डेटा में उद्धृत कॉमा न हों, जो काफी सामान्य है।
एलन क्रुएगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.