CSVファイルの読み取り(および書き込み)にJavaライブラリを推奨できますか? [閉まっている]
質問
コンマ区切り値(CSV)ファイルの行の読み取り、解析、検証、およびマッピングをJava値オブジェクト(JavaBeans)にJavaライブラリを推奨できますか?
解決
使用しました http://opencsv.sourceforge.net/ 成功しました
また、リンクが良好な別の質問に出くわしました。 CSVをXMLファイルに変換するJava libまたはアプリ?
他のヒント
スーパーCSV は、CSVファイルの読み取り/解析、検証、およびPOJOへのマッピングに最適な選択肢です。
私たち(Super CSVチーム)は新しいバージョンをリリースしました(ダウンロードできます) SourceForgeまたはMavenから)。
CSVファイルの読み取り
次の例では、 CsvDozerBeanReader
を使用します( Dozer ディープマッピングおよびインデックスベースのマッピングをサポートするBeanマッピングの場合)-ウェブサイトの例に基づいています。 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に読み込まれますクラス。各クラスにはのリストがあります回答 s。マッピングが機能するためには、クラスは有効なJavabeanである必要があります(つまり、デフォルトの引数なしコンストラクターがあり、各フィールドにゲッター/セッターが定義されています)。
Super CSVでは、単純な文字列配列でマッピングを定義します-配列の各要素はCSVファイルの列に対応します。
CsvDozerBeanMapper
を使用すると、次を使用できます。
-
単純なフィールドマッピング(例:
firstName
) -
深いマッピング(例:
address.country.code
) -
インデックス付きマッピング(例:
middleNames [1]
-配列またはコレクションのゼロベースのインデックス) -
deep + indexed mapping(例:
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ファイルなどから読み取ることができます)、区切り文字と引用文字は構成可能です preferences を使用します(ほとんどの用途に対応する事前定義された構成が多数あります)。
以下のコードは一目瞭然です。
-
リーダーを作成します(
Reader
および設定を使用) -
(オプション)ヘッダーを読む
-
Beanマッピングの構成
-
null
(ファイルの終わり)を取得するまでread()
を呼び出し続けます
SuperCSV を推奨できます。使い方は簡単で、必要なことはすべてやりました。
ねえ、そのためのオープンソースプロジェクトがあります: JFileHelpers 。主な利点は、Javaアノテーションを使用していることだと思います:
この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");
また、マスター/ディテール、日付と形式の変換などをサポートしています。ご意見をお聞かせください!
よろしく!
フラットパックは、風変わりな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 )も、必要なすべてのことを行うようです-特にJavaオブジェクトへのバインド-FLRおよびXMLのサポートに加えて