क्या जावा में कोई मौजूदा एप्लिकेशन या लाइब्रेरी है जो मुझे CSV
डेटा फ़ाइल को XML
फ़ाइल में बदलने की अनुमति देगा ?
XML
टैग संभवतः पहला स्तंभ शीर्षकों वाली पंक्ति के माध्यम से प्रदान की जाएगी।
क्या जावा में कोई मौजूदा एप्लिकेशन या लाइब्रेरी है जो मुझे CSV
डेटा फ़ाइल को XML
फ़ाइल में बदलने की अनुमति देगा ?
XML
टैग संभवतः पहला स्तंभ शीर्षकों वाली पंक्ति के माध्यम से प्रदान की जाएगी।
जवाबों:
अन्य लोगों के रूप में, मुझे ऐसा करने का कोई एक-चरणीय तरीका नहीं पता है, लेकिन यदि आप बहुत ही सरल बाहरी पुस्तकालयों का उपयोग करने के लिए तैयार हैं, तो मैं सुझाव दूंगा:
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>
मुझे पता है कि आपने जावा के लिए कहा था, लेकिन यह मुझे एक स्क्रिप्टिंग भाषा के अनुकूल कार्य के रूप में प्रभावित करता है। यहाँ ग्रोवी में लिखा गया एक त्वरित (बहुत सरल) समाधान है।
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 और फ्लैट फ़ाइलों के साथ काम करने के लिए एक ओपनसोर्स ढांचा है। शायद यह देखने लायक है: 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");
और आपके पास पार्स की गई वस्तुओं का संग्रह होगा।
उम्मीद है की वो मदद करदे!
इस समाधान को किसी भी 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>
बड़ा अंतर यह है कि JSefa लाता है कि यह आपके जावा ऑब्जेक्ट्स को CSV / XML / etc फाइलों में क्रमबद्ध कर सकता है और जावा ऑब्जेक्ट्स पर वापस जा सकता है। और यह एनोटेशन से प्रेरित है जो आपको आउटपुट पर बहुत नियंत्रण देता है।
JFileHelpers भी दिलचस्प लग रहा है।
मुझे समझ नहीं आता कि आप ऐसा क्यों करना चाहेंगे। यह लगभग कार्गो पंथ कोडिंग जैसा लगता है।
XML में CSV फ़ाइल परिवर्तित करने से कोई मूल्य नहीं जुड़ता है। आपका प्रोग्राम पहले से ही CSV फ़ाइल पढ़ रहा है, इसलिए यह तर्क देते हुए कि आपको XML की आवश्यकता नहीं है।
दूसरी ओर, CSV फ़ाइल को पढ़ना, मानों के साथ कुछ करना, और फिर XML पर क्रमबद्ध करना समझ में आता है (ठीक है, जितना XML का उपयोग करना समझ में आता है ...;)) लेकिन आप पहले से ही एक साधन होगा XML को क्रमबद्ध करना।
आप ग्रूवी का उपयोग करके असाधारण रूप से आसानी से कर सकते हैं, और कोड बहुत पठनीय है।
मूल रूप से, 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>"""
}
आप XSLT का उपयोग कर सकते हैं । Google इसे और आपको कुछ उदाहरण मिलेंगे जैसे कि CSV से XML। यदि आप XSLT का उपयोग करते हैं तो आप XML को जिस भी स्वरूप में चाहें बदल सकते हैं।
डैनियल पार्कर द्वारा अच्छी लाइब्रेरी सर्विंगएक्सएमएल भी है , जो लगभग किसी भी सादे पाठ प्रारूप को एक्सएमएल और बैक में परिवर्तित करने में सक्षम है।
आपके मामले का उदाहरण यहां पाया जा सकता है : यह XML तत्व नाम के रूप में CSV फ़ाइल में फ़ील्ड के शीर्षक का उपयोग करता है।
ऐसा कुछ भी नहीं है जो मुझे पता है कि आप ऐसा कर सकते हैं बिना कम से कम थोड़ा सा कोड लिखने के ... आपको 2 अलग लाइब्रेरी की आवश्यकता होगी:
CSV पार्सर मैं अनुशंसा करूंगा (जब तक कि आपको अपना खुद का CSV पार्सर लिखने के लिए थोड़ा सा मज़ा नहीं चाहिए) OpenCSV (CSV डेटा पार्स करने के लिए एक सोर्सफ़ॉर्ज़ प्रोजेक्ट) है
XML सीरियलाइज़ेशन फ्रेमवर्क कुछ ऐसी होनी चाहिए जो बड़े पैमाने पर (या विशाल) CSV फ़ाइल को XML में बदलना चाहती हो: मेरी सिफारिश है कि Sun Java स्ट्रीमिंग XML Parser फ्रेमवर्क ( यहाँ देखें ) जो पुल-पार्सिंग और क्रमांकन की अनुमति देती है।
जैक्सन प्रोसेसर परिवार के पास 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
ऑब्जेक्ट्स को क्रमबद्ध करने के लिए एक रैपर रूट ऑब्जेक्ट की आवश्यकता होगी ।
मेरे पास एक ही समस्या थी और मुझे अपनी एक परियोजना के लिए एक सीएसवी फ़ाइल को एक XML फ़ाइल में बदलने के लिए एक एप्लिकेशन की आवश्यकता थी, लेकिन नेट पर कुछ भी मुफ्त और अच्छा नहीं मिला, इसलिए मैंने अपने स्वयं के जावा स्विंग CSVtoXML एप्लिकेशन को कोडित किया।
यह मेरी वेबसाइट HERE से उपलब्ध है । आशा है इससे आपकी मदद होगी।
यदि नहीं, तो आप आसानी से अपना खुद का कोड बना सकते हैं जैसे मैंने किया; स्रोत कोड जार फ़ाइल के अंदर होता है, इसलिए इसे आवश्यकतानुसार संशोधित करें यदि यह आपकी आवश्यकता को पूरा नहीं करता है।
CSV पार्ट के लिए, आप मेरे छोटे से ओपन सोर्स लाइब्रेरी का उपयोग कर सकते हैं
यह किसी समाधान के लिए बहुत बुनियादी या सीमित हो सकता है, लेकिन क्या आप String.split()
एक्सएमएल उत्पन्न करने के लिए पहली पंक्ति के परिणाम सरणी को याद करते हुए, फ़ाइल की प्रत्येक पंक्ति पर नहीं कर सकते हैं , और उचित XML के साथ प्रत्येक पंक्ति के सरणी डेटा को थूक दें। तत्वों एक पाश के प्रत्येक चलना गद्दी?