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
Libérer: 2024-12-04 16:45:12
original
944 Les gens l'ont consulté

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*)*$
Copier après la connexion

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*(?:,|$)
Copier après la connexion

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;
}
Copier après la connexion

Exemple d'utilisation :**

const csvString = "'string, duppi, du', 23, lala";
const result = CSVtoArray(csvString);
console.log(result); // ["string, duppi, du", "23", "lala"]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal