2017-10-17 6 views
0

私は2つの異なるcsvファイルを読み込み、2つの異なるオブジェクトにデータを取り込みます。私は、正規表現に基づいて、CSVファイルの各行を分割(正規表現は、2つのCSVファイルに異なる)と、以下に示すように、正規表現を使用して各ラインを分割することによって得られるアレイの各データを使用してオブジェクトを移入しています:文字列配列の値を使用してユーザー定義オブジェクトを設定する最も良い方法

public static <T> List<T> readCsv(String filePath, String type) { 
List<T> list = new ArrayList<T>(); 
    try { 
     File file = new File(filePath); 
     FileInputStream fileInputStream = new FileInputStream(file); 
     InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); 
     BufferedReader bufferedReader = new BufferedReader(inputStreamReader) 
     list = bufferedReader.lines().skip(1).map(line -> { 
      T obj = null; 
      String[] data = null; 
      if (type.equalsIgnoreCase("Student")) { 
       data = line.split(","); 
       ABC abc = new ABC(); 
       abc.setName(data[0]); 
       abc.setRollNo(data[1]); 
       abc.setMobileNo(data[2]); 
       obj = (T)abc; 
      } else if (type.equalsIgnoreCase("Employee")) { 
       data = line.split("\\|"); 
       XYZ xyz = new XYZ();s 
       xyz.setName(Integer.parseInt(data[0])); 
       xyz.setCity(data[1]); 
       xyz.setEmployer(data[2]); 
       xyz.setDesignation(data[3]); 
       obj = (T)xyz; 
      } 

      return obj; 
     }).collect(Collectors.toList());} catch(Exception e) { 

    }} 

csvファイルは次のとおりです。 i。 csvファイルにABCオブジェクトを設定する:

Name,rollNo,mobileNo 
Test1,1000,8888888888 
Test2,1001,9999999990 

ii。 csvファイルXYZオブジェクトを

Name|City|Employer|Designation 
Test1|City1|Emp1|SSE 
Test2|City2|Emp2| 

を移入する問題は、第二のcsvファイルに示されるように、CSVファイル内の上記列のいずれかのために欠けているデータが存在することができるです。その場合、ArrayIndexOutOfBounds例外が発生します。 文字列配列のデータを使用してオブジェクトを作成する最も良い方法は何ですか?

ありがとうございます。

+2

もう1つの問題は 'type ==" Employee "'が期待どおりに動作しないことです。 'type.equals(" Employee ")'はどのように書かれなければならないか( 'type'はnullにはなれないと仮定します)。 –

+1

または '' Employee ".equals(type)'がnullでもかまいません。大文字/小文字を無視する方法もあります。 – csmckelvey

+1

または 'Object.equals(" Employee "、type)'がnullでもかまいません。 –

答えて

0

コメントにあなたの指摘した間違いに加えて、実際の問題はline.split("\\|")line.split("\\|", 0)を呼び出して、後続の空のStringを破棄することによって発生します。あなたはline.split("\\|", -1)でそれを呼び出す必要があり、それは動作します。

0

特定のCSV行の最後の値の1つ以上が空である可能性があるという問題が発生しています。その場合、String.split(String)が末尾の空の文字列を抑制するという事実に慣れています。でも、空の場合は存在ている実際にはすべてのフィールドに頼ることができると仮定すると

は、あなたは、単にsplit()の2-argはフォームを使用することができます。

data = line.split(",", -1); 

あなたはthat method's API docsで詳細を見つけることができます。

あなたはフィールドがまったく存在し、その後、あなたが入力文字列の末尾に区切り文字を追加することであることを強制することができますことを確信することができない場合は、次の

data = (line + ",,").split(",", -1); 

あなただけの最初の値を使用しているので余分なデリミタによって導入された余分な後続の値は無視されます。

関連する問題