문제

기존 애플리케이션이나 라이브러리가 있습니까? 자바 그러면 내가 CSV 데이터 파일 XML 파일?

그만큼 XML 태그는 열 제목이 포함된 첫 번째 행을 통해 제공됩니다.

도움이 되었습니까?

해결책

어쩌면 이것이 도움이 될 수도 있습니다: JSefa

이 도구를 사용하면 CSV 파일을 읽고 XML로 직렬화할 수 있습니다.

다른 팁

위의 다른 사람들처럼 나는 이를 수행하는 한 단계 방법을 모르지만 매우 간단한 외부 라이브러리를 사용할 준비가 되었다면 다음을 제안합니다.

OpenCsv CSV 구문 분석용(작고 간단하며 안정적이고 사용하기 쉬움)

엑스스트림 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>

귀하가 Java를 요청했다는 것을 알고 있지만 이는 스크립팅 언어에 매우 적합한 작업이라고 생각됩니다.다음은 Groovy로 작성된 빠르고(매우 간단한) 솔루션입니다.

테스트.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])
            }
        }
    }
}

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

그러나 코드는 매우 간단한 구문 분석(따옴표나 이스케이프된 쉼표를 고려하지 않음)을 수행하며 데이터가 없을 가능성은 고려하지 않습니다.

저는 일반적으로 CSV 및 플랫 파일 작업을 위한 오픈 소스 프레임워크를 가지고 있습니다.아마도 살펴볼 가치가 있을 것입니다: JFileHelpers.

해당 툴킷을 사용하면 다음과 같은 Bean을 사용하여 코드를 작성할 수 있습니다.

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

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

결과 출력은 다음과 같습니다.

<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 파일로 직렬화하고 Java 개체로 다시 역직렬화할 수 있다는 것입니다.그리고 이는 출력에 대한 많은 제어를 제공하는 주석에 의해 구동됩니다.

JFileHelpers도 흥미로워 보입니다.

왜 이런 일을 하려는지 이해가 안 됩니다.거의 화물 컬트 코딩처럼 들립니다.

CSV 파일을 XML로 변환해도 값이 추가되지 않습니다.귀하의 프로그램은 이미 CSV 파일을 읽고 있으므로 XML이 필요하다고 주장하는 것은 작동하지 않습니다.

반면에 CSV 파일을 읽고 무엇 값을 사용하여 XML로 직렬화하는 것이 의미가 있습니다(글쎄, XML을 사용하는 것이 의미가 있는 만큼...;)) 하지만 이미 XML로 직렬화하는 방법이 있을 것입니다.

Groovy를 사용하면 이 작업을 매우 쉽게 수행할 수 있으며 코드는 매우 읽기 쉽습니다.

기본적으로 텍스트 변수는 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.Google에 검색하면 몇 가지 예를 찾을 수 있습니다. CSV를 XML로당신이 사용하는 경우 XSLT 그런 다음 XML을 원하는 형식으로 변환할 수 있습니다.

좋은 도서관도 있고 ServingXML Daniel Parker가 만든 이 프로그램은 거의 모든 일반 텍스트 형식을 XML로 변환하거나 그 반대로 변환할 수 있습니다.

귀하의 사례에 대한 예를 찾을 수 있습니다 여기:CSV 파일의 필드 제목을 XML 요소 이름으로 사용합니다.

최소한 약간의 코드를 작성하지 않고도 이 작업을 수행할 수 있는 방법은 없습니다.2개의 별도 라이브러리가 필요합니다.

  • CSV 파서 프레임워크
  • XML 직렬화 프레임워크

제가 추천하고 싶은 CSV 파서는(자신만의 CSV 파서를 작성하는 재미를 원하지 않는 한) OpenCSV(CSV 데이터 구문 분석을 위한 SourceForge 프로젝트)입니다.

XML 직렬화 프레임워크는 큰(또는 거대한) CSV 파일을 XML로 변환하려는 경우 확장할 수 있는 것이어야 합니다.제가 추천하는 것은 Sun Java Streaming XML Parser Framework입니다(참조: 여기) 풀 구문 분석 및 직렬화를 허용합니다.

내가 아는 한, 이 작업을 수행할 수 있는 기성 라이브러리는 없지만 CSV에서 XML로 변환할 수 있는 도구를 생성하려면 조잡한 CSV 파서를 작성하고 JDOM(또는 XML Java 라이브러리)을 연결하기만 하면 됩니다. 선택) 일부 글루 코드를 사용합니다.

Jackson 프로세서 제품군에는 JSON뿐만 아니라 다양한 데이터 형식을 위한 백엔드가 있습니다.여기에는 XML(https://github.com/FasterXML/jackson-dataformat-xml) 및 CSV(https://github.com/FasterXML/jackson-dataformat-csv/) 백엔드.

변환은 CSV 백엔드로 입력을 읽고 XML 백엔드를 사용하여 쓰기에 의존합니다.행별(CSV) 항목에 대한 POJO가 있거나 정의할 수 있는 경우 가장 쉬운 방법입니다.CSV의 콘텐츠는 "유형이 지정되지 않은" 내용으로도 읽을 수 있으므로 이는 엄격한 요구 사항은 아닙니다. String 배열), 하지만 XML 출력에는 약간의 추가 작업이 필요합니다.

XML 측의 경우 배열을 포함하려면 래퍼 루트 객체가 필요합니다. List 직렬화할 객체의 수입니다.

이는 너무 기본적이거나 제한적인 솔루션일 수 있지만 String.split() 파일의 각 줄에 XML을 생성하기 위한 첫 번째 줄의 결과 배열을 기억하고 루프의 각 반복을 채우는 적절한 XML 요소를 사용하여 각 줄의 배열 데이터를 뱉어내겠습니까?

나는 같은 문제를 겪었고 내 프로젝트 중 하나에 대해 CSV 파일을 XML 파일로 변환하는 응용 프로그램이 필요했지만 인터넷에서 충분히 좋은 무료 파일을 찾지 못했기 때문에 내 자신의 Java Swing CSVtoXML 응용 프로그램을 코딩했습니다.

내 웹 사이트에서 사용할 수 있습니다. 여기.그것이 당신에게 도움이 되기를 바랍니다.

그렇지 않다면 나처럼 쉽게 코딩할 수 있습니다.소스 코드는 jar 파일 내부에 있으므로 요구 사항을 충족하지 못하는 경우 필요에 따라 수정하십시오.

CSV 부분의 경우 다음을 사용할 수 있습니다. 나의 작은 오픈 소스 라이브러리

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top