Javaカンマ区切り値(CSV)ファイル内の行をJava値オブジェクト(JavaBeans)に読み取り、解析、検証、マッピングするためのライブラリ)を推奨できますか?
http://opencsv.sourceforge.net/ を使用して成功しました
また、リンクが良好な別の質問に出会いました: Java libまたはappはCSVをXMLファイルに変換しますか?
スーパーCSV は、CSVファイルのPOJOへの読み取り/解析、検証、マッピングに最適です!
私たち(Super CSVチーム)は新しいバージョンをリリースしました(SourceForgeまたはMavenから ダウンロード できます)。
次の例では、CsvDozerBeanReader
(リリースしたばかりの新しいリーダーで、ディープマッピングとインデックスベースのマッピングサポートを使用したBeanマッピングに Dozer を使用します)-の例に基づいています ウェブサイト 。 Dozer機能が必要ない場合(または単純なスタンドアロンの依存関係が必要な場合)は、代わりにCsvBeanReader
を使用できます(これを参照してください コード例 )。
以下は、調査への回答を表す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の各行は SurveyResponse クラスに読み込まれ、各クラスには Answer sのリストがあります。マッピングが機能するためには、クラスは有効なJavabeanである必要があります(つまり、デフォルトの引数なしのコンストラクターがあり、各フィールドにゲッター/セッターが定義されている必要があります)。
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マッピングを構成する
null
(ファイルの終わり)を取得するまでread()
を呼び出し続けます
リーダーを閉じます
コード:
_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]]]
_
website !でさらに多くの情報を見つけることができます!
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");
また、マスター/ディテール、日付と形式の変換などをサポートしています。どう考えているか教えてください!
宜しくお願いします!
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オブジェクトへのバインド)に必要なすべてを行うようです。
CVSBeans を参照してください
Java with OpenCSV からのCSVファイルの解析と書き込みの両方で成功しました。JavaでExcel互換スプレッドシートの読み取りまたは書き込みを行う場合は、 [〜#〜] poi [〜#〜] Apacheのライブラリを使用する方法です。