Maison >interface Web >js tutoriel >Comment puis-je analyser une chaîne CSV avec des virgules intégrées dans des champs entre guillemets à l'aide d'expressions régulières en JavaScript ?

Comment puis-je analyser une chaîne CSV avec des virgules intégrées dans des champs entre guillemets à l'aide d'expressions régulières en JavaScript ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-04 16:45:12941parcourir

How can I parse a CSV string with embedded commas in quoted fields using regular expressions in JavaScript?

Analyse de chaîne CSV basée sur Regex

Énoncé du problème :

Analyser une chaîne CSV avec des virgules incorporées dans des valeurs entre guillemets, tout en ignorant les virgules en dehors des guillemets.

Solution Présentation :**

Pour analyser correctement une chaîne CSV pouvant contenir des valeurs entre guillemets avec des caractères d'échappement, il est nécessaire de parcourir la chaîne caractère par caractère. Deux expressions régulières sont utilisées :

Regex de validation CSV :

^\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*(?:,\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*)*$

Cette expression régulière garantit que la chaîne d'entrée suit le format CSV défini, où :

  • Les valeurs peuvent être entre guillemets simples, doubles ou sans guillemets.
  • Les valeurs entre guillemets peuvent contenir des caractères d'échappement.
  • Les virgules sont utilisées comme séparateurs.

Regex d'analyse de valeurs :

(?!\s*$)\s*(?:'([^'\]*(?:\[\S\s][^'\]*)*)'|"([^"\]*(?:\[\S\s][^"\]*)*)"|([^,'"\s\]*(?:\s+[^,'"\s\]+)*)|)\s*(?:,|$)

Cette expression régulière extrait une valeur à la fois de la chaîne CSV, en considérant les mêmes règles que la expression régulière de validation. Il gère les valeurs entre guillemets et supprime les caractères d'échappement.

Implémentation JavaScript :**

function CSVtoArray(text) {
    const re_valid = /^\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*(?:,\s*(?:'[^'\]*(?:\[\S\s][^'\]*)*'|"[^"\]*(?:\[\S\s][^"\]*)*"|[^,'"\s\]*(?:\s+[^,'"\s\]+)*)\s*)*$/;
    const re_value = /(?!\s*$)\s*(?:'([^'\]*(?:\[\S\s][^'\]*)*)'|"([^"\]*(?:\[\S\s][^"\]*)*)"|([^,'"\s\]*(?:\s+[^,'"\s\]+)*))\s*(?:,|$)/g;
    // Return NULL if input string is not well formed CSV string.
    if (!re_valid.test(text)) return null;
    const 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;
}

Exemple d'utilisation :**

const csvString = "'string, duppi, du', 23, lala";
const result = CSVtoArray(csvString);
console.log(result); // ["string, duppi, du", "23", "lala"]

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn