Lorsque vous traitez des chaînes CSV (valeurs séparées par des virgules) en JavaScript, l'analyse peut être difficile lorsque les données peuvent contenir des virgules dans des champs entre guillemets. Voici comment gérer efficacement ce scénario avec une solution détaillée :
Pour garantir que la chaîne d'entrée est une chaîne CSV valide , nous définissons une expression régulière de validation :
re_valid = r""" # Validate a CSV string having single, double or un-quoted values. ^ # Anchor to start of string. \s* # Allow whitespace before value. (?: # Group for value alternatives. '[^'\]*(?:\[\S\s][^'\]*)*' # Either Single quoted string, | "[^"\]*(?:\[\S\s][^"\]*)*" # or Double quoted string, | [^,'"\s\]*(?:\s+[^,'"\s\]+)* # or Non-comma, non-quote stuff. ) # End group of value alternatives. \s* # Allow whitespace after value. (?: # Zero or more additional values , # Values separated by a comma. \s* # Allow whitespace before value. (?: # Group for value alternatives. '[^'\]*(?:\[\S\s][^'\]*)*' # Either Single quoted string, | "[^"\]*(?:\[\S\s][^"\]*)*" # or Double quoted string, | [^,'"\s\]*(?:\s+[^,'"\s\]+)* # or Non-comma, non-quote stuff. ) # End group of value alternatives. \s* # Allow whitespace after value. )* # Zero or more additional values $ # Anchor to end of string. """
Pour analyser les valeurs individuelles du CSV validé chaîne, nous utilisons l'expression régulière suivante :
re_value = r""" # Match one value in valid CSV string. (?!\s*$) # Don't match empty last value. \s* # Strip whitespace before value. (?: # Group for value alternatives. '([^'\]*(?:\[\S\s][^'\]*)*)' # Either : Single quoted string, | "([^"\]*(?:\[\S\s][^"\]*)*)" # or : Double quoted string, | ([^,'"\s\]*(?:\s+[^,'"\s\]+)*) # or : Non-comma, non-quote stuff. ) # End group of value alternatives. \s* # Strip whitespace after value. (?:,|$) # Field ends on comma or EOS. """
Avec ces expressions rationnelles définies, nous pouvons implémenter une fonction pour analyser la chaîne CSV :
function CSVtoArray(text) { // Return NULL if input string is not well formed CSV string. if (!re_valid.test(text)) return null; var a = []; // Initialize array to receive values. text.replace(re_value, // "Walk" the string using replace with callback. function(m0, m1, m2, m3) { // Remove backslash from \' in single quoted values. if (m1 !== undefined) a.push(m1.replace(/\'/g, "'")); // Remove backslash from \" in double quoted values. else if (m2 !== undefined) a.push(m2.replace(/\"/g, '"')); else if (m3 !== undefined) a.push(m3); return ''; // Return empty string. }); // Handle special case of empty last value. if (/,\s*$/.test(text)) a.push(''); return a; }
Voici quelques exemples de chaînes CSV d'entrée et leurs sorties analysées correspondantes :
// Test string from original question let result = CSVtoArray("'string, duppi, du', 23, lala"); console.log(result); // ['string, duppi, du', '23', 'lala'] // Empty CSV string let result = CSVtoArray(""); console.log(result); // [] // CSV string with two empty values let result = CSVtoArray(","); console.log(result); // ['', ''] // Double quoted CSV string having single quoted values let result = CSVtoArray("'one','two with escaped \' single quote', 'three, with, commas'"); console.log(result); // ['one', 'two with escaped \' single quote', 'three, with, commas'] // Single quoted CSV string having double quoted values let result = CSVtoArray('"one","two with escaped \" double quote", "three, with, commas"'); console.log(result); // ['one', 'two with escaped " double quote', 'three, with, commas'] // CSV string with whitespace in and around empty and non-empty values let result = CSVtoArray(" one , 'two' , , ' four' ,, 'six ', ' seven ' , "); console.log(result); // ['one', 'two', '', 'four', '', 'six ', ' seven '] // Not valid let result = CSVtoArray("one, that's me!, escaped \, comma"); console.log(result); // null
Cette solution garantit une analyse précise des chaînes CSV, en gérant les champs cités contenant des virgules tout en respectant aux exigences spécifiées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!