0

私はJavaでクラスを持っています:

class data {
  private String id;
  private String name;
  private String phone;
}

CSVファイルからデータを入力する必要があります。ただし、CSV ファイルのすべての列が必須というわけではなく、順序が異なる場合もあります。

CSV の例 1:

ID、電話番号、名前
1,421904123456、ピーター
2,420558811225、ジョン
...

CSV の例 2:

ID、名前
3、アレックス
8、ステファン

それを行う方法について何かアドバイスはありますか?

4

3 に答える 3

1

ファイルの読み取りにはOpenCSVを使用します。最初の行を読み取るときに、列の順序を保存します。次の行を読むと ( String[]1 行に 1 つ表示されます)、最初の行の情報を使用して配列から要素を取得します。

これは、OpenCSV ドキュメントの例です。

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
    // nextLine[] is an array of values from the line
    System.out.println(nextLine[0] + nextLine[1] + "etc...");
}
于 2012-12-11T13:21:29.393 に答える
1
  1. 最初の行を読んでヘッダー情報を取得します。
  2. ヘッダー情報に基づいて、読み取ったフィールドのセッターを Method[] 配列に入力します。
  3. 後続の各行に対して、Data クラスのオブジェクト obj を作成し、行の各値に対して、新しく作成されたオブジェクトと rad 値をパラメーターとして渡す配列のすべての要素に対して invoke() を呼び出します。

JDBC を介して CSV ファイルで SQL を実行し、jdbc を使用して CSV をクエリすることもできます。

また、クラスはDataの代わりにある必要がありdataます。

于 2012-12-11T13:25:00.620 に答える
0

Java 用の別のオープン ソース CSV API であるSuper CSVは、この機能をすぐに使用できるようにサポートしています。部分読み取りの例を参照してください。

ヘッダー (つまり、最初の行) を使用して、Bean にマップするフィールドを決定します。したがって、両方のファイルを正常に読み取ることができます。

Bean で文字列だけでなく他のタイプ (日付、整数など) を使用していた場合、Super CSV はセル プロセッサAPIを使用して、必要なすべての変換/変換を実行できます。

たとえば、次のコードは両方のファイルを読み取りますが、CSV ファイルに存在するフィールドのみを入力します。

ICsvBeanReader beanReader = null;
try {
        beanReader = new CsvBeanReader(new FileReader(CSV_FILENAME), 
                CsvPreference.STANDARD_PREFERENCE);

        // header is used to map CSV column -> field in bean
        final String[] header = beanReader.getHeader(true); 

        Data data;
        while( (data = beanReader.read(Data.class, header)) != null ) {
                System.out.println(String.format("id=%s, name=%s, phone=%s",
                        data.getId(), data.getName(), data.getPhone()));
        }

}
finally {
        if( beanReader != null ) {
                beanReader.close();
        }
}
于 2012-12-12T21:26:47.060 に答える