285 votes

Code JavaScript pour analyser des données CSV

Quelqu'un a-t-il une idée où je pourrais trouver du code javascript pour analyser des données CSV ?

310voto

Kirtan Points 11022

Vous pouvez utiliser la fonction de CSVToArray() mentionnée dans cette entrée de blog.

157voto

Evan Plaice Points 5677

Je pense que je peux suffisamment battre le Kirtan réponse

Entrez jQuery-CSV

C'est un plugin jquery conçu pour fonctionner comme une solution pour l'analyse de CSV en Javascript données. Il gère tout seul bord de cas présentées dans la norme RFC 4180, ainsi que des pop-up pour Excel/Google Spreadsheed exportations (c'est à dire la plupart impliquant des valeurs null) que la spec est manquant.

Exemple:

piste,artiste,album,année

Dangereux,'Busta Rhymes','En Cas De Catastrophe',1997

// calling this
music = $.csv.toArrays(csv)

// outputs...
[
  ["track","artist","album","year"],
  ["Dangerous","Busta Rhymes","When Disaster Strikes","1997"]
]

console.log(music[1][2]) // outputs: 'When Disaster Strikes'

Mise à jour:

Oh ouais, je devrais probablement mentionner que c'est complètement configurable.

music = $.csv.toArrays(csv, {
  delimiter:"'", // sets a custom value delimiter character
  separator:';', // sets a custom field separator character
});

Mise à jour 2:

Il travaille maintenant avec jQuery sur Node.js trop. Ainsi, vous avez la possibilité de faire soit du côté client ou côté serveur d'analyse avec la même lib.

Avertissement: je suis aussi l'auteur de jQuery-CSV.

70voto

Trevor Dixon Points 6384

Voici un analyseur CSV simplissime que poignées cité champs par des virgules, nouvelles lignes et s’est échappé de guillemets doubles. Il n’y a aucun fractionnement ou RegEx. Il recherche dans la chaîne d’entrée 1-2 caractères à la fois et génère un tableau.

Tester à http://jsfiddle.net/vHKYH/.

44voto

Andy VanWagoner Points 251

J'ai une mise en œuvre dans le cadre d'un projet de feuille de calcul.

Ce code n'est pas encore testé à fond, mais tout le monde est bienvenue pour l'utiliser.

Comme certaines des réponses de noter que, vos mise en œuvre peut être beaucoup plus simple si vous avez réellement DSV ou TSV fichier, comme ils interdire l'utilisation de l'enregistrement et des séparateurs de champ dans les valeurs. CSV, sur l'autre main peut effectivement avoir des virgules et des retours à la ligne à l'intérieur d'un champ, ce qui rompt la plupart des regex et diviser les approches fondées.

var CSV = {
parse: function(csv, reviver) {
    reviver = reviver || function(r, c, v) { return v; };
    var chars = csv.split(''), c = 0, cc = chars.length, start, end, table = [], row;
    while (c < cc) {
        table.push(row = []);
        while (c < cc && '\r' !== chars[c] && '\n' !== chars[c]) {
            start = end = c;
            if ('"' === chars[c]){
                start = end = ++c;
                while (c < cc) {
                    if ('"' === chars[c]) {
                        if ('"' !== chars[c+1]) { break; }
                        else { chars[++c] = ''; } // unescape ""
                    }
                    end = ++c;
                }
                if ('"' === chars[c]) { ++c; }
                while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) { ++c; }
            } else {
                while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) { end = ++c; }
            }
            row.push(reviver(table.length-1, row.length, chars.slice(start, end).join('')));
            if (',' === chars[c]) { ++c; }
        }
        if ('\r' === chars[c]) { ++c; }
        if ('\n' === chars[c]) { ++c; }
    }
    return table;
},

stringify: function(table, replacer) {
    replacer = replacer || function(r, c, v) { return v; };
    var csv = '', c, cc, r, rr = table.length, cell;
    for (r = 0; r < rr; ++r) {
        if (r) { csv += '\r\n'; }
        for (c = 0, cc = table[r].length; c < cc; ++c) {
            if (c) { csv += ','; }
            cell = replacer(r, c, table[r][c]);
            if (/[,\r\n"]/.test(cell)) { cell = '"' + cell.replace(/"/g, '""') + '"'; }
            csv += (cell || 0 === cell) ? cell : '';
        }
    }
    return csv;
}
};

14voto

Trevor Dixon Points 6384

Voici mon PEG(.js) grammaire qui semble faire ok à la norme RFC 4180 (c'est à dire qu'il gère les exemples à http://en.wikipedia.org/wiki/Comma-separated_values):

start
  = [\n\r]* first:line rest:([\n\r]+ data:line { return data; })* [\n\r]* { rest.unshift(first); return rest; }

line
  = first:field rest:("," text:field { return text; })*
    & { return !!first || rest.length; } // ignore blank lines
    { rest.unshift(first); return rest; }

field
  = '"' text:char* '"' { return text.join(''); }
  / text:[^\n\r,]* { return text.join(''); }

char
  = '"' '"' { return '"'; }
  / [^"]

Essayez-le à l' http://jsfiddle.net/knvzk/10 ou http://pegjs.majda.cz/online. Télécharger l'analyseur généré à https://gist.github.com/3362830.

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