3 votes

Concernant la commande Java Split qui analyse le fichier Csv

Je dispose d'un fichier csv au format ci-dessous.

H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,

Je veux que la commande split ignore les virgules à l'intérieur des guillemets doubles. J'ai donc utilisé la commande split ci-dessous, tirée d'un article précédent. J'ai collé l'URL où j'ai pris cette commande

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
System.out.println("items.length"+items.length);

Java : division d'une chaîne de caractères séparée par des virgules mais ignorance des virgules dans les guillemets

Lorsque j'exécute cette commande CSV, j'obtiens une longueur de 8 pour items.length et les deux dernières virgules en fin de ligne après "NEW" sont ignorées. Je veux que la commande split prenne en compte ces virgules et me renvoie la longueur à 10. La commande ne prend pas en compte les virgules nulles si elles se trouvent à la fin, mais elle le fait si elles se trouvent au milieu de la chaîne. Je ne sais pas ce que je dois modifier dans la commande split pour résoudre ce problème. De plus, dans le fichier csv, les guillemets dans le contenu d'un champ texte peuvent être répétés (par exemple, "Ce compte est un compte ""large""").

9voto

Mark Byers Points 318575

Il n'y a pas de problème avec l'expression régulière. Le problème est que divisé rejette les allumettes vides à la fin :

Cette méthode fonctionne comme si en invoquant la méthode split à deux arguments avec l'expression expression donnée et un argument limite de zéro. Les chaînes vides de fin de chaîne ne sont donc pas incluses dans le tableau tableau résultant.

Une solution de contournement consiste à fournir un argument supérieur au nombre de colonnes que vous attendez dans votre fichier CSV :

 String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 99);

0voto

jee Points 1

J'ai rencontré le même problème aujourd'hui et j'ai trouvé une solution simple pour les fichiers csv : ajouter un champ supplémentaire contenant un seul espace au moment où le fractionnement est exécuté :

(line + ", ").split(",");

Ainsi, quel que soit le nombre de champs vides consécutifs à la fin du fichier csv, split() retournera toujours n+1 champs.

Exemple de session (en utilisant bsh)

bsh % line = "H,\"TestItems_20100107.csv\",07/01/2010,20:00:00,\"TT1198\",\"MOBb\",\"AMD\",NEW,,
bsh % System.out.println(line);
H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,
bsh % String[] items = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
bsh % System.out.println(items.length);
8
bsh % items = (line + ", ").split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
bsh % System.out.println(items.length - 1 );
10
bsh %

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X