データファイルをファイルに変換できるJavaの既存のアプリケーションまたはライブラリはありますか? CSV
XML
タグは、XML
おそらく列見出しを含む最初の行を通じて提供されます。
データファイルをファイルに変換できるJavaの既存のアプリケーションまたはライブラリはありますか? CSV
XML
タグは、XML
おそらく列見出しを含む最初の行を通じて提供されます。
たぶんこれが役立つかもしれません:JSefa
このツールで CSV ファイルを読み取り、XML にシリアル化できます。
上記の他の人たちと同じように、それを行うワンステップの方法はわかりませんが、非常に単純な外部ライブラリを使用する準備ができている場合は、次のことをお勧めします。
CSV を解析するためのOpenCsv (小さく、シンプルで、信頼性が高く、使いやすい)
XML を解析/シリアル化するXstream (非常に使いやすく、完全に人間が読める 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で記述された簡単な(非常に単純な)ソリューションです。
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])
}
}
}
}
次の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>
なぜあなたがこれをやりたいのか理解できません。カーゴ カルト コーディングのように聞こえます。
CSV ファイルを XML に変換しても、何の価値もありません。あなたのプログラムはすでに CSV ファイルを読んでいるので、XML が必要だと主張してもうまくいきません。
一方、CSV ファイルを読み取り、値を使用して何かを行い、XML にシリアル化することは理にかなっています (まあ、XML を使用するのと同じくらい理にかなっています... ;))。 XML へのシリアル化。
JSefaがもたらす大きな違いは、Java オブジェクトを CSV/XML/etc ファイルにシリアライズし、逆シリアライズして Java オブジェクトに戻すことができることです。また、出力を細かく制御できる注釈によって駆動されます。
JFileHelpers も面白そうです。
これは、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 を任意の形式に変換できます。
少なくとも少しのコードを書かなくてもこれを実行できることを私が知っていることは何もありません...2つの別個のライブラリが必要になります。
私がお勧めするCSVパーサー(独自のCSVパーサーを作成するのを少し楽しみたい場合を除く)は、OpenCSV(CSVデータを解析するためのSourceForgeプロジェクト)です。
XMLシリアル化フレームワークは、大きな(または巨大な)CSVファイルをXMLに変換する場合に拡張できるものである必要があります。プル解析とシリアル化を可能にするSun Java Streaming XMLパーサーフレームワーク(ここを参照)をお勧めします。
私の知る限り、これを行うための既製のライブラリはありませんが、CSV から XML に変換できるツールを作成するには、大雑把な CSV パーサーを作成し、JDOM (または XML Java ライブラリの XML Java ライブラリ) を接続するだけで済みます。選択) いくつかのグルー コードを使用します。
また、Daniel Parker による優れたライブラリServingXMLもあります。これは、ほぼすべてのプレーン テキスト形式を XML に変換して元に戻すことができます。
あなたのケースの例はここにあります:CSVファイルのフィールドの見出しをXML要素名として使用します。
String.split()
これは基本的すぎるか、解決策が限られている可能性がありますが、最初の行の結果配列を記憶して XML を生成し、各行の配列データを適切な XML で吐き出すだけで、ファイルの各行で実行できませんでしたループの各反復をパディングする要素?
CSV 部分については、私の小さなオープン ソース ライブラリを使用できます。