Java: Lire .fichier csv et de les enregistrer dans des tableaux
J'ai un problème avec une exception alors que je suis en train de lire un .csv fichier et de l'enregistrer chaque colonne dans un tableau.
Même si, il peut sembler long du programme, il n'est pas. Je viens d'avoir 15 les différents tableaux.
C'est l'exception "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2" dans la ligne
département[i] = dataArray[2];
Il y a une chose que je pouvais faire?
BufferedReader CSVFile =
new BufferedReader(new FileReader("Sub-Companies.csv"));
String dataRow = CSVFile.readLine();
//Read the number of the lines in .csv file
//i = row of the .csv file
int i = 0;
while (dataRow != null){
i++;
dataRow = CSVFile.readLine();
}
System.out.println(i);
//Close the file once all data has been read.
CSVFile.close();
//End the printout with a blank line.
System.out.println();
//Save into arrays
customer_id = new String[i];
company_name = new String[i];
department = new String[i];
employer = new String[i];
country = new String[i];
zipcode = new String[i];
address = new String[i];
city = new String[i];
smth1 = new String[i];
smth2 = new String[i];
phone_no1 = new String[i];
phone_no2 = new String[i];
email = new String[i];
website = new String[i];
customer_no = new String[i];
//Read first line.
//The while checks to see if the data is null. If
//it is, we've hit the end of the file. If not,
//process the data.
int j;
int counter;
i = 0;
//Read the file again to save the data into arrays
BufferedReader CSV =
new BufferedReader(new FileReader("Sub-Companies.csv"));
String data = CSV.readLine();
while (data != null){
String[] dataArray = data.split(";");
for (String item:dataArray) {
customer_id[i] = dataArray[0];
company_name[i] = dataArray[1];
department[i] = dataArray[2];
employer[i] = dataArray[3];
country[i] = dataArray[4];
zipcode[i] = dataArray[5];
address[i] = dataArray[6];
city[i] = dataArray[7];
smth1[i] = dataArray[8];
smth2[i] = dataArray[9];
phone_no1[i] = dataArray[10];
phone_no2[i] = dataArray[11];
email[i] = dataArray[12];
website[i] = dataArray[13];
customer_no[i] = dataArray[14];
}
//System.out.print(address[i] + "\n");
data = CSV.readLine(); //Read next line of data.
i++;
}
Vous en remercie d'avance!
Certaines données sont "E3B3C5EB-B101-4C43-8E0C-ADFE76FC87FE;"Var Welk" Inh. Kar;NULL;NULL;DE;16278;Rotr 3;Angermünde;NULL;NULL;03331/354348-0;0343331/364548-15;[email protected];http://www.adss.com;ipo241", mais il pourrait être différente (plus grande ou plus petite).
Cette erreur est levée pour indiquer qu'un tableau est accessible avec un illégales de l'index. L'indice est supérieure ou égale à la taille du tableau.
Cela vous aidera à m'empêcher de l'exception? Je pensais à quelque chose de try, catch, mais le problème est que je veux être sûr que les données sont correctement enregistrés
S'il vous plaît montrer fichier csv contenu...
Après
String[] dataArray = data.split(";");
ne System.out.println("array elements: " + dataArray.length);
OriginalL'auteur Dimitra Micha | 2012-11-17
Vous devez vous connecter pour publier un commentaire.
Le mieux est d'utiliser
ArraList<String>
et si vous voulezconvert as Array
.votre problème est que vous êtes de comptage de lignes pour créer la matrice de taille, mais vous ajoutez des données
basé sur split (";"), donc il y a incompatibilité dans la gamme de longueur et de valeurs disponibles à ajouter dans la gamme de split(";").
gh;ghj;ghjk;ghj; par exemple comme cela, vous disposez de deux lignes , lorsque vous êtes sur le point de créer un tableau ,utiliser le nombre de lignes que 2 pour la taille de la matrice.mais quand vous split(";"), sa taille est de 4 et que vous essayez d'ajouter un 4 les valeurs de tableau qui n'a que 2 valeurs. donc il n'y aura java.lang.ArrayIndexOutOfBoundsException.C'est tout.
Maintenant, je suis confus, dans chaque tableau, j'enregistrez une entrée à partir de chaque ligne. Si les entrées sont égales aux lignes du fichier, non?
non désolé encore , vous ne l'avez pas.
mais vous avez dit qu'ils étaient tous les 15
OriginalL'auteur sunleo
Cela devrait faire l'affaire: essentiellement, il crée une représentation matricielle du fichier csv.
Dans csvMatrix[row][col]...
Lors de l'accès à une colonne, à affirmer que le col numéro que vous tentez d'accéder est dans la gamme en faisant :
Désolé, j'ai manqué un peu d'info sur cette ligne: Ce n'est pas parce qu'une ligne a X colonnes que toutes les lignes ont la même quantité... Donc d'être prudent, avant d'essayer d'accéder à un index, de valider que l'indice existe: Dans votre situation, la ligne peut être invalide, par conséquent, vous pouvez même ignorer l'ajouter à la liste...donc au lieu d'avoir des "lignes.addLast(dataRow.split(","));" dans la boucle, vous pouvez avoir ceci: String[] temp = dataRow.split(","); if(temp.longueur == ACCEPTED_COLUMN_COUNT) { lignes.addLast(temp); }
hey @médecin killer. Je viens de résoudre mon problème. Je vous remercie beaucoup pour votre réponse.
bon à savoir: faire +1!
OriginalL'auteur doctor killer
Il y a plusieurs problèmes avec votre code. L'exception est causé par le fait que l'une des lignes qui ne contiennent pas assez de ';' valeurs séparées.
La chose étrange au sujet de votre code est:
Cela signifie simplement que vous répétez les mêmes attributions de 15 fois (il suffit de retirer le for (String item: ...)).
Si j'étais vous, je ferais le suivant:
créer une classe; quelque chose comme ceci:
utilisation de la collection (comme suggéré dans le post ci-dessus):
Si vous avez besoin de tableau au lieu de la collecte, vous pouvez le faire:
Utiliser une bibliothèque pour lire le fichier... Vous pouvez essayer http://opencsv.sourceforge.net/ par exemple.
if (args.length != 15) { return null; // or throw an exception
cette aussi et puis enregistrez chacun de ces tableaux tableau[15] avec les autres entrées NULLOriginalL'auteur ishi
L'exception signifie que le
dataArray
ne dispose pas de beaucoup d'éléments (p. 3).Si vous souhaitez analyser votre fichier CSV, vous pouvez rendre votre vie plus facile en précisant que, pour tout élément manquant il doit y avoir un espace réservé.
Ce que je veux dire, c'est que vous pouvez avoir un tel dossier:
a;b;c;d;e;f;g;h;j
Où chacun des personnages représentent les valeurs de vos colonnes mais lorsqu'un élément est manquant le format doit être:
a;;;;;f;g;h;j
et pasa;f;g;h;j
Ce n'est pas inhabituel de l'attente, mais la norme dans les fichiers CSV et de simplifier votre code beaucoup et permettrait d'éviter des index de tableau exception que votre ligne aura toujours les colonnes attendus
Mais comment sont vos fichiers CSV générés?Si manuellement, puis il suffit d'ajouter le superflu
;
pour chaque élément manquant. Même si vous les générer par le code.Ainsi, lorsque vous analysez le CSV ligne lorsque vous nesplit(';')
vous la taille du tableau retournéCe fichier cvs m'est donnée. Yeap, quand je divise ça je le sais.
Si elle vous est accordée, vous devez spécifier les attentes sur le format csv
OriginalL'auteur Cratylus
À L'Aide De ArrayList:
L'appel de la méthode(l'affichage de contenu csv):
OriginalL'auteur L.Weiss
Si vous voulez charger les données dans un Paramétrée JUnit test à l'aide de Gradle ( au lieu de Maven) , voici la méthode:
OriginalL'auteur djangofan
Veuillez vérifier si
java.util.StringTokenizer
aideExemple:
Manuel: StringTokenizer docs
OriginalL'auteur Brijendra Verma