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

वोट
95

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

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

01/08/2008 को 17:08
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


16 जवाब

वोट
60

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

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

01/08/2008 को 19:51
का स्रोत उपयोगकर्ता

वोट
45

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

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

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

उपर दिए गए नमूना डेटा का उपयोग करना, कोड दिखाई देगा:

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>
10/09/2008 को 08:06
का स्रोत उपयोगकर्ता

वोट
24

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

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])
            }
        }
    }
}

stdout के लिए निम्न XML लिखते हैं:

<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>

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

09/08/2008 को 12:06
का स्रोत उपयोगकर्ता

वोट
17

मैं सीएसवी और सामान्य रूप से फ्लैट फाइलों के साथ काम के लिए एक खुला स्रोत रूपरेखा है। शायद यह देख लायक है: 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");

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

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

28/09/2008 को 00:43
का स्रोत उपयोगकर्ता

वोट
15

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

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

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

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>
22/08/2008 को 00:17
का स्रोत उपयोगकर्ता

वोट
14

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

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

11/08/2010 को 06:49
का स्रोत उपयोगकर्ता

वोट
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>"""
}
02/10/2008 को 07:08
का स्रोत उपयोगकर्ता

वोट
13

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

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

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

01/08/2008 को 20:21
का स्रोत उपयोगकर्ता

वोट
11

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

16/10/2008 को 15:33
का स्रोत उपयोगकर्ता

वोट
8

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

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

30/09/2008 को 22:22
का स्रोत उपयोगकर्ता

वोट
7

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

  • एक सीएसवी पार्सर फ्रेमवर्क
  • एक एक्सएमएल क्रमबद्धता फ्रेमवर्क

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

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

04/08/2008 को 02:07
का स्रोत उपयोगकर्ता

वोट
7

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

02/08/2008 को 20:06
का स्रोत उपयोगकर्ता

वोट
4

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

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

एक्सएमएल पक्ष के लिए, आप सरणी शामिल करने के लिए एक आवरण जड़ वस्तु की आवश्यकता होगी या Listवस्तुओं के क्रमानुसार करने।

29/04/2015 को 20:01
का स्रोत उपयोगकर्ता

वोट
3

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

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

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

16/04/2014 को 01:12
का स्रोत उपयोगकर्ता

वोट
3

सीएसवी भाग के लिए, आप उपयोग कर सकते हैं मेरी छोटी खुला स्रोत पुस्तकालय

16/09/2008 को 17:07
का स्रोत उपयोगकर्ता

वोट
3

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

01/08/2008 को 17:31
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more