Code Javascript pour analyser les données CSV

217

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

Pierre-Gilles Levallois
la source
3
Jetez un oeil à cette réponse ici, elle a de bonnes réponses: stackoverflow.com/questions/8493195/…
Dobes Vandermeer
14
La plupart des réponses ci-dessous sont fausses, à part celle d'Andy. Toute réponse qui utilise une correspondance de modèle ou des fractionnements est vouée à l'échec - ils ne prendront pas en charge les séquences d'échappement. Pour cela, vous avez besoin d'une machine à états finis.
greg.kindel
3
Analyse d'un fichier CSV local avec JavaScript et Papa Parse: joyofdata.de/blog/…
Raffael
4
Papa Parse est une autre option avec de nombreuses fonctionnalités (multi-thread, prise en charge des lignes d'en-tête, délimiteur de détection automatique, etc.)
Hinrich
1
Un autre vote pour PapaParse, je l'utilise avec AngularJS et cela fonctionne très bien.
Dmitry Buslaev

Réponses:

258

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

<script type="text/javascript">
    // ref: http://stackoverflow.com/a/1293163/2343
    // This will parse a delimited string into an array of
    // arrays. The default delimiter is the comma, but this
    // can be overriden in the second argument.
    function CSVToArray( strData, strDelimiter ){
        // Check to see if the delimiter is defined. If not,
        // then default to comma.
        strDelimiter = (strDelimiter || ",");

        // Create a regular expression to parse the CSV values.
        var objPattern = new RegExp(
            (
                // Delimiters.
                "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

                // Quoted fields.
                "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

                // Standard fields.
                "([^\"\\" + strDelimiter + "\\r\\n]*))"
            ),
            "gi"
            );


        // Create an array to hold our data. Give the array
        // a default empty first row.
        var arrData = [[]];

        // Create an array to hold our individual pattern
        // matching groups.
        var arrMatches = null;


        // Keep looping over the regular expression matches
        // until we can no longer find a match.
        while (arrMatches = objPattern.exec( strData )){

            // Get the delimiter that was found.
            var strMatchedDelimiter = arrMatches[ 1 ];

            // Check to see if the given delimiter has a length
            // (is not the start of string) and if it matches
            // field delimiter. If id does not, then we know
            // that this delimiter is a row delimiter.
            if (
                strMatchedDelimiter.length &&
                strMatchedDelimiter !== strDelimiter
                ){

                // Since we have reached a new row of data,
                // add an empty row to our data array.
                arrData.push( [] );

            }

            var strMatchedValue;

            // Now that we have our delimiter out of the way,
            // let's check to see which kind of value we
            // captured (quoted or unquoted).
            if (arrMatches[ 2 ]){

                // We found a quoted value. When we capture
                // this value, unescape any double quotes.
                strMatchedValue = arrMatches[ 2 ].replace(
                    new RegExp( "\"\"", "g" ),
                    "\""
                    );

            } else {

                // We found a non-quoted value.
                strMatchedValue = arrMatches[ 3 ];

            }


            // Now that we have our value string, let's add
            // it to the data array.
            arrData[ arrData.length - 1 ].push( strMatchedValue );
        }

        // Return the parsed data.
        return( arrData );
    }

</script>
Kirtan
la source
1
Cela peut gérer les virgules, les guillemets et les sauts de ligne intégrés, par exemple: var csv = 'id, value \ n1, James \ n02, "Jimmy Smith, Esq." \ N003, "James" "Jimmy" "Smith, III" \ n0004, "James \ nSmith \ nWuz Here" 'var array = CSVToArray (csv, ",");
prototype
4
Il donne undefinedpour les champs vides qui est cité . Exemple: CSVToArray("4,,6")me donne[["4","","6"]] , mais CSVToArray("4,\"\",6")me donne [["4",undefined,"6"]].
Pang
3
J'ai eu des problèmes avec ceci dans Firefox, et le script ne répond plus. Cependant, cela ne semblait affecter que quelques utilisateurs, donc je
n'ai
8
Il y a un bug dans l'expression régulière: "([^\"\\"devrait l'être "([^\\". Sinon, un guillemet double n'importe où dans une valeur non cotée mettra fin prématurément. J'ai trouvé ça difficile ...
J'ai Walter Tross
5
Pour tous ceux qui recherchent une version réduite de la méthode ci-dessus, avec le correctif regex décrit ci-dessus appliqué: gist.github.com/Jezternz/c8e9fafc2c114e079829974e3764db75
Josh Mc
147

jQuery-CSV

Il s'agit d'un plugin jquery conçu pour fonctionner comme une solution de bout en bout pour analyser CSV en données Javascript. Il gère tous les cas de bord présentés dans la RFC 4180 , ainsi que certains qui apparaissent pour les exportations Excel / Google Spreadsheed (c'est-à-dire impliquant principalement des valeurs nulles) pour lesquelles la spécification est manquante.

Exemple:

piste, artiste, album, année

Dangerous, 'Busta Rhymes', 'When Disaster Strikes', 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'

Mettre à jour:

Oh ouais, je devrais aussi 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 fonctionne désormais également avec jQuery sur Node.js. Vous avez donc la possibilité d'effectuer une analyse côté client ou côté serveur avec la même bibliothèque.

Mise à jour 3:

Depuis l'arrêt de Google Code, jquery-csv a été migré vers GitHub .

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

Plie d'Evan
la source
29
Pourquoi est-ce jQuery csv? Pourquoi cela dépend-il de jQuery? J'ai parcouru rapidement la source ... il ne semble pas que vous utilisiez jQuery
paulslater19
17
@ paulslater19 Le plugin ne dépend pas de jquery. Au contraire, il suit les directives de développement communes de jQuery. Toutes les méthodes incluses sont statiques et résident sous leur propre espace de noms (c'est-à-dire $ .csv). Pour les utiliser sans jQuery, créez simplement un objet $ global auquel le plugin se liera lors de l'initialisation.
Evan Plaice
2
est csvdans le code de la solution se référer à la .csv filename? je suis intéressé par un bon outil JS / JQuery pour analyser un fichier csv
bouncingHippo
1
@bouncingHippo Dans l'exemple, il s'agit simplement d'une chaîne de données csv, mais la bibliothèque peut être utilisée pour ouvrir des fichiers csv localement dans le navigateur à l'aide de l'API de fichier HTML5. En voici un exemple dans l'action jquery-csv.googlecode.com/git/examples/file-handling.html .
Evan Plaice
1
Étant donné qu'il ne dépend pas de jQuery, il serait préférable de supprimer la dépendance globale "$" et de laisser les utilisateurs passer la référence d'objet qu'ils souhaitent. Peut-être par défaut à jQuery s'il est disponible. Il existe d'autres bibliothèques qui utilisent "$" et peuvent être utilisées par les équipes de développement avec un proxy minimal de ces bibliothèques.
RobG
40

J'ai une implémentation dans le cadre d'un projet de feuille de calcul.

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

Comme certaines des réponses l'ont cependant noté, votre implémentation peut être beaucoup plus simple si vous avez réellement un fichier DSV ou TSV , car elles interdisent l'utilisation des séparateurs d'enregistrement et de champ dans les valeurs. CSV, d'autre part, peut en fait avoir des virgules et des sauts de ligne à l'intérieur d'un champ, ce qui rompt la plupart des regex et des approches basées sur les divisions.

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;
}
};
Andy VanWaggoner
la source
9
C'est une de mes réponses préférées. C'est un véritable analyseur implémenté dans peu de code.
Trevor Dixon
1
Si une virgule est placée à la fin d'une ligne, une cellule vide doit la suivre. Ce code passe simplement à la ligne suivante, résultant en une undefinedcellule. Par exemple,console.log(CSV.parse("first,last,age\r\njohn,doe,"));
skibulk
En outre, les cellules vides doivent analyser les chaînes vides. Ce code les analyse en zéros, ce qui prête à confusion car les cellules peuvent en fait contenir des zéros:console.log(CSV.parse("0,,2,3"));
skibulk
@skibulk Votre deuxième commentaire est incorrect (au moins dans Chrome, cela fonctionne bien avec votre exemple). Votre premier commentaire est cependant valide, bien qu'il soit facilement corrigé - ajoutez ce qui suit juste avant if ('\r' === chars[c]) { ... }:if (end === c-1) { row.push(reviver(table.length-1, row.length, '')); }
coderforlife
35

Voici un analyseur CSV extrêmement simple qui gère les champs entre guillemets avec des virgules, de nouvelles lignes et des guillemets doubles échappés. Il n'y a pas de division ou RegEx. Il scanne la chaîne d'entrée 1-2 caractères à la fois et construit un tableau.

Testez-le sur http://jsfiddle.net/vHKYH/ .

function parseCSV(str) {
    var arr = [];
    var quote = false;  // true means we're inside a quoted field

    // iterate over each character, keep track of current row and column (of the returned array)
    for (var row = 0, col = 0, c = 0; c < str.length; c++) {
        var cc = str[c], nc = str[c+1];        // current character, next character
        arr[row] = arr[row] || [];             // create a new row if necessary
        arr[row][col] = arr[row][col] || '';   // create a new column (start with empty string) if necessary

        // If the current character is a quotation mark, and we're inside a
        // quoted field, and the next character is also a quotation mark,
        // add a quotation mark to the current column and skip the next character
        if (cc == '"' && quote && nc == '"') { arr[row][col] += cc; ++c; continue; }  

        // If it's just one quotation mark, begin/end quoted field
        if (cc == '"') { quote = !quote; continue; }

        // If it's a comma and we're not in a quoted field, move on to the next column
        if (cc == ',' && !quote) { ++col; continue; }

        // If it's a newline (CRLF) and we're not in a quoted field, skip the next character
        // and move on to the next row and move to column 0 of that new row
        if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; }

        // If it's a newline (LF or CR) and we're not in a quoted field,
        // move on to the next row and move to column 0 of that new row
        if (cc == '\n' && !quote) { ++row; col = 0; continue; }
        if (cc == '\r' && !quote) { ++row; col = 0; continue; }

        // Otherwise, append the current character to the current column
        arr[row][col] += cc;
    }
    return arr;
}
Trevor Dixon
la source
C'est simple et cela fonctionne pour moi, la seule chose que j'ai changé a été d'ajouter un trim () à la valeur :)
JustEngland
3
Cela semble plus propre et plus simple. J'ai dû analyser un fichier de 4 Mo et les autres réponses se sont écrasées sur moi dans ie8, mais cela a réussi.
Charles Clayton
3
Cela a également fonctionné pour moi. J'ai cependant dû faire une modification pour permettre une bonne gestion des if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; } if (cc == '\n' && !quote) { ++row; col = 0; continue; }
sauts
1
Un autre utilisateur (@ sorin-postelnicu) a utilement publié une fonction compagnon pour transformer le résultat en objet dictionnaire: jsfiddle.net/8t2po6wh .
Trevor Dixon
1
Oui, chaque fois que la vitesse est nécessaire ou que les empreintes de mémoire sont importantes, une solution propre comme celle-ci est de loin supérieure. L'analyse syntaxique par machine d'état est tellement plus fluide.
Tatarize
14

Voici ma grammaire PEG (.js) qui semble fonctionner correctement à RFC 4180 (c'est-à-dire qu'elle 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 sur http://jsfiddle.net/knvzk/10 ou http://pegjs.majda.cz/online . Téléchargez l'analyseur généré sur https://gist.github.com/3362830 .

Trevor Dixon
la source
2
CHEVILLE? Construire un AST n'est pas un peu lourd en mémoire pour une grammaire de type III. Peut-il gérer des champs qui contiennent des caractères de nouvelle ligne parce que c'est le cas le plus difficile à couvrir dans un analyseur de «grammaire régulière». Dans les deux cas, +1 pour une nouvelle approche.
Evan Plaice
1
Oui, il gère la nouvelle ligne à l'intérieur d'un champ.
Trevor Dixon
2
Sympa ... Avec cela seul, c'est mieux que 95% de toutes les implémentations que j'ai jamais vues. Si vous souhaitez vérifier la conformité RFC complète, jetez un œil aux tests ici ( jquery-csv.googlecode.com/git/test/test.html ).
Evan Plaice
6
Bien joué. +1 pour m'avoir activé au PEG. J'adore les générateurs d'analyseurs. "Pourquoi programmer à la main en cinq jours ce que vous pouvez passer cinq ans de votre vie à automatiser?" - Terence Parr, ANTLR
Subfuzion
14

csvToArray v1.3

Une fonction compacte (645 octets) mais compatible pour convertir une chaîne CSV en un tableau 2D, conforme à la norme RFC4180.

https://code.google.com/archive/p/csv-to-array/downloads

Utilisation courante: jQuery

 $.ajax({
        url: "test.csv",
        dataType: 'text',
        cache: false
 }).done(function(csvAsString){
        csvAsArray=csvAsString.csvToArray();
 });

Utilisation courante: Javascript

csvAsArray = csvAsString.csvToArray();

Remplacer le séparateur de champ

csvAsArray = csvAsString.csvToArray("|");

Remplacer le séparateur d'enregistrements

csvAsArray = csvAsString.csvToArray("", "#");

Ignorer l'en-tête

csvAsArray = csvAsString.csvToArray("", "", 1);

Tout remplacer

csvAsArray = csvAsString.csvToArray("|", "#", 1);
dt192
la source
Cela semble intéressant mais je ne trouve pas le code maintenant. Pouvez-vous le publier à nouveau?
Sam Watkins
1
J'ai mis à jour le message principal avec un lien actuel. Merci beaucoup.
dt192
3

Je ne sais pas pourquoi je ne pouvais pas ex kirtans. travailler pour moi. Cela semblait échouer sur des champs vides ou peut-être des champs avec des virgules de fin ...

Celui-ci semble gérer les deux.

Je n'ai pas écrit le code de l'analyseur, juste un wrapper autour de la fonction de l'analyseur pour que cela fonctionne pour un fichier. voir Attribution

    var Strings = {
        /**
         * Wrapped csv line parser
         * @param s string delimited csv string
         * @param sep separator override
         * @attribution : http://www.greywyvern.com/?post=258 (comments closed on blog :( )
         */
        parseCSV : function(s,sep) {
            // http://stackoverflow.com/questions/1155678/javascript-string-newline-character
            var universalNewline = /\r\n|\r|\n/g;
            var a = s.split(universalNewline);
            for(var i in a){
                for (var f = a[i].split(sep = sep || ","), x = f.length - 1, tl; x >= 0; x--) {
                    if (f[x].replace(/"\s+$/, '"').charAt(f[x].length - 1) == '"') {
                        if ((tl = f[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
                            f[x] = f[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
                          } else if (x) {
                        f.splice(x - 1, 2, [f[x - 1], f[x]].join(sep));
                      } else f = f.shift().split(sep).concat(f);
                    } else f[x].replace(/""/g, '"');
                  } a[i] = f;
        }
        return a;
        }
    }
Shanimal
la source
1

Des expressions régulières à la rescousse! Ces quelques lignes de code gèrent correctement les champs entre guillemets avec des virgules, des guillemets et des sauts de ligne intégrés basés sur la norme RFC 4180.

function parseCsv(data, fieldSep, newLine) {
    fieldSep = fieldSep || ',';
    newLine = newLine || '\n';
    var nSep = '\x1D';
    var qSep = '\x1E';
    var cSep = '\x1F';
    var nSepRe = new RegExp(nSep, 'g');
    var qSepRe = new RegExp(qSep, 'g');
    var cSepRe = new RegExp(cSep, 'g');
    var fieldRe = new RegExp('(?<=(^|[' + fieldSep + '\\n]))"(|[\\s\\S]+?(?<![^"]"))"(?=($|[' + fieldSep + '\\n]))', 'g');
    var grid = [];
    data.replace(/\r/g, '').replace(/\n+$/, '').replace(fieldRe, function(match, p1, p2) {
        return p2.replace(/\n/g, nSep).replace(/""/g, qSep).replace(/,/g, cSep);
    }).split(/\n/).forEach(function(line) {
        var row = line.split(fieldSep).map(function(cell) {
            return cell.replace(nSepRe, newLine).replace(qSepRe, '"').replace(cSepRe, ',');
        });
        grid.push(row);
    });
    return grid;
}

const csv = 'A1,B1,C1\n"A ""2""","B, 2","C\n2"';
const separator = ',';      // field separator, default: ','
const newline = ' <br /> '; // newline representation in case a field contains newlines, default: '\n' 
var grid = parseCsv(csv, separator, newline);
// expected: [ [ 'A1', 'B1', 'C1' ], [ 'A "2"', 'B, 2', 'C <br /> 2' ] ]

Vous n'avez pas besoin d'un générateur d'analyseur tel que lex / yacc. L'expression régulière gère correctement le RFC 4180 grâce à un lookbehind positif, un lookbehind négatif et un lookahead positif.

Clonez / téléchargez le code sur https://github.com/peterthoeny/parse-csv-js

Peter Thoeny
la source
Les regexps sont implémentées à l'aide de machines à états finis, vous avez donc en fait besoin de FSM.
Henry Henrinson
@HenryHenrinson: Pas nécessairement. Je vous mets au défi de trouver un problème avec le code ci-dessus. Je l'utilise en production. Il est également possible d'effectuer une analyse plus complexe avec des expressions régulières. Vous n'avez pas besoin d'un analyseur LL pour créer un arbre de syntaxe. Voici un blog: Comment utiliser des expressions régulières pour analyser des
Peter Thoeny
@HenryHenrinson: Oh, oui, factice, nous sommes en violente entente :-)
Peter Thoeny
1

voici mon simple vanille js:

let a = 'one,two,"three, but with a comma",four,"five, with ""quotes"" in it.."'
console.log(splitQuotes(a))

function splitQuotes(line) {
  if(line.indexOf('"') < 0) return line.split(',')
  let result = [], cell = '', quote = false;
  for(let i = 0; i < line.length; i++) {
    char = line[i]
    if(char == '"' && line[i+1] == '"') {
      cell += char
      i++
    } else if(char == '"') {
      quote = !quote;
    } else if(!quote && char == ',') {
      result.push(cell)
      cell = ''
    } else {
      cell += char
    }
    if ( i == line.length-1 && cell) {
      result.push(cell)
    }
  }
  return result
}
noam sondak
la source
-1

J'ai construit ce script javascript pour analyser un CSV en chaîne vers un objet tableau. Je trouve préférable de décomposer l'ensemble du CSV en lignes, champs et de les traiter en conséquence. Je pense que cela vous permettra de changer facilement le code en fonction de vos besoins.

J'espère que cela vous aidera. Merci.

    //
    //
    // CSV to object
    //
    //

    const new_line_char = '\n';
    const field_separator_char = ',';

    function parse_csv(csv_str) {

        var result = [];

        let line_end_index_moved = false;
        let line_start_index = 0;
        let line_end_index = 0;
        let csr_index = 0;
        let cursor_val = csv_str[csr_index];
        let found_new_line_char = get_new_line_char(csv_str);
        let in_quote = false;

        // handle \r\n
        if (found_new_line_char == '\r\n') {
            csv_str = csv_str.split(found_new_line_char).join(new_line_char);
        }
        // handle last char is not \n
        if (csv_str[csv_str.length - 1] !== new_line_char) {
            csv_str += new_line_char;
        }

        while (csr_index < csv_str.length) {
            if (cursor_val === '"') {
                in_quote = !in_quote;
            } else if (cursor_val === new_line_char) {
                if (in_quote === false) {
                    if (line_end_index_moved && (line_start_index <= line_end_index)) {
                        result.push(parse_csv_line(csv_str.substring(line_start_index, line_end_index)));
                        line_start_index = csr_index + 1;
                    } // else: just ignore line_end_index has not moved or line has not been sliced for parsing the line
                } // else: just ignore because we are in quote
            }
            csr_index++;
            cursor_val = csv_str[csr_index];
            line_end_index = csr_index;
            line_end_index_moved = true;
        }

        // handle \r\n
        if (found_new_line_char == '\r\n') {
            let new_result = [];
            let curr_row;
            for (var i = 0; i < result.length; i++) {
                curr_row = [];
                for (var j = 0; j < result[i].length; j++) {
                    curr_row.push(result[i][j].split(new_line_char).join('\r\n'));
                }
                new_result.push(curr_row);
            }
            result = new_result;
        }

        return result;
    }

    function parse_csv_line(csv_line_str) {

        var result = [];

        // let field_end_index_moved = false;
        let field_start_index = 0;
        let field_end_index = 0;
        let csr_index = 0;
        let cursor_val = csv_line_str[csr_index];
        let in_quote = false;

        // Pretend that the last char is the separator_char to complete the loop
        csv_line_str += field_separator_char;

        while (csr_index < csv_line_str.length) {
            if (cursor_val === '"') {
                in_quote = !in_quote;
            } else if (cursor_val === field_separator_char) {
                if (in_quote === false) {
                    if (field_start_index <= field_end_index) {
                        result.push(parse_csv_field(csv_line_str.substring(field_start_index, field_end_index)));
                        field_start_index = csr_index + 1;
                    } // else: just ignore field_end_index has not moved or field has not been sliced for parsing the field
                } // else: just ignore because we are in quote
            }
            csr_index++;
            cursor_val = csv_line_str[csr_index];
            field_end_index = csr_index;
            field_end_index_moved = true;
        }

        return result;
    }

    function parse_csv_field(csv_field_str) {
        with_quote = (csv_field_str[0] === '"');

        if (with_quote) {
            csv_field_str = csv_field_str.substring(1, csv_field_str.length - 1); // remove the start and end quotes
            csv_field_str = csv_field_str.split('""').join('"'); // handle double quotes
        }

        return csv_field_str;
    }

    // initial method: check the first newline character only
    function get_new_line_char(csv_str) {
        if (csv_str.indexOf('\r\n') > -1) {
            return '\r\n';
        } else {
            return '\n'
        }
    }
Gabriel Chung
la source
-3

Pourquoi ne pas simplement utiliser .split (',')?

http://www.w3schools.com/jsref/jsref_split.asp

var str="How are you doing today?";
var n=str.split(" "); 
Michée
la source
2
Pourquoi est-ce une mauvaise réponse? Il est natif, place le contenu des chaînes dans un tableau fonctionnel ...
Micah
20
Beaucoup de raisons. Tout d'abord, il ne supprime pas les guillemets doubles sur les valeurs délimitées. Ne gère pas le fractionnement de ligne. N'échappe pas aux guillemets doubles utilisés pour échapper aux guillemets doubles utilisés dans les valeurs délimitées. N'autorise pas les valeurs vides. etc, etc ... La flexibilité du format CSV le rend très facile à utiliser mais difficile à analyser. Je ne voterai pas contre cela, mais uniquement parce que je ne vote pas contre les réponses concurrentes.
Evan Plaice
1
Qu'en est-il lorsque vous rencontrez une valeur qui contient un caractère de nouvelle ligne? Une simple fonction de fractionnement l'interprétera à tort comme la fin d'une entrée au lieu de la sauter comme il se doit. Analyser CSV est beaucoup plus compliqué que de simplement fournir 2 routines séparées (une pour les nouvelles lignes, une pour les délimiteurs).
Evan Plaice
2
(suite) Également divisé sur des valeurs nulles (a, null ,, valeur) ne renvoie rien alors qu'il devrait retourner une chaîne vide. Ne vous méprenez pas, le fractionnement est un bon début si vous êtes sûr à 100% que les données entrantes ne casseront pas l'analyseur, mais créer un analyseur robuste qui peut gérer toutes les données conformes à la RFC 4801 est beaucoup plus compliqué.
Evan Plaice
8
Evan, je pense que votre bibliothèque javascript est géniale. Mais voici une autre perspective - j'ai apprécié cette réponse, car je stocke simplement une série de chiffres d'une manière très prévisible. Il est beaucoup plus important pour moi d'obtenir la compatibilité et la maintenabilité Javascript entre navigateurs aussi longtemps que possible, que d'inclure une grande bibliothèque (bien que bien écrite et bien testée). Des besoins différents nécessitent des approches différentes. Si jamais j'ai besoin d'une véritable puissance CSV, je m'engagerai définitivement à utiliser votre bibliothèque! :-)
moodboom