Fractionnement d’un fichier csv avec des guillemets en tant que délimiteur de texte à l’aide de Ssortingng.split ()

J’ai un fichier séparé par des virgules avec de nombreuses lignes similaires à celle ci-dessous.

Sachin,,M,"Maths,Science,English",Need to improve in these subjects. 

Quotes est utilisé pour échapper à la virgule de délimiteur utilisée pour représenter plusieurs valeurs.

Maintenant, comment diviser la valeur ci-dessus sur le délimiteur de virgule en utilisant Ssortingng.split() si possible?

 public static void main(Ssortingng[] args) { Ssortingng s = "Sachin,,M,\"Maths,Science,English\",Need to improve in these subjects."; Ssortingng[] splitted = s.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); System.out.println(Arrays.toSsortingng(splitted)); } 

Sortie:

 [Sachin, , M, "Maths,Science,English", Need to improve in these subjects.] 

Comme votre problème / vos exigences ne sont pas si complexes, vous pouvez utiliser une méthode personnalisée 20 fois plus rapide et produisant les mêmes résultats. Ceci est variable en fonction de la taille des données et du nombre de lignes analysées, et pour les problèmes plus compliqués utilisant des expressions régulières est un must.

 import java.util.Arrays; import java.util.ArrayList; public class SplitTest { public static void main(Ssortingng[] args) { Ssortingng s = "Sachin,,M,\"Maths,Science,English\",Need to improve in these subjects."; Ssortingng[] splitted = null; //Measure Regular Expression long startTime = System.nanoTime(); for(int i=0; i<10; i++) splitted = s.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); long endTime = System.nanoTime(); System.out.println("Took: " + (endTime-startTime)); System.out.println(Arrays.toString(splitted)); System.out.println(""); ArrayList sw = null; //Measure Custom Method startTime = System.nanoTime(); for(int i=0; i<10; i++) sw = customSplitSpecific(s); endTime = System.nanoTime(); System.out.println("Took: " + (endTime-startTime)); System.out.println(sw); } public static ArrayList customSplitSpecific(Ssortingng s) { ArrayList words = new ArrayList(); boolean notInsideComma = true; int start =0, end=0; for(int i=0; i 

}

Sur mon ordinateur, cela produit:

 Took: 6651100 [Sachin, , M, "Maths,Science,English", Need to improve in these subjects.] Took: 224179 [Sachin, , M, "Maths,Science,English", Need to improve in these subjects.] 

Si toutes vos chaînes sont bien formées, cela est possible avec l’expression régulière suivante:

 Ssortingng[] res = str.split(",(?=([^\"]|\"[^\"]*\")*$)"); 

L’expression garantit qu’une division ne se produit que par des virgules suivies d’un nombre pair (ou nul) de guillemets (et donc pas à l’intérieur de ces guillemets).

Néanmoins, il peut être plus facile d’utiliser un simple parsingur non rationnel.