web-dev-qa-db-ja.com

CSVファイルの読み取り(および書き込み)のためにJavaライブラリを推奨しますか?

Javaカンマ区切り値(CSV)ファイル内の行をJava値オブジェクト(JavaBeans)に読み取り、解析、検証、マッピングするためのライブラリ)を推奨できますか?

48
Vihung

http://opencsv.sourceforge.net/ を使用して成功しました

また、リンクが良好な別の質問に出会いました: Java libまたはappはCSVをXMLファイルに変換しますか?

37
Gary McWilliams

スーパーCSV は、CSVファイルのPOJOへの読み取り/解析、検証、マッピングに最適です!

私たち(Super CSVチーム)は新しいバージョンをリリースしました(SourceForgeまたはMavenから ダウンロード できます)。

CSVファイルの読み取り

次の例では、CsvDozerBeanReader(リリースしたばかりの新しいリーダーで、ディープマッピングとインデックスベースのマッピングサポートを使用したBeanマッピングに Dozer を使用します)-の例に基づいています ウェブサイト 。 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 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ファイルなどから読み取ることができます)を指定し、区切り文字と引用文字は 設定 (ほとんどの用途に対応する事前定義された構成がいくつかあります)。

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

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

  2. (オプション)ヘッダーを読み取ります

  3. Beanマッピングを構成する

  4. null(ファイルの終わり)を取得するまでread()を呼び出し続けます

  5. リーダーを閉じます

コード:

_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 !でさらに多くの情報を見つけることができます!

23
James Bassett

SuperCSV をお勧めします。使い方は簡単で、必要なことはすべてやりました。

7
Domchi

ちょっと、そのためのオープンソースプロジェクトがあります: 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");

また、マスター/ディテール、日付と形式の変換などをサポートしています。どう考えているか教えてください!

宜しくお願いします!

4
kolrie

Flatpack は、風変わりなCSVファイル(エスケープ、引用、不良レコードなど)の処理に非常に優れていることがわかりました。

3
ddimitrov

以前に尋ねられた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オブジェクトへのバインド)に必要なすべてを行うようです。

2
Vihung

CVSBeans を参照してください

0
Paul Croarkin

Java with OpenCSV からのCSVファイルの解析と書き込みの両方で成功しました。JavaでExcel互換スプレッドシートの読み取りまたは書き込みを行う場合は、 [〜#〜] poi [〜#〜] Apacheのライブラリを使用する方法です。

0
Steve Moyer