30

次の列を含む CSV ファイルがあります: idfnametelephone、。lnameaddress

、およびデータメンバーを持つPersonクラスがあります。これらの列のみを CSV ファイルからオブジェクトにマップし、列を破棄したいと考えています。これどうやってするの?今後さらに列が追加されると、ソリューションはスケーリングする必要があります。また、列の位置に関係なく機能するはずです。idfnamelnamePersontelephoneaddress

理想的なソリューションでは、ユーザーは読み取る列のみを指定し、それは機能するはずです。

4

10 に答える 10

28

HeaderColumnNameTranslateMappingStrategyを使用できます。簡単にするために、CSV に 、 、 、 の列があるとIdFnameますTelephoneLnameAddress

CsvToBean<Person> csvToBean = new CsvToBean<Person>();

Map<String, String> columnMapping = new HashMap<String, String>();
columnMapping.put("Id", "id");
columnMapping.put("Fname", "fname");
columnMapping.put("Lname", "lname");

HeaderColumnNameTranslateMappingStrategy<Person> strategy = new HeaderColumnNameTranslateMappingStrategy<Person>();
strategy.setType(Person.class);
strategy.setColumnMapping(columnMapping);

List<Person> list = null;
CSVReader reader = new CSVReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("test.csv")));
list = csvToBean.parse(strategy, reader);

columnMapping は、列をPersonオブジェクトにマップします。

于 2013-02-20T09:44:27.313 に答える
4

opencsv について話すことはできませんが、これはSuper CSVを使用して簡単に達成できます。これには、部分的な読み取り(列を無視する) と Javabean への読み取りをサポートする2 つの異なるリーダーがあります。は、深いインデックスベースのマッピングにも対応しているため、ネストされたフィールドにマッピングできます。CsvDozerBeanReader

私たち (Super CSV チーム) は、Maven central または SourceForge から入手できるバージョン 2.0.0 をリリースしました。

アップデート

opencsv の代わりに Super CSV を使用する例 (作成した GitHub プロジェクトのテストに基づく) を次に示します。surroundingSpacesNeedQuotesサンプル CSV ファイルが有効ではないため、CSV 設定でフラグを有効にする必要があることに注意してください (フィールド間にスペースがあります - スペースは CSV のデータの一部と見なされます)。

ICsvBeanReader beanReader = null;
try {
    beanReader = new CsvBeanReader(
            new InputStreamReader(
                    ClassLoader.getSystemResourceAsStream("test.csv")),
            new CsvPreference.Builder(CsvPreference.STANDARD_PREFERENCE)
                    .surroundingSpacesNeedQuotes(true).build());

    List<String> columnsToMap = Arrays.asList("fname", "telephone", "id");

    // read the CSV header (and set any unwanted columns to null)
    String[] header = beanReader.getHeader(true);
    for (int i = 0; i < header.length; i++) {
        if (!columnsToMap.contains(header[i])) {
            header[i] = null;
        }
    }

    Person person;
    while ((person = beanReader.read(Person.class, header)) != null) {
        System.out.println(person);
    }

} finally {
    beanReader.close();
}
于 2012-11-23T05:46:46.420 に答える
0

SimpleFlatMapperは、csv のヘッダーを使用するか、どの列がどのプロパティにマップされるかを手動で指定することによって、簡単にはじめに csvを表示できます。

CsvParser
    .mapTo(MyObject.class)
    .forEach(file, System.out::println);
于 2014-09-26T09:11:59.707 に答える
0

jcvsdao 使用例

サンプル ユーザー CSV ファイル

Username, Email, Registration Date, Age, Premium User
Jimmy, jim@test.com, 04-05-2016, 15, Yes, M
Bob, bob@test.com, 15-01-2012, 32, No, M
Alice, alice@test.com, 22-09-2011, 24, No, F
Mike, mike@test.com, 11-03-2012, 18, Yes, M
Helen, helen@test.com, 02-12-2013, 22, Yes, F
Tom, tom@test.com, 08-11-2015, 45, No, M

CsvDao を作成する

CSVDaoFactory factory = new CSVDaoFactory("/csv-config.xml");
CSVDao dao = new CSVDao(factory);
List<UserDetail> users = dao.find(UserDetail.class);

csv-config.xml

<CSVConfig>
    <mappingFiles fileType="resource">
        <mappingFile>/example01/mapping/UserDetail.csv.xml</mappingFile>
    </mappingFiles>
</CSVConfig>

UserDetail.csv.xml

<CSVMapping className="org.jcsvdao.examples.example01.model.UserDetail" csvFile="csv-examples/example01/users.txt" delimiter="," ignoreFirstLine="true">
    <matchAll/>
    <properties>
        <property index="0" property="username" primaryKey="true"/>
        <property index="1" property="email"/>
        <property index="2" property="registrationDate" converter="myDateConverter"/>
        <property index="3" property="age"/>
        <property index="4" property="premiumUser" converter="yesNoConverter"/>
        <property index="5" property="gender" converter="myGenderConverter"/>
    </properties>
    <converters>
        <dateConverter converterName="myDateConverter" format="dd-MM-yyyy"/>
        <booleanConverter converterName="yesNoConverter" positive="Yes" negative="No"/>
        <customConverter converterName="myGenderConverter" converterClass="org.jcsvdao.examples.example01.converter.GenderCustomerConverter"/>
    </converters>
</CSVMapping>
于 2016-03-05T12:35:27.783 に答える
0

jcsvdao ( https://github.com/eric-mckinley/jcsvdao/ ) を見てください。これは休止状態スタイルのマッピング ファイルを使用し、1to1 および 1toMany の関係を処理できます。柔軟なマッチング戦略があるため、csv ファイルを所有していない場合に適しています。

于 2016-02-25T22:27:57.917 に答える