コンマ区切り値 (CSV) ファイルの行を読み取り、解析し、検証し、Java 値オブジェクト (JavaBeans) にマッピングするための Java ライブラリを推奨できますか?
8 に答える
http://opencsv.sourceforge.net/を使用 して成功しました
私はまた、良いリンクを持つ別の質問に出くわしました .Java libまたはapp to convert CSV to XML file?
Super CSVは、CSV ファイルの読み取り/解析、検証、および POJO へのマッピングに最適です。
私たち (Super CSV チーム) は新しいバージョンをリリースしました ( SourceForge または Maven からダウンロードできます)。
CSV ファイルの読み取り
次の例では(ディープ マッピングとインデックスベースのマッピングをサポートするビーン マッピングにDozerCsvDozerBeanReader
を使用する、リリースしたばかりの新しいリーダー) を使用しています。これは、当社のWeb サイトの例に基づいています。Dozer 機能が必要ない場合 (または単純なスタンドアロンの依存関係が必要な場合) は、代わりに使用できます (このコード例を参照してください)。CsvBeanReader
CSV ファイルの例
アンケートへの回答を表す CSV ファイルの例を次に示します。ヘッダーと 3 行のデータがあり、すべて 8 列です。
age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars
CSV から POJO へのマッピングの定義
CSV の各行はSurveyResponseクラスに読み込まれ、それぞれにAnswerのList があります。マッピングが機能するためには、クラスが有効な Javabean である必要があります (つまり、引数のないデフォルトのコンストラクターを持ち、各フィールドに getter/setter が定義されている)。
Super CSV では、単純な文字列配列でマッピングを定義します。配列の各要素は CSV ファイルの列に対応します。
あなたCsvDozerBeanMapper
が使用することができます:
単純なフィールド マッピング (例:
firstName
)ディープ マッピング (例
address.country.code
)インデックス付きマッピング (例
middleNames[1]
- 配列またはコレクションのゼロベースのインデックス)ディープ + インデックス付きマッピング (例
person.middleNames[1]
)
以下は、この例のフィールド マッピングです。これらの組み合わせを使用します。
private static final String[] FIELD_MAPPING = new String[] {
"age", // simple field mapping (like for CsvBeanReader)
"consentGiven", // as above
"answers[0].questionNo", // indexed (first element) + deep mapping
"answers[0].answer",
"answers[1].questionNo", // indexed (second element) + deep mapping
"answers[1].answer",
"answers[2].questionNo",
"answers[2].answer" };
変換と検証
Super CSV にはセル プロセッサの便利なライブラリがあり、これを使用して CSV ファイルの文字列を他のデータ型 (日付、整数など) に変換したり、制約の検証 (必須/オプション、正規表現一致、範囲チェックなど) を実行したりできます。 .
セル プロセッサの使用は完全にオプションです。セル プロセッサを使用しない場合、CSV の各列は文字列になるため、各フィールドも文字列である必要があります。
以下は、この例のセル プロセッサの構成です。フィールド マッピングと同様に、配列の各要素は CSV 列を表します。セル プロセッサが CSV データをフィールドのデータ型に変換する方法と、それらを連結する方法を示します。
final CellProcessor[] processors = new CellProcessor[] {
new Optional(new ParseInt()), // age
new ParseBool(), // consent
new ParseInt(), // questionNo 1
new Optional(), // answer 1
new ParseInt(), // questionNo 2
new Optional(), // answer 2
new ParseInt(), // questionNo 3
new Optional() // answer 3
};
読む
Super CSV での読み取りは非常に柔軟です。独自のものを提供しReader
(ファイル、クラスパス、zip ファイルなどから読み取ることができます)、区切り文字と引用符は設定を介して構成できます(その中には、いくつかの事前設定があります)。 -ほとんどの用途に対応する定義済みの構成)。
以下のコードは一目瞭然です。
リーダーを作成します (あなた
Reader
の好みで)(オプション) ヘッダーを読む
Bean マッピングを構成する
(ファイルの終わり)
read()
を取得するまで呼び出し続けますnull
リーダーを閉じる
コード:
ICsvDozerBeanReader beanReader = null;
try {
beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
CsvPreference.STANDARD_PREFERENCE);
beanReader.getHeader(true); // ignore the header
beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);
SurveyResponse surveyResponse;
while( (surveyResponse =
beanReader.read(SurveyResponse.class, processors)) != null ) {
System.out.println(
String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
beanReader.getLineNumber(), beanReader.getRowNumber(),
surveyResponse));
}
} finally {
if( beanReader != null ) {
beanReader.close();
}
}
出力:
lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]
詳しくは
ウェブサイトでさらに多くの情報を見つけることができます!
SuperCSVをお勧めします。使いやすく、必要なものはすべて揃っていました。
ねえ、私はそのためのオープンソース プロジェクトを持っています: JFileHelpers。主な利点は、Java Annotations を使用していることだと思います。以下をご覧ください。
この 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;
}
そして、このファイルを解析したい:
....|....1....|....2....|....3....|....4
1 Antonio Pereira 10012-12-1978ABC
2 Felipe Coury 201-01-2007
3 Anderson Polga 4212-11-2007DEF
あなたがしなければならないのはこれだけです:
FileHelperEngine<Customer> engine =
new FileHelperEngine<Customer>(Customer.class);
List<Customer> customers =
new ArrayList<Customer>();
customers = engine.readResource(
"/samples/customers-fixed.txt");
また、マスター/詳細、日付と形式の変換などもサポートしています。どう考えているか教えてください!
よろしくお願いします!
Flatpackは風変わりな CSV ファイル (エスケープ、引用符、不正なレコードなど) の処理に非常に優れていることがわかりました。
以前に尋ねられた CSV ファイルから XML への質問は、私のすべての質問に答えているようです。
OpenCSV ( http://opencsv.sourceforge.net/ ) も、列位置マッピング戦略を使用して JavaBeans にバインドします。
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);
JSEFA ( http://jsefa.sourceforge.net ) も、FLR と XML のサポートに加えて、特に Java オブジェクトへのバインドなど、必要なことはすべて行っているようです。
CVSBeanを参照してください
OpenCSVを使用して、Java からの CSV ファイルの解析と書き込みの両方に成功しました。Excel 互換のスプレッドシートを Java で読み書きしたい場合は、ApacheのPOIライブラリが最適です。