101


21

CSVをXMLファイルに変換するJavaのlibまたはアプリ?

CSV`データファイルを XML`ファイルに変換できる既存のアプリケーションやライブラリが_Java_にありますか?

`XML`タグは、おそらく列見出しを含む最初の行を通して提供されます。

16 Answer


64


たぶんこれは役立つかもしれません: JSefa

このツールでCSVファイルを読み、それをXMLにシリアル化することができます。


46


上記の他の人たちと同じように、私はそれを行うためのワンステップ方法を知りません、しかしあなたが非常に単純な外部ライブラリを使用する準備ができているならば、私はお勧めします:

CSVを解析するための OpenCsv(小型、単純、信頼性が高く使いやすい)

XMLを解析/シリアライズする* Xstream *(非常に使いやすく、完全に人間が読める形式のxmlを作成する)

上記と同じサンプルデータを使用すると、コードは次のようになります。

パッケージfr.megiste.test;

import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; import java.util.List;

au.com.bytecode.opencsv.CSVReaderをインポートします。

import com.thoughtworks.xstream.XStream;

パブリッククラスCsvToXml {

public static void main(String [] args){

String startFile = "./startData.csv"; String outFile = "./outData.xml";

{CSVReader reader = new CSVReader(new FileReader(startFile));を試してください。 String [] line = null;

String [] header = reader.readNext();

リストする= 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 = header [i];文字列val = line [i]; keyVal [0] =文字列。 keyVal [1] = val。 item.add(keyVal); out.add(item); }

XStream xstream = new XStream();

xstream.toXML(out、新しいFileWriter(outFile、false));

} catch(Exception e){// TODO自動生成されたcatchブロックe.printStackTrace(); }}}

次のような結果が生成されます。(Xstreamでは結果を非常に細かく調整できます…​)

文字列こんにちは世界float1 1.0 float2 3.3整数4文字列さようなら世界float1 1e9 float2 -3.3整数45文字列こんにちは再びfloat1 -1 float2 23.33整数456文字列こんにちは世界3 float1 1.40 float2 34.83整数4999文字列hello 2世界float1 9981.05 float2 43.33整数444


25


私はあなたがJavaを要求したことを知っています、しかしこれはスクリプト言語によく適したタスクとして私を襲います。 これがGroovyで書かれた簡単な(非常に簡単な)解決策です。

  • test.csv *

文字列、float1、float2、整数こんにちは世界、1.0,3.3,4さようなら世界、1e9、-3.3,45こんにちは、-1,23.33,456こんにちは世界3,1.40,34.83,4999こんにちは2世界、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  - > // 'entry'要素を 'id'属性で記述します(id:index 1){headers.eachWithIndex {heading、i  - > //各見出しを関連する内容で記述します"$ {heading}"(dataRow [i])}}}}

次のXMLを標準出力に書き込みます。

こんにちは世界1.0 3.3 4さよなら世界1e9 -3.3 45こんにちはもう一度-1 23.33 456こんにちは世界3 1.40 34.83 4999こんにちは世界9981.05 43.33 444

ただし、コードは非常に単純な解析を行い(引用符で囲まれたカンマやエスケープされたカンマを考慮に入れていない)、存在しない可能性のあるデータについては考慮されていません。


18


私は一般的にCSVファイルとフラットファイルを扱うためのオープンソースフレームワークを持っています。 たぶんそれは一見の価値があります: JFileHelpers

そのツールキットを使えば、次のようにBeanを使ってコードを書くことができます。

@FixedLengthRecord()パブリッククラスCustomer {@FieldFixedLength(4)public Integer custId;

@FieldAlign(alignMode = AlignMode.Right)@FieldFixedLength(20)public文字列名。

@FieldFixedLength(3)public整数評価。

@FieldTrim(trimMode = TrimMode.Right)@FieldFixedLength(10)@FieldConverter(converter = ConverterKind.Date、format = "dd-MM-yyyy")public Date addedDate;

@FieldFixedLength(3)@FieldOptional public String stockSimbol; }

それから、テキストファイルを次のように解析します。

FileHelperEngineエンジン= new FileHelperEngine(Customer.class);顧客リスト= new ArrayList();

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

そして、あなたはパースされたオブジェクトのコレクションを持つでしょう。

それが役立つことを願っています!


17


このソリューションはCSVやXMLライブラリを必要とせず、違法な文字やエンコードの問題も処理しませんが、CSV入力が上記の規則に違反しない限り、同様に興味があるかもしれません。

*注意:*自分が何をしているのかを知っているか、他のライブラリを使用する機会がない場合を除いて、このコードを使用しないでください(一部の官僚プロジェクトで可能)。 古いランタイム環境にStringBufferを使用する…​

だからここに行きます:

BufferedReader reader = new BufferedReader(新しいInputStreamReader(Csv2Xml.class.getResourceAsStream( "test.csv"))); StringBuilder xml = new StringBuilder(); String lineBreak = System.getProperty( "line.separator");文字列line = null。リストヘッダー= 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);カウント  ; xml.append( "\ t"); xml.append(lineBreak); entryCount; xml.append( ""); System.out.println(xml.toString());

入力test.csv(このページの別の回答から盗まれた):

文字列、float1、float2、整数こんにちは世界、1.0,3.3,4さようなら世界、1e9、-3.3,45こんにちは、-1,23.33,456こんにちは世界3,1.40,34.83,4999こんにちは2世界、9981.05,43.33、 444

結果の出力:

こんにちは世界1.0 3.3 4さよなら世界1e9 -3.3 45こんにちはもう一度-1 23.33 456こんにちは世界3 1.40 34.83 4999こんにちは世界9981.05 43.33 444


15


私はなぜあなたがこれをしたいのか理解していません。 まるで貨物カルトコーディングのようです。

CSVファイルをXMLに変換しても価値はありません。 あなたのプログラムはすでにCSVファイルを読んでいるので、XMLが必要だと主張してもうまくいきません。

その一方で、CSVファイルを読み、値を使って_何かをしてからXMLにシリアル化するのは意味があります(XMLを使用するのと同じくらい意味があるのと同じくらい…​ ;))しかし、あなたはおそらくXMLにシリアライズする手段をすでに持っているでしょう。


15


大きな違いは JSefaがもたらすのは、それがあなたのJavaオブジェクトをCSV / XML / etcファイルにシリアライズすることができて、Javaオブジェクトにデシリアライズすることができるということです。 そしてそれはアノテーションによって動かされます。

JFileHelpersも面白そうです。


14


Groovyを使って非常に簡単にこれを行うことができ、コードは非常に読みやすいです。

基本的に、テキスト変数は contactData.csv`の各行に対して contacts.xml`に書き込まれ、fields配列は各列を含みます。

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


12


あなたは* XSLT *を使うことができます。 グーグルそれとあなたはいくつかの例を見つけるでしょう。 CSV to XML * XSLT *を使用すれば、XMLを任意の形式に変換できます。


8


私の知る限りでは、これを行うための既製のライブラリはありませんが、CSVからXMLに変換できるツールを作成するには、大まかなCSVパーサーを作成してJDOM(またはXML Javaライブラリの選択))いくつかのグルーコード