জাভা লিব বা অ্যাপ্লিকেশনটি সিএসভিকে এক্সএমএল ফাইলে রূপান্তর করতে পারে? [বন্ধ]


114

জাভাতে কি এমন কোনও অ্যাপ্লিকেশন বা লাইব্রেরি আছে যা আমাকে একটি CSVডেটা ফাইলকে ফাইলে রূপান্তর করতে দেয় XML?

XMLট্যাগ সম্ভবত প্রথম কলামের শিরোনাম ধারণকারী সারি মাধ্যমে প্রদান করা হবে।


47
দেখে মনে হচ্ছে এসও-তে জাভা ট্যাগ সহ এটিই প্রথম প্রশ্ন।
পল ভার্গাস

8
@ পল কেবল এটিই নয়, এটি 123 টিও!
bjb568


1
@ bjb568 ওহ হাহা

4
এতে অবাক হওয়ার কিছু নেই যে এস-তে জাভার প্রথম পোস্টটি অফ-টপিক হিসাবে বন্ধ করা হয়েছিল: ডি
স্যার। হেজেহগ

উত্তর:


66

হতে পারে এটি সাহায্য করতে পারে: জেএসফা

আপনি এই সরঞ্জামটি দিয়ে সিএসভি ফাইলটি পড়তে পারেন এবং এটি এক্সএমএলে ক্রমিক করতে পারেন।


47

উপরের অন্যান্য হিসাবে, আমি এটি করার কোনও এক-পদক্ষেপের উপায় জানি না, তবে আপনি যদি খুব সাধারণ বাইরের লাইব্রেরি ব্যবহার করতে প্রস্তুত হন তবে আমি পরামর্শ দেব:

সিএসভি পার্স করার জন্য ওপেনসিএসভি (ছোট, সাধারণ, নির্ভরযোগ্য এবং সহজেই ব্যবহারযোগ্য)

এক্স স্ট্রিম থেকে পার্স / ক্রমিকায়িত এক্সএমএল (খুব সহজেই ব্যবহারযোগ্য, এবং সম্পূর্ণরূপে মানব পাঠযোগ্য এক্সএমএল তৈরি করা)

উপরের মতো একই নমুনা ডেটা ব্যবহার করে কোডটি দেখতে এমন হবে:

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();
        }
    }
}

নিম্নলিখিত ফলাফল উত্পাদন করা হচ্ছে: (এক্সস্ট্রিম ফলাফলের খুব সূক্ষ্ম সুরের অনুমতি দেয় ...)

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

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>

তবে কোডটি খুব সাধারণ পার্সিং করে (কোটায় নিযুক্ত বা পালানো কমাগুলি বিবেচনায় নিচ্ছে না) এবং এটি সম্ভাব্য অনুপস্থিত ডেটার জন্য অ্যাকাউন্ট করে না।


সুতরাং আপনি পার্সিং করতে একটি সিএসভি লাইব্রেরি কল করতে পারেন এবং তারপরে মার্কআপ বিল্ডারটি ব্যবহার করতে পারেন। এটি দেখানোর জন্য আপনি নিজের উত্তরটি সম্পাদনা করতে পারেন।
পিটার কেলি

18

আমার সিএসভি এবং সাধারণভাবে ফ্ল্যাট ফাইলগুলির সাথে কাজ করার জন্য একটি ওপেনসোর্স ফ্রেমওয়ার্ক রয়েছে। সম্ভবত এটি দেখার উপযুক্ত: জেফিলহেল্পার্স

সেই টুলকিট দিয়ে আপনি মটরশুটি ব্যবহার করে কোড লিখতে পারেন, যেমন:

@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। দুর্ভাগ্যক্রমে, আজকের হিসাবে, দেখে মনে হচ্ছে যে প্রকল্পটির ২০০৯-০৮-১১ এর পরে কোনও নতুন সংস্করণ নেই ...
স্টিফান

হ্যাঁ, আমার তখন থেকে বিকাশ চালিয়ে যাওয়ার সময় নেই তবে এটি খুব স্থিতিশীল।
কলি

17

এই সমাধানটির জন্য কোনও সিএসভি বা এক্সএমএল লাইব্রেরির প্রয়োজন নেই এবং আমি জানি, এটি কোনও অবৈধ অক্ষর এবং এনকোডিংয়ের সমস্যাগুলি পরিচালনা করে না তবে আপনি এতে আগ্রহীও হতে পারেন, তবে আপনার সিএসভি ইনপুট উপরের উল্লিখিত নিয়মগুলি না ভঙ্গ করে।

মনোযোগ দিন: আপনি এই কোডটি ব্যবহার করবেন না যদি না আপনি কী করেন বা না জানতেন তবে আরও লাইব্রেরি ব্যবহার করার সুযোগ নেই (কিছু কিছু আমলাতান্ত্রিক প্রকল্পে সম্ভব) ... পুরানো রানটাইম পরিবেশের জন্য একটি স্ট্রিংবফার ব্যবহার করুন ...

সুতরাং আমরা এখানে যেতে:

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());

ইনপুট টেস্ট.সিএসভি (এই পৃষ্ঠার অন্য উত্তর থেকে চুরি):

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

বড় পার্থক্যটি হ'ল জেএসফা এটি এনে দেয় যে এটি আপনার জাভা অবজেক্টগুলিকে সিএসভি / এক্সএমএল / ইত্যাদি ফাইলগুলিতে সিরিয়ালাইজ করতে পারে এবং জাভা অবজেক্টগুলিতে আবার ডিজিটালাইজ করতে পারে। এবং এটি টীকা দ্বারা চালিত যা আপনাকে আউটপুট উপর প্রচুর নিয়ন্ত্রণ দেয়।

জেফিলহেল্পারসটিও আকর্ষণীয় দেখায়।


14

আপনি কেন এটি করতে চাইবেন তা আমি বুঝতে পারি না। এটি প্রায় কার্গো কাল্ট কোডিংয়ের মতো শোনাচ্ছে।

কোনও সিএসভি ফাইলকে এক্সএমএলে রূপান্তর করা কোনও মান যুক্ত করে না। আপনার প্রোগ্রামটি ইতিমধ্যে CSV ফাইলটি পড়ছে, সুতরাং আপনার 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
সিএসভি সহজ, তবে সাধারণত কখনই এতটা সহজ হয় না যে কমাতে বিভাজনই যথেষ্ট।
অ্যালান ক্রুয়েগার

12

আপনি এক্সএসএলটি ব্যবহার করতে পারেন । এটি গুগল করুন এবং আপনি কয়েকটি উদাহরণ পাবেন যেমন সিএসভিকে এক্সএমএলে রূপান্তর করুন যদি আপনি এক্সএসএলটি ব্যবহার করেন তবে আপনি এক্সএমএলকে যে কোনও বিন্যাসে রূপান্তর করতে পারেন।


8

ড্যানিয়েল পার্কারের একটি ভাল গ্রন্থাগার সার্ভিংএক্সএমএলও রয়েছে যা প্রায় কোনও সাধারণ পাঠ্য বিন্যাসকে এক্সএমএল এবং ফিরে রূপান্তর করতে সক্ষম।

আপনার মামলার উদাহরণটি এখানে পাওয়া যাবে : এটি সিএসভি ফাইলে XML উপাদানটির নাম হিসাবে ক্ষেত্রের শিরোনাম ব্যবহার করে।


7

আমি জানিনা এমন কিছু নেই যা আপনি কমপক্ষে কিছুটা কোড না লিখে এটি করতে পারেন ... আপনার জন্য 2 টি পৃথক গ্রন্থাগার প্রয়োজন হবে:

  • একটি সিএসভি পার্সার ফ্রেমওয়ার্ক
  • একটি এক্সএমএল সিরিয়ালাইজেশন ফ্রেমওয়ার্ক

CSV পার্সার আমি সুপারিশ করব (যদি আপনি নিজের নিজের CSV পার্সার লিখতে একটু মজা না চান) হ'ল ওপেনসিএসভি (সিএসভি ডেটা পার্স করার জন্য সোর্সফর্জ প্রকল্প)

এক্সএমএল সিরিয়ালাইজেশন ফ্রেমওয়ার্ক এমন কিছু হওয়া উচিত যা আপনি বৃহত্তর (বা বিশাল) সিএসভি ফাইলকে এক্সএমএলে রূপান্তর করতে চান এমন ক্ষেত্রে স্কেল করতে পারে: আমার প্রস্তাবটি হ'ল সান জাভা স্ট্রিমিং এক্সএমএল পার্সার ফ্রেমওয়ার্ক ( এখানে দেখুন ) যা পুল-পার্সিং এবং সিরিয়ালাইজেশনকে অনুমতি দেয়।


7

যতদূর আমি জানি, আপনার জন্য এটি করার জন্য কোনও রেডিমেড লাইব্রেরি নেই, তবে সিএসভি থেকে এক্সএমএল অনুবাদ করতে সক্ষম একটি সরঞ্জাম তৈরি করতে কেবল আপনাকে একটি ক্রুড সিএসভি পার্সার লিখতে হবে এবং জেডিওএম হুক আপ করতে হবে (বা আপনার এক্সএমএল জাভা লাইব্রেরি পছন্দ) কিছু আঠালো কোড সহ।


4

জ্যাকসন প্রসেসর পরিবারের কাছে কেবল জেএসএন নয়, একাধিক ডেটা ফর্ম্যাটগুলির ব্যাকেন্ড রয়েছে। এর মধ্যে এক্সএমএল ( https://github.com/FasterXML/jackson-dataformat-xML ) এবং CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ) ব্যাকেন্ড উভয়ই অন্তর্ভুক্ত রয়েছে ।

রূপান্তরটি সিএসভি ব্যাকএন্ডের সাথে ইনপুট পড়ার উপর নির্ভর করবে, এক্সএমএল ব্যাকএন্ড ব্যবহার করে লিখবে। প্রতি সারি (সিএসভি) এন্ট্রিগুলির জন্য আপনার কাছে কোনও পোজো (বা সংজ্ঞায়িত করতে) থাকলে এটি করা সবচেয়ে সহজ। এটি কোনও কঠোর প্রয়োজনীয়তা নয়, কারণ সিএসভি থেকে প্রাপ্ত সামগ্রীতে "টাইপযুক্ত" ( Stringঅ্যারেগুলির অনুক্রম ) ও পড়তে পারে তবে এক্সএমএল আউটপুটটিতে আরও কিছুটা কাজ প্রয়োজন।

এক্সএমএল পক্ষের জন্য, Listসিরিয়াল করতে আপনার অ্যারে বা অবজেক্টগুলির একটি মোড়কের রুট অবজেক্টের প্রয়োজন ।


3

আমার একই সমস্যা ছিল এবং আমার একটি প্রকল্পের জন্য একটি সিএসভি ফাইলকে একটি এক্সএমএল ফাইলে রূপান্তর করার জন্য একটি অ্যাপ্লিকেশন দরকার ছিল, তবে নেটটিতে নিখরচায় এবং ভাল কিছুই পাইনি, তাই আমি নিজের জাভা সুইং সিএসভিটোএক্সএমএল অ্যাপ্লিকেশনটি কোড করেছিলাম।

এটি আমার ওয়েবসাইট থেকে পাওয়া যায় এখানে । আশা করি এটা তোমাকে সাহায্য করবে।

যদি তা না হয় তবে আপনি নিজের মতো করে নিজের মতো কোড করতে পারবেন; উত্স কোডটি জার ফাইলের অভ্যন্তরে রয়েছে সুতরাং এটি আপনার প্রয়োজনীয়তা পূরণ না করে যদি আপনার প্রয়োজন তেমন পরিবর্তন করুন।



3

এটি সমাধানের ক্ষেত্রে খুব মৌলিক বা সীমাবদ্ধ হতে পারে তবে আপনি String.split()এক্সএমএল উত্পন্ন করার জন্য প্রথম লাইনের ফলাফল অ্যারের কথা মনে করে ফাইলের প্রতিটি লাইনে একটি করতে পারেন নি এবং যথাযথ এক্সএমএল দিয়ে কেবল প্রতিটি লাইনের অ্যারে ডেটা ছিটিয়ে দিতে পারেন উপাদান একটি লুপ প্রতিটি পুনরাবৃত্তি প্যাডিং?


2
যদি আপনার সিএসভি ফাইলে কখনও ডেটাতে উদ্ধৃত কমা থাকে, যা মোটামুটি সাধারণ।
অ্যালান ক্রুয়েগার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.