جافا lib أو التطبيق لتحويل CSV إلى ملف XML?[مغلقة]

StackOverflow https://stackoverflow.com/questions/123

  •  08-06-2019
  •  | 
  •  

سؤال

هل هناك تطبيق القائمة أو المكتبة جافا والتي سوف تسمح لي أن تحويل CSV ملف البيانات إلى XML الملف ؟

على XML العلامات ستقدم خلال وربما أول صف يحتوي على عمود العناوين.

هل كانت مفيدة؟

المحلول

ربما هذا قد تساعد: JSefa

يمكنك قراءة ملف CSV مع هذه الأداة و تسلسل إلى XML.

نصائح أخرى

مثل غيرهم أعلاه, أنا لا أعرف أي خطوة واحدة طريقة للقيام بذلك ، ولكن إذا كنت على استعداد لاستخدام بسيطة جدا من المكتبات الخارجية ، أود أن أقترح:

OpenCsv لتحليل CSV (صغيرة وبسيطة وموثوق بها وسهلة الاستخدام)

Xstream تحليل/تسلسل XML (جدا جدا سهلة الاستخدام, وخلق الإنسان بالكامل للقراءة 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<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>

انا اعرف انك طلبت جافا, ولكن هذا يبدو لي مهمة تناسب لغة البرمجة.هنا هو وسيلة سريعة (بسيط جدا) الحل مكتوب في رائع.

الاختبار.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.رائع

#!/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 إلى المعياري:

<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 الإدخال لا كسر القواعد المذكورة أعلاه.

الاهتمام: يجب عدم استخدام هذا الرمز إلا إذا كنت تعرف ماذا كنت تفعل أو لا تتاح لهم الفرصة لاستخدام مزيد من مكتبة (ممكن في بعض البيروقراطية المشاريع)...استخدام 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());

المدخلات الاختبار.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 يجلب في أنه يمكن إجراء تسلسل java الكائنات إلى CSV/XML/etc الملفات و إلغاء تسلسل العودة إلى كائنات جافا.و انها مدفوعة من قبل الشروح التي تمنحك الكثير من السيطرة على الإخراج.

JFileHelpers أيضا تبدو مثيرة للاهتمام.

أنا لا أفهم لماذا كنت تريد أن تفعل هذا.يبدو تقريبا مثل الطائفة البضائع ترميز.

تحويل ملف CSV إلى XML لا تضيف أي قيمة.البرنامج هو بالفعل قراءة ملف 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.جوجل سوف تجد بعض الأمثلة على سبيل المثال CSV إلى XML إذا كنت تستخدم XSLT ثم يمكنك تحويل XML إلى أي صيغة تريد.

وهناك أيضا مكتبة جيدة ServingXML دانيال باركر ، التي هي قادرة على تحويل ما يقرب من أي شكل نص عادي إلى XML و الظهر.

مثال على الحالة الخاصة بك يمكن العثور عليها هنا:ويستخدم عنوان الحقل في ملف CSV كما XML اسم العنصر.

لا يوجد شيء أعرف أنه يمكن أن تفعل هذا على الأقل كتابة قليلا من التعليمات البرمجية...سوف تحتاج 2 منفصلة المكتبة:

  • CSV محلل إطار
  • XML التسلسل إطار

CSV محلل أنصح (إلا إذا كنت تريد أن يكون قليلا من المرح إلى الكتابة الخاصة بك CSV محلل) هو OpenCSV (أ سورس مشروع تحليل البيانات CSV)

XML التسلسل الإطار يجب أن يكون هناك شيء يمكن أن النطاق في حال كنت ترغب في تحويل كبيرة (أو كبيرة) ملف CSV إلى XML:توصيتي هي الشمس جافا تدفق محلل XML الإطار (انظر هنا) الذي يتيح سحب تحليل و التسلسل.

بقدر ما أعرف, لا يوجد الجاهزة المكتبة للقيام بذلك بالنسبة لك, ولكن إنتاج أداة قادرة على ترجمة من CSV إلى XML فقط تتطلب منك كتابة الخام CSV محلل وربط JDOM (أو XML جافا مكتبة الاختيار) مع بعض الغراء رمز.

جاكسون عائلة المعالج قد الخلفيات البيانات متعددة الأشكال ، ليس فقط JSON.وهذا يشمل كل XML (https://github.com/FasterXML/jackson-dataformat-xml) و CSV (https://github.com/FasterXML/jackson-dataformat-csv/) الخلفيات.

التحويل تعتمد على قراءة المدخلات مع CSV الخلفية, الكتابة باستخدام XML الخلفية.هذا هو أسهل أن تفعل إذا كان لديك (أو تحديد) أ POJO لكل صف (CSV) الإدخالات.هذه ليست صارمة الشرط من حيث المحتوى من CSV قد تكون قراءة "مصنف" وكذلك (تسلسل String المصفوفات) ، ولكن يتطلب المزيد من العمل على مخرجات XML.

لـ XML الجانب, كنت في حاجة الى المجمع الكائن الجذر تحتوي على مجموعة أو List من الكائنات تسلسل.

قد يكون هذا أيضا الأساسي أو محدودة من الحل, ولكن لا تفعل String.split() في كل سطر من الملف ، وتذكر نتيجة مجموعة من السطر الأول إلى إنشاء ملف XML فقط يبصقون كل سطر مجموعة البيانات مع XML الصحيح عناصر الحشو كل التكرار من حلقة ؟

كان عندي نفس المشكلة و يحتاج تطبيق لتحويل ملف CSV إلى ملف XML من المشاريع ، ولكن لم تجد أي شيء مجاني و جيد بما فيه الكفاية على النت, لذا مشفرة بلدي جافا سوينغ CSVtoXML التطبيق.

وهو متاح من موقع الويب الخاص بي هنا.نأمل أن تساعدك.

إن لم يكن, يمكنك بسهولة التعليمات البرمجية الخاصة بك مثل ما فعلت ؛ شفرة المصدر هو داخل ملف jar لذلك تعديله كما تحتاج إذا كان لا يسد الاحتياجات الخاصة بك.

ملف CSV جزء ، يمكنك استخدام بلدي قليلا مكتبة مفتوحة المصدر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top