Java lib vagy az alkalmazás átalakítására CSV XML fájlt?

szavazat
95

Van egy meglévő alkalmazás vagy könyvtár Java , amely lehetővé teszi, hogy megtérít egy CSVadatfájlt a XMLfájlt?

A XMLcímkék lenne keresztül biztosított valószínűleg az első sorban tartalmazó oszlopfejléceknek.

A kérdést 01/08/2008 17:08
a forrás felhasználó
Más nyelveken...                            


16 válasz

szavazat
3

Ez lehet túl lúgos vagy korlátozni a megoldás, de nem csinál egy String.split()minden sorban a fájl, emlékezve az eredmény tömb első sorának generálni az XML, és csak köpött minden vonal array adat ki a megfelelő XML elemek padding minden iterációjának?

Válaszolt 01/08/2008 17:31
a forrás felhasználó

szavazat
60

Talán ez segíthet: JSefa

Elolvashatja CSV fájlba ezzel az eszközzel szerializálod azt az XML.

Válaszolt 01/08/2008 19:51
a forrás felhasználó

szavazat
13

Nem értem, miért szeretne csinálni. Úgy hangzik, mintha a rakomány kultusz kódolás.

Konvertálása CSV-fájl XML nem számol fel semmilyen értéket. A program már nem olvassa a CSV fájlt, így azt állítva, hogy szükség van az XML nem működik.

Másrészt, az olvasás a CSV-fájlt, ezzel valamit azokkal az értékekkel, majd szerializálásáról XML van értelme (na jó, mint az XML lehet értelme ...;)), de akkor állítólag már van egy eszköze szerializálásáról XML.

Válaszolt 01/08/2008 20:21
a forrás felhasználó

szavazat
7

Amennyire én tudom, nincs kész könyvtár ezt az Ön számára, de készít egy olyan eszköz, amely képes lefordítani CSV XML csak követeli meg, hogy levelet kapott nyers CSV elemzőt, és beköt JDOM (vagy az XML Java könyvtár választás) néhány ragasztó kódot.

Válaszolt 02/08/2008 20:06
a forrás felhasználó

szavazat
7

Nincs semmi, tudom, hogy lehet ezt anélkül, hogy legalább az írás egy kicsit ... kódszámú Szükséged lesz 2 külön könyvtárat:

  • A CSV Parser keret
  • Egy XML sorszámozás Framework

A CSV elemző azt ajánlom (kivéve, ha azt akarjuk, hogy egy kis móka írni a saját CSV elemző) van OpenCSV (A SourceForge Project parsolásra CSV-adatok)

Az XML sorszámozás Framework kell valamit, hogy lehet méretezni, ha azt akarjuk, hogy átalakítsa a nagy (vagy nagy) CSV-fájl XML: Saját ajánlás a Sun Java Streaming XML értelmező keret (Lásd itt ), amely lehetővé teszi, hogy húzza-elemzés és sorszámozás.

Válaszolt 04/08/2008 02:07
a forrás felhasználó

szavazat
24

Tudom, hogy kérte a Java, de ez tűnik számomra, mint egy feladatot jól illeszkedik egy programozási nyelv. Itt van egy gyors (nagyon egyszerű) megoldás írt Groovy.

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

Írások a következő 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>

A kód azonban nem nagyon egyszerű elemzés (figyelembe nem vevő jegyzett vagy megszökött vessző), és nem veszi figyelembe az esetleges hiányzó adatokat.

Válaszolt 09/08/2008 12:06
a forrás felhasználó

szavazat
15

Ez a megoldás nem igényel CSV vagy XML könyvtárak és tudom, hogy nem kezeli az illegális karakterek és a kódolási problémák, de lehet, hogy érdekel is, feltéve, hogy a CSV-bemenetet nem szakítja meg a fenti szabályokat.

Figyelem: ne használja ezt a kódot, ha tudja, mit csinál, vagy nem rendelkezik az esélye, hogy egy újabb könyvtárat (Előfordulhat, hogy bizonyos bürokratikus projektek) ... Használjon StringBuffer idősebb futási környezetek ...

Tehát itt vagyunk:

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

A bemeneti test.csv (ellopták egy másik választ ezen az oldalon):

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

A kapott kimenet:

<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>
Válaszolt 22/08/2008 00:17
a forrás felhasználó

szavazat
45

Ahogy a többi fent, nem tudom olyan egylépéses módja, de ha kész nagyon egyszerű külső könyvtárakat, azt javasoljuk:

OpenCsv az elemzés CSV (kicsi, egyszerű, megbízható és könnyen kezelhető)

XSTREAM elemezni / sorosításához XML (nagyon-nagyon könnyen használható, és megteremti teljesen ember által olvasható xml)

Az ugyanazon a mintán adatokat a fentiek szerint, kód nézne:

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

Előállítása a következő eredménnyel: (Xstream lehetővé teszi a nagyon finom hangolását az eredmény ...)

<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>
Válaszolt 10/09/2008 08:06
a forrás felhasználó

szavazat
3

A CSV rész, akkor lehet használni a kis könyvtár nyílt forráskódú

Válaszolt 16/09/2008 17:07
a forrás felhasználó

szavazat
17

Van egy opensource keretet dolgozó CSV és lapos fájlok általában. Lehet, hogy érdemes: JFileHelpers .

Ezzel eszköztár írhat kódot bab, mint például:

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

és aztán csak értelmezni a szöveges fájlok:

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

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

És akkor van egy gyűjtemény elemzett tárgyakat.

Remélem segít!

Válaszolt 28/09/2008 00:43
a forrás felhasználó

szavazat
8

Van is egy jó könyvtárnak ServingXML Daniel Parker, amely képes átalakítani szinte bármilyen egyszerű szöveges formátumban az XML és vissza.

A példa az Ön esetében megtalálható itt : használ fejléce mező CSV-fájlt az XML elem nevét.

Válaszolt 30/09/2008 22:22
a forrás felhasználó

szavazat
14

Megteheti ezt kivételesen könnyen használ Groovy, és a kód nagyon olvasható.

Alapvetően, a szöveg változó íródik contacts.xmlminden egyes sorban a contactData.csv, és a földeken tömb tartalmaz minden oszlop.

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>"""
}
Válaszolt 02/10/2008 07:08
a forrás felhasználó

szavazat
11

Jól jönne XSLT . Google, és talál néhány példát pl CSV XML Ha XSLT akkor majd átalakítani az XML, hogy bármilyen kívánt formátumot.

Válaszolt 16/10/2008 15:33
a forrás felhasználó

szavazat
14

A nagy különbség az, hogy JSefa hozza, hogy képes szerializálni a Java objektumok CSV / XML / etc fájlokat, és deserialize vissza java tárgyakat. És ez hajtja kommentárok amely megadja csomó felett a kimenet.

JFileHelpers is érdekesen néz ki.

Válaszolt 11/08/2010 06:49
a forrás felhasználó

szavazat
3

Ugyanez volt a probléma, és szükség van egy alkalmazás számára, hogy konvertálni a CSV fájlt egy XML fájl az egyik projekt, de semmit nem találtak szabad, és elég jó a net, úgyhogy kódolt saját Java Swing CSVtoXML alkalmazás.

Ez elérhető a honlapomon ITT . Remélem ez segít.

Ha nem, akkor könnyen kódot a saját, mint én; A forráskód belsejében jar fájlt úgy módosítani, mint amire szüksége van, ha nem tölti ki a követelménynek.

Válaszolt 16/04/2014 01:12
a forrás felhasználó

szavazat
4

Jackson processzor család háttérprogramokat több adat formátum, nem csak JSON. Ez magában foglalja mind az XML ( https://github.com/FasterXML/jackson-dataformat-xml ) és CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ) háttereket.

Conversion épülne olvasás bemenet CSV backend, írja az XML háttérben. Ez a legegyszerűbb csinálni, ha van (vagy lehet megadni) egy POJO a soronként (CSV) bejegyzéseket. Ez nem szigorú követelmény, mint a tartalom CSV lehet olvasni „típustalan” is (a szekvencia Stringtömbök), de ehhez kicsit több munkát az XML kimenet.

Az XML oldalon, akkor szükség van egy átalakító gyökér objektumot tartalmazó tömb vagy Listtárgyak sorosításához.

Válaszolt 29/04/2015 20:01
a forrás felhasználó

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