CSVファイルの読み取り(および書き込み)にJavaライブラリを推奨できますか? [閉まっている]

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

質問

コンマ区切り値(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 を使用します(ほとんどの用途に対応する事前定義された構成が多数あります)。

以下のコードは一目瞭然です。

  1. リーダーを作成します( Reader および設定を使用)

  2. (オプション)ヘッダーを読む

  3. Beanマッピングの構成

  4. 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のサポートに加えて

OpenCSV を使用して、JavaからCSVファイルの解析と書き込みの両方を成功させました。 JavaでExcel互換のスプレッドシートを読み書きする場合は、Apacheの POI ライブラリを使用します。 。

CVSBeans

を参照
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top