¿Java lib o aplicación para convertir archivos CSV a XML?

¿Hay una aplicación o biblioteca existente en Java que me permita convertir un archivo de datos CSV un archivo XML ?

Las tags XML se proporcionarán posiblemente a través de la primera fila que contenga encabezados de columna.

Tal vez esto podría ayudar: JSefa

Puede leer el archivo CSV con esta herramienta y serializarlo en XML.

Como los otros anteriores, no conozco ninguna manera de hacer eso en un solo paso, pero si está listo para usar bibliotecas externas muy simples, sugeriría:

OpenCsv para analizar CSV (pequeño, simple, confiable y fácil de usar)

Xstream para analizar / serializar XML (muy fácil de usar y crear xml totalmente legible para humanos)

Usando los mismos datos de muestra que el anterior, el código se vería así:

 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 item = new ArrayList(); 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(); } } } 

Produciendo el siguiente resultado: (Xstream permite un ajuste muy fino del resultado ...)

    string hello world   float1 1.0   float2 3.3   integer 4     string goodbye world   float1 1e9   float2 -3.3   integer 45     string hello again   float1 -1   float2 23.33   integer 456     string hello world 3   float1 1.40   float2 34.83   integer 4999     string hello 2 world   float1 9981.05   float2 43.33   integer 444    

Sé que solicitó Java, pero esto me parece una tarea adecuada para un lenguaje de scripting. Aquí hay una solución rápida (muy simple) escrita en 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]) } } } } 

Escribe el siguiente XML en stdout:

   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   

Sin embargo, el código realiza un análisis muy simple (sin tener en cuenta comas entre comillas o escapadas) y no tiene en cuenta posibles datos ausentes.

Tengo un marco de código abierto para trabajar con CSV y archivos sin formato en general. Tal vez vale la pena mirar: JFileHelpers .

Con ese conjunto de herramientas puede escribir código usando frijoles, como:

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

y luego simplemente analiza tus archivos de texto usando:

 FileHelperEngine engine = new FileHelperEngine(Customer.class); List customers = new ArrayList(); customers = engine.readResource( "/samples/customers-fixed.txt"); 

Y tendrás una colección de objetos analizados.

¡Espero que ayude!

Esta solución no necesita ninguna biblioteca CSV o XML y, como sé, no maneja ningún carácter ilegal ni problemas de encoding, pero también podría estar interesado en ella, siempre que su entrada CSV no rompa las reglas mencionadas anteriormente.

Atención: No debe usar este código a menos que sepa lo que hace o no tiene la posibilidad de utilizar una biblioteca adicional (posible en algunos proyectos burocráticos) … Use un StringBuffer para entornos de ejecución más antiguos …

Así que, aquí vamos:

 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 headers = new ArrayList(); boolean isHeader = true; int count = 0; int entryCount = 1; xml.append(""); 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"); 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(lineBreak); count++; } xml.append("\t"); xml.append(lineBreak); entryCount++; } } xml.append(""); System.out.println(xml.toString()); 

La entrada test.csv (robada de otra respuesta en esta página):

 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 

El resultado resultante:

   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   

No entiendo por qué querrías hacer esto. Suena casi como una encoding de culto de carga.

La conversión de un archivo CSV a XML no agrega ningún valor. Su progtwig ya está leyendo el archivo CSV, por lo que argumentar que necesita XML no funciona.

Por otro lado, leer el archivo CSV, hacer algo con los valores y luego serializarlo a XML tiene sentido (bueno, tanto como usar XML puede tener sentido …;)) pero supuestamente ya tienes un medio de serializando a XML.

La gran diferencia es que JSefa trae consigo que puede serializar sus objetos java a archivos CSV / XML / etc y puede deserializar a objetos java. Y es impulsado por anotaciones que le da mucho control sobre la salida.

JFileHelpers también se ve interesante.

Puede hacerlo de forma excepcionalmente fácil con Groovy, y el código es muy legible.

Básicamente, la variable de texto se escribirá en contacts.xml para cada línea en contactData.csv , y la matriz de campos contiene cada columna.

 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 = """  ${fields[2]}   ${fields[1]}   ${fields[9]}   password   ${fields[4]}   ${fields[3]}  """ } 

Podría usar XSLT . Google y encontrará algunos ejemplos, por ejemplo, CSV a XML. Si usa XSLT , puede convertir el XML al formato que desee.

También hay una buena biblioteca ServingXML de Daniel Parker, que puede convertir casi cualquier formato de texto plano a XML y viceversa.

El ejemplo para su caso se puede encontrar aquí : Utiliza el encabezado del campo en el archivo CSV como el nombre del elemento XML.

Por lo que yo sé, no hay una biblioteca preparada para hacer esto por ti, pero producir una herramienta capaz de traducir de CSV a XML solo requiere que escribas un analizador CSV crudo y conectes JDOM (o tu biblioteca XML Java de elección) con algún código de pegamento.

No hay nada que sepa que pueda hacer esto sin que al menos escriba un poco de código … Necesitará 2 bibliotecas separadas:

  • Un marco de analizador CSV
  • Un marco de serialización XML

El analizador de CSV que recomendaría (a menos que quiera divertirse un poco al escribir su propio CSV Parser) es OpenCSV (A SourceForge Project para analizar datos de CSV)

El XML Serialization Framework debería ser algo que pueda escalar en caso de que desee transformar un archivo CSV grande (o enorme) en XML: mi recomendación es el Framework SunMS XML Streaming XML (Consulte aquí ) que permite el análisis y la serialización pull.

Puede ser una solución demasiado básica o limitada, pero no podría hacer un String.split() en cada línea del archivo, recordar la matriz de resultados de la primera línea para generar el XML y simplemente escupir los datos de la matriz de cada línea con los elementos XML adecuados rellenando cada iteración de un ciclo?

La familia de procesadores Jackson tiene backends para múltiples formatos de datos, no solo JSON. Esto incluye los backend XML ( https://github.com/FasterXML/jackson-dataformat-xml ) y CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ).

La conversión se basaría en leer la entrada con el backend CSV, escribir usando back-end XML. Esto es más fácil de hacer si tiene (o puede definir) un POJO para entradas por fila (CSV). Este no es un requisito estricto, ya que el contenido de CSV también se puede leer “sin tipo” (una secuencia de matrices de String ), pero requiere un poco más de trabajo en la salida XML.

Para el lado XML, necesitaría un objeto raíz contenedor para contener una matriz o una List de objetos para serializar.

Tenía el mismo problema y necesitaba una aplicación para convertir un archivo CSV en un archivo XML para uno de mis proyectos, pero no encontré nada gratis y lo suficientemente bueno en la red, así que codifiqué mi propia aplicación Java Swing CSVtoXML.

Está disponible desde mi sitio web AQUÍ . Espero que te ayude.

De lo contrario, puede codificar fácilmente el suyo como yo lo hice; El código fuente está dentro del archivo jar así que modifíquelo como lo necesite si no cumple con sus requisitos.

Para la parte CSV, puede usar mi pequeña biblioteca de código abierto

    Intereting Posts