2017-10-17 3 views
0

Je lis deux fichiers csv différents et remplit des données dans deux objets différents. Je partage chaque ligne du fichier CSV basé sur regex (regex est différent pour les deux fichiers de CSV) et peupler l'objet en utilisant chaque ensemble de données de ce tableau que l'on obtient en divisant chaque ligne en utilisant regex comme indiqué ci-dessous:Meilleure façon de remplir un objet défini par l'utilisateur en utilisant les valeurs du tableau de chaînes

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) { 

    }} 

Les fichiers CSV sont les suivants: i. fichier csv pour remplir l'objet ABC:

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

ii. fichier csv pour peupler objet XYZ

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

La question est qu'il peut y avoir des données manquantes pour l'une des colonnes ci-dessus dans le fichier csv comme indiqué dans le second fichier csv. Dans ce cas, j'obtiendrai l'exception ArrayIndexOutOfBounds. Quelqu'un peut-il me dire quelle est la meilleure façon de peupler l'objet en utilisant les données du tableau de chaînes?

Merci d'avance.

+2

L'autre problème est 'type ==" Employee "' ne fonctionnera pas comme prévu. 'type.equals (" Employee ")' est comment il doit être écrit (en supposant que 'type' ne peut pas être nul). –

+1

Ou '" Employee ".equals (type)' si elle peut être nulle. Il y a aussi des méthodes liées à l'ignorance majuscules/minuscules. – csmckelvey

+1

Ou 'Objects.equals (" Employee ", type)' si elle peut ou ne peut pas être nulle. –

Répondre

0

En plus des autres erreurs que vous avez faites et qui vous ont été signalées dans les commentaires, votre problème réel est causé par line.split("\\|") en appelant line.split("\\|", 0) qui rejette la chaîne vide à la fin. Vous devez l'appeler avec line.split("\\|", -1) à la place et cela fonctionnera.

0

Le problème semble être qu'une ou plusieurs des dernières valeurs sur une ligne CSV donnée peuvent être vides. Dans ce cas, vous rencontrez le fait que String.split(String) supprime les chaînes vides finales.

Supposant que vous pouvez compter sur tous les champs étant en fait présente, même si elle est vide, vous pouvez simplement utiliser la forme de split() deux arg:

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

Vous trouverez plus de détails dans that method's API docs.

Si vous ne pouvez pas être sûr que les champs seront présents, alors vous pouvez les forcer à être en ajoutant délimiteurs à la fin de la chaîne d'entrée:

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

Puisque vous utilisez uniquement les premières valeurs Peu de valeurs, toutes les valeurs finales supplémentaires introduites par les délimiteurs supplémentaires seraient ignorées.