51

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

4

8 に答える 8

38

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

私はまた、良いリンクを持つ別の質問に出くわしました .Java libまたはapp to convert CSV to XML file?

于 2008-10-14T10:14:04.687 に答える
23

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 ファイルなどから読み取ることができます)、区切り文字と引用符は設定を介して構成できます(その中には、いくつかの事前設定があります)。 -ほとんどの用途に対応する定義済みの構成)。

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

  1. リーダーを作成します (あなたReaderの好みで)

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

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

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

  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]]]

詳しくは

ウェブサイトでさらに多くの情報を見つけることができます!

于 2012-09-20T00:36:59.847 に答える
7

SuperCSVをお勧めします。使いやすく、必要なものはすべて揃っていました。

于 2008-10-18T10:03:42.520 に答える
4

ねえ、私はそのためのオープンソース プロジェクトを持っています: 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");

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

よろしくお願いします!

于 2008-10-14T11:33:37.303 に答える
3

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

于 2008-10-14T11:19:39.997 に答える
2

以前に尋ねられた 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 オブジェクトへのバインドなど、必要なことはすべて行っているようです。

于 2008-10-14T10:27:27.543 に答える
0

CVSBeanを参照してください

于 2011-09-26T20:15:50.603 に答える
0

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

于 2008-10-14T10:14:57.320 に答える