2016-11-12 9 views
2

は、私はJavaで次のことを達成したいです。例の場合:ここで一般的なCSV読み、負荷コード

public boolean readAndLoad(String csvPath,String csvFileName, String csvType); 

csvPathとcsvFileName自明ですが、csvTypeは、ここでは、CSVに対応するテーブル名を取得することです。例:csvTypeが従業員の場合、このcsvには従業員データ固有のヘッダーを含む従業員データが含まれます。

ここでは、これを実行して別のcsvを別のテーブルに読み込むことのできる共通の汎用メソッドまたはクラスの組み合わせを作成します。列数は各CSVごとに異なります。

可能な解決策の1つは、メソッドでファイル名を手動でチェックし、そのcsvに対応する静的ヘッダーリストを取得し、データをテーブルに挿入することです。それ以外にも多くのチェックがあります。他の解決策?

+0

サンプルのcsvファイル構造はありますか? –

+0

スイッチケースは役に立ちますか? –

+0

ヘッダー名はCSVファイル内にある必要があります... – Robert

答えて

0

csvTypeは、私が最初にそのパッケージからそのエンティティをidentifiying示唆あなたのエンティティの1つの名前と一致する必要がある場合:あなたが一致し、それらのいずれかの場合にはそうならば、csvTypeをチェックするために、あなたのエンティティを簡単に見を得たら

String packageName="com.your.entities"; 
      ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
      URL packageURL; 
      ArrayList<String> classesNames = new ArrayList<String>();; 
      packageName = packageName.replace(".", "/"); 
      packageURL = classLoader.getResource(packageName); 
      URI uri = new URI(packageURL.toString()); 
      File folder = new File(uri.getPath()); 
       File[] file = folder.listFiles(); 
       String className; 
       for(File actual: file){ 
        className = actual.getName(); 
        className = className.substring(0, className.lastIndexOf('.')); 
        classesNames.add(className);} 

をコースは、同様の名前をフィールドのあなたは、あなたのヘッダーのフィールドの数を取得する必要があります:あなたのcsvTypeがエンティティにマッチした

packageName = packageName.replace("/", "."); 
        int headerLengh; 
        String header=""; 
        for (String name :classesNames) 
        { 
         if(name.equals(csvType)) 
         { headerLengh=Class.forName(packageName+"."+name).getDeclaredFields().length; 

         for (int i=0;i<headerLengh;i++) 
         { 
          header=header+Class.forName(packageName+"."+name).getDeclaredFields()[i].getName()+" "; 

         }}} 

たら、ヘッダーとテーブルを持っている、あなたは、単にそれを読んだり、テーブルにロードすることができます(あなたが今知っている)を自分の論理や方法で分析します。

0

univocity-parsersを使用すると、ジョブが完了します。これは機能が満載で、非常に高速です。データを特定のクラスのオブジェクトにマップする必要がある場合は、フィールド名/位置が何であるかを示す属性の注釈付きクラスを宣言できます。クラスの階層構造も必要に応じて適切にサポートされています。

可能な入力ごとにヘッダーを入力するだけであれば、入力に任意のヘッダーのリストを割り当てることができるsetHeadersメソッドがあります。 selectFieldsメソッドを呼び出して、読み込むフィールドと無視するフィールドを選択することもできます。

関連する問題