Java lib veya uygulama XML dosyasına CSV dönüştürmek için?

oy
95

Varolan uygulama veya kütüphane var Java beni dönüştürmek sağlayacak CSVveri dosyası için XMLdosya mi?

XMLEtiketler muhtemelen ilk satır içeren sütun başlıkları üzerinden sağlanacak.

Oluştur 01/08/2008 saat 17:08
kaynak kullanıcı
Diğer dillerde...                            


16 cevaplar

oy
60

Belki bu yardımcı olabilir: JSefa

Bu araç ile CSV dosyasını okumak ve XML bunu serileştirebilirsiniz.

Cevap 01/08/2008 saat 19:51
kaynak kullanıcı

oy
45

Yukarıda diğerleri gibi, bunu yapmak için herhangi bir adım yolunu bilmiyorum ama çok basit harici kütüphaneleri kullanmaya hazır olup olmadığını, öneririm:

OpenCsv (küçük, basit, güvenilir ve kullanımı kolay) ayrıştırma CSV için

Xstream (kullanımı çok kolay ve tamamen insan okunabilir xml oluşturma) XML seri / ayrıştırmak için

Yukarıdaki aynı örnek verileri kullanarak, kod gibi görünecektir:

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

aşağıdaki sonucu üretmek: (Xstream ... sonucun çok ince ayar sağlar)

<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>
Cevap 10/09/2008 saat 08:06
kaynak kullanıcı

oy
24

Sana Java istedi biliyorum, ama bu bir komut dosyası dili için uygundur bir görev olarak beni oldukça etkiliyor. İşte Groovy yazılmış hızlı (çok basit) bir çözümdür.

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'a aşağıdaki XML yazar:

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

Ancak, kod çok basit ayrıştırma (hesaba aktardığı veya virgül kaçan içine almayan) ve mümkün bulunmayan verilere dikkate almaz yapar.

Cevap 09/08/2008 saat 12:06
kaynak kullanıcı

oy
17

Ben CSV ve genel olarak düz dosyalar ile çalışmak için bir opensource çerçeveye sahip. Belki de denenmeye değer: JFileHelpers .

Bu araç sayesinde gibi, fasulye kullanarak kod yazabilirsiniz:

@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;  
}

ve sonra sadece kullanarak metin dosyalarını ayrıştırmak:

FileHelperEngine<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

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

Ve ayrıştırılan nesneler topluluğu gerekecek.

Umarım yardımcı olur!

Cevap 28/09/2008 saat 00:43
kaynak kullanıcı

oy
15

Bu çözüm, herhangi CSV veya XML kütüphaneleri ihtiyacı yoktur ve, biliyorum, herhangi bir yasadışı karakterleri ve kodlama sorunlarını ele vermez, ama siz de o ilginizi çekebilir, CSV girişi yukarıda belirtilen kuralları ihlal etmez sağladı.

Dikkat: Eğer yapmanız ya da (bazı bürokratik projelerde olası) bir başka kütüphane kullanma şansı yok bilmedikçe ... Bu kodu kullanmak daha eski Runtime Ortamları için bir StringBuffer kullanın olmamalı ...

İşte başlıyoruz:

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

(Bu sayfadaki başka bir yanıt çalınan) giriş 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

Elde edilen çıkışı:

<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>
Cevap 22/08/2008 saat 00:17
kaynak kullanıcı

oy
14

Büyük fark olmasıdır JSefa getiriyor CSV / XML / vb dosyaları için java nesneleri seri ve java nesneleri geri serisini olmasıdır. Ve bu çıkış üzerinde kontrol çok verir ek açıklamaları ile tahrik oluyor.

JFileHelpers da ilginç görünüyor.

Cevap 11/08/2010 saat 06:49
kaynak kullanıcı

oy
14

Sen Groovy kullanarak son derece kolay bir şekilde yapabilirsiniz, ve kod çok okunabilir.

Temel olarak, metin değişkeni yazılır contacts.xmlher hat için contactData.csv, ve alanlar dizisi her sütun içerir.

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>"""
}
Cevap 02/10/2008 saat 07:08
kaynak kullanıcı

oy
13

Bunu neden isteyeyim anlamıyorum. Neredeyse kargo kült kodlama gibi geliyor.

XML için bir CSV dosyası dönüştürme herhangi bir değer katmaz. Programınız zaten CSV dosyası okuma, bu nedenle XML çalışmıyor gerektiğini savunuyor.

Öte yandan, CSV dosyasını okuma yapıyor On şey değerleriyle ve sonra XML seri hale mantıklı (iyi, ... mantıklı olabilir XML kullanarak kadar;)) ama sözde zaten bir araç olurdu XML seri hale.

Cevap 01/08/2008 saat 20:21
kaynak kullanıcı

oy
11

Sen kullanabilirsiniz XSLT . Google ve birkaç örnek örneğin bulacaksınız XML CSV kullanırsanız XSLT sonra ne istersen biçimi XML dönüştürebilirsiniz.

Cevap 16/10/2008 saat 15:33
kaynak kullanıcı

oy
8

İyi bir kütüphane de bulunmaktadır ServingXML XML ve arkasına hemen hemen herhangi bir düz metin biçiminde dönüştürmek yapabiliyor Daniel Parker tarafından.

Dava için örnek bulunabilir burada : Bu XML öğesi adı olarak CSV dosyasında alanın başlığını kullanır.

Cevap 30/09/2008 saat 22:22
kaynak kullanıcı

oy
7

Bunun en azından kod biraz yazmadan yapabilirsiniz ... Şu 2 ayrı kütüphane gerekir biliyorum hiçbir şey yoktur:

  • Bir CSV Ayrıştırıcı Çerçeve
  • Bir XML seri hale Çerçeve

(Kendi CSV Ayrıştırıcı yazmak için eğlenceli biraz olmasını istemiyorsanız) Ben öneriyoruz CSV ayrıştırıcı (CSV Verileri ayrıştırmak için SourceForge Projesi) OpenCSV olduğunu

Benim tavsiye Sun Java Akış XML Ayrıştırıcı Framework (Bkz: XML Serile Çerçeve XML için büyük (veya büyük) CSV dosyasını dönüştürmek istediğiniz durumda ölçeğe bir şey olmalı burada ) pull-ayrıştırma VE seri sağlar.

Cevap 04/08/2008 saat 02:07
kaynak kullanıcı

oy
7

Gibi bildiğim kadarıyla, hiçbir hazır sizin için bunu yapmak kütüphane, ama sadece bir ham CSV ayrıştırıcı yazmak ve JDOM (ya da XML Java kütüphanesi kanca gerektiren gerektiğini XML CSV tercüme edebilen bir araç üreten var bazı tutkal kodu ile seçim).

Cevap 02/08/2008 saat 20:06
kaynak kullanıcı

oy
4

Jackson işlemci ailesi, birden fazla veri formatları, sadece JSON için arka uç vardır. Bu, hem XML (dahil https://github.com/FasterXML/jackson-dataformat-xml ) ve CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ) arka uçları.

Dönüşüm, CSV arka ucuyla giriş okuma itimat XML arka uç kullanarak yazardı. Bu, şu anlama (ya tanımlayabilirsiniz) eğer başına satır (CSV) girişleri için bir POJO yapmak kolay yoldur. Bu CSV içerik "türsüz" de (bir dizi okunabilir şekilde, sıkı bir gereklilik değildir Stringdiziler), ancak XML çıktısı üzerinde biraz daha çalışma gerektirir.

XML tarafında için, diziyi içerecek şekilde bir sarıcı kök nesnesi gerekir veya Listnesnelerin seri hale getirmek için.

Cevap 29/04/2015 saat 20:01
kaynak kullanıcı

oy
3

Ben aynı problem vardı ve benim projelerden biri için bir XML dosyası için bir CSV dosyası dönüştürmek için bir uygulama gerekli, ama özgür ve net yeterince iyi bir şey bulamadık, bu yüzden ben kendi Java Swing CSVtoXML uygulamasını kodlu.

Bu benim web sitesinden kullanılabilir BURADA . O size yardımcı olacaktır Umut.

Değilse benim yaptığım gibi, kolayca kendi kodlayabiliriz; senin gereksinimi doldurmak yoksa istediğiniz kadar kavanoz dosya yüzden değiştirmek içindeki kaynak kodudur.

Cevap 16/04/2014 saat 01:12
kaynak kullanıcı

oy
3

CSV Bölüm için, kullanabilir benim küçük açık kaynak kütüphane

Cevap 16/09/2008 saat 17:07
kaynak kullanıcı

oy
3

Bu da temel veya bir çözümün sınırlı olabilir, ancak bir yapamadı String.split()XML oluşturmak için ilk satırın Sonuç dizisinin hatırlayarak, dosyanın her satırında ve sadece uygun XML ile dışarı her hat dizi verilerini tükürmek elemanlarının bir döngü, her tekrarında doldurma?

Cevap 01/08/2008 saat 17:31
kaynak kullanıcı

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