Codice Javascript per analizzare i dati CSV


217

Qualcuno ha un'idea di dove potrei trovare del codice javascript per analizzare i dati CSV?


3
Date un'occhiata a questa risposta qui, ha buone risposte: stackoverflow.com/questions/8493195/...
Dobes Vandermeer

14
La maggior parte delle risposte di seguito sono sbagliate, a parte quella di Andy. Qualsiasi risposta che utilizza la corrispondenza dei pattern o le divisioni è destinata a fallire: non supporteranno le sequenze di escape. Per questo, è necessaria una macchina a stati finiti.
greg.kindel,

3
Analisi di un file CSV locale con JavaScript e Papa Parse: joyofdata.de/blog/…
Raffael

4
Papa Parse è un'altra opzione con molte funzionalità (multi-thread, supporto riga di intestazione, delimitatore di rilevamento automatico e altro)
Hinrich

1
Un altro voto per PapaParse, lo sto usando con AngularJS e funziona benissimo.
Dmitry Buslaev,

Risposte:


258

È possibile utilizzare la funzione CSVToArray () menzionata in questo post di 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>

1
Questo può gestire virgole, virgolette e interruzioni di riga incorporate, ad es .: var csv = 'id, value \ n1, James \ n02, "Jimmy Smith, Esq." \ N003, "James" "Jimmy" "Smith, III" \ n0004, "James \ nSmith \ nWuz Here" 'var array = CSVToArray (csv, ",");
prototipo

4
undefinedper campi vuoti che è quotato . Esempio: CSVToArray("4,,6")mi dà [["4","","6"]], ma CSVToArray("4,\"\",6")mi dà [["4",undefined,"6"]].
Pang

3
Ho avuto problemi con questo in Firefox, e lo script non ha risposto. Sembrava interessare solo pochi utenti, quindi non è stato possibile trovare la causa
JDandChips

8
C'è un bug nella regex: "([^\"\\"dovrebbe essere "([^\\". Altrimenti una doppia citazione in qualsiasi punto di un valore non quotato la terminerà prematuramente. Ho trovato questo nel modo più difficile ...
Walter Tross,

5
Per chiunque cerchi una versione ridotta del metodo sopra, con la correzione regex sopra descritta applicata: gist.github.com/Jezternz/c8e9fafc2c114e079829974e3764db75
Josh Mc

147

jQuery-CSV

È un plug-in jquery progettato per funzionare come soluzione end-to-end per l'analisi di CSV in dati Javascript. Gestisce ogni singolo caso limite presentato in RFC 4180 , nonché alcuni che si aprono per le esportazioni di Excel / Google Spreadsheed (ovvero che riguardano principalmente valori null) che mancano le specifiche.

Esempio:

brano, artista, album, anno

Pericoloso, "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'

Aggiornare:

Oh sì, dovrei anche menzionare che è completamente configurabile.

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

Aggiornamento 2:

Ora funziona anche con jQuery su Node.js. Quindi hai la possibilità di eseguire analisi lato client o lato server con la stessa lib.

Aggiornamento 3:

Dall'arresto di Google Code, jquery-csv è stato migrato su GitHub .

Disclaimer: sono anche l'autore di jQuery-CSV.


29
Perché è jQuery CSV? Perché dipende da jQuery? Ho fatto una rapida scansione della fonte ... non sembra che tu stia usando jQuery
paulslater19,

17
@ paulslater19 Il plugin non dipende da jquery. Piuttosto, segue le linee guida comuni per lo sviluppo di jQuery. Tutti i metodi inclusi sono statici e risiedono nel proprio spazio dei nomi (ad esempio $ .csv). Per usarli senza jQuery è sufficiente creare un oggetto $ globale a cui il plugin si legherà durante l'inizializzazione.
Evan Plaice,

2
è csvnel codice soluzione fare riferimento al .csv filename? sono interessato a un buon strumento JS / JQuery per analizzare un file CSV
rimbalzandoHippo il

1
@bouncingHippo Nell'esempio si riferisce solo a una stringa di dati CSV, ma la lib può essere usata per aprire i file CSV localmente nel browser usando l'API File HTML5. Ecco un esempio in azione jquery-csv.googlecode.com/git/examples/file-handling.html .
Evan Plaice,

1
Dato che non dipende da jQuery, sarebbe meglio rimuovere la dipendenza globale "$" e consentire agli utenti di passare qualsiasi riferimento agli oggetti che desiderano. Forse predefinito a jQuery se è disponibile. Esistono altre librerie che utilizzano "$" e potrebbero essere utilizzate dai team di sviluppo con proxy minimi di tali librerie.
RobG

40

Ho un'implementazione come parte di un progetto di foglio di calcolo.

Questo codice non è ancora stato testato a fondo, ma chiunque può usarlo.

Come indicato da alcune delle risposte, l'implementazione può essere molto più semplice se lo hai effettivamente fatto file DSV o TSV , in quanto non consentono l'uso dei separatori di record e di campo nei valori. CSV, d'altra parte, può effettivamente avere virgole e newline all'interno di un campo, che interrompe la maggior parte degli approcci regex e split-based.

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;
}
};

9
Questa è una delle mie risposte preferite. È un vero parser implementato in poco codice.
Trevor Dixon,

1
Se una virgola viene posizionata alla fine di una riga, una cella vuota dovrebbe seguirla. Questo codice salta semplicemente alla riga successiva, risultando in una undefinedcella. Ad esempio,console.log(CSV.parse("first,last,age\r\njohn,doe,"));
skibulk,

Inoltre, le celle vuote dovrebbero analizzare stringhe vuote. Questo codice li analizza in zeri, il che è confuso poiché le celle possono effettivamente contenere zeri:console.log(CSV.parse("0,,2,3"));
skibulk

@skibulk Il tuo secondo commento non è corretto (almeno in Chrome funziona bene con il tuo esempio). Il tuo primo commento è valido, anche se è facilmente if ('\r' === chars[c]) { ... }if (end === c-1) { row.push(reviver(table.length-1, row.length, '')); }
risolvibile

35

Ecco un parser CSV estremamente semplice che gestisce i campi tra virgolette con virgole, nuove righe e virgolette doppie con escape. Non c'è divisione o RegEx. Esegue la scansione della stringa di input 1-2 caratteri alla volta e crea un array.

Provalo su 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;
}

È semplice e funziona per me, l'unica cosa che ho cambiato è stata l'aggiunta di un trim () al valore :)
JustEngland

3
Sembra più pulito e diretto. Ho dovuto analizzare un file 4mb e le altre risposte si sono schiantate su di me in ie8, ma questo è riuscito.
Charles Clayton,

3
Questo ha funzionato anche per me. Ho dovuto fare una modifica per consentire la corretta gestione dei feed di riga:if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; } if (cc == '\n' && !quote) { ++row; col = 0; continue; }
user655063

1
Un altro utente (@ sorin-postelnicu) ha pubblicato utile una funzione di accompagnamento per trasformare il risultato in un oggetto dizionario: jsfiddle.net/8t2po6wh .
Trevor Dixon,

1
Sì, ogni volta che è necessaria la velocità o l'impronta della memoria è importante, una soluzione pulita come questa è di gran lunga superiore. L'analisi statale basata su macchine è molto più agevole.
Tatarize il

14

Ecco la mia grammatica PEG (.js) che sembra andare bene a RFC 4180 (ovvero gestisce gli esempi su 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 '"'; }
  / [^"]

Provalo su http://jsfiddle.net/knvzk/10 o http://pegjs.majda.cz/online . Scarica il parser generato su https://gist.github.com/3362830 .


2
PEG? Non sta costruendo un AST un po 'di memoria pesante per una grammatica di tipo III. Riesce a gestire campi che contengono caratteri di nuova riga perché è il caso più difficile da coprire in un parser "grammatica regolare". Ad ogni modo, +1 per un nuovo approccio.
Evan Plaice

1
Sì, gestisce newline all'interno di un campo.
Trevor Dixon,

2
Bello ... Solo con questo, è meglio del 95% di tutte le implementazioni che abbia mai visto. Se vuoi verificare la piena conformità RFC, dai un'occhiata ai test qui ( jquery-csv.googlecode.com/git/test/test.html ).
Evan Plaice,

6
Ben fatto. +1 per avermi attivato su PEG. Adoro i generatori di parser. "Perché programmare a mano in cinque giorni ciò che puoi spendere per cinque anni della tua vita automatizzando?" - Terence Parr, ANTLR
Sottofissione

14

csvToArray v1.3

Una funzione compatta (645 byte) ma conforme per convertire una stringa CSV in un array 2D, conforme allo standard RFC4180.

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

Uso comune: jQuery

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

Uso comune: Javascript

csvAsArray = csvAsString.csvToArray();

Sostituisci il separatore di campo

csvAsArray = csvAsString.csvToArray("|");

Sostituisci separatore record

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

Ignora intestazione Skip

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

Ignora tutto

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

Sembra interessante ma non riesco a trovare il codice ora. Puoi postarlo di nuovo?
Sam Watkins,

1
Ho aggiornato il post principale con un collegamento corrente. Grazie molto.
dt192,

3

Non sono sicuro del perché non potrei Kirtans ex. lavorare per me. Sembrava non riuscire su campi vuoti o forse campi con virgole finali ...

Questo sembra gestire entrambi.

Non ho scritto il codice parser, solo un wrapper attorno alla funzione parser per farlo funzionare per un file. vedi Attribuzione

    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;
        }
    }

1

Espressioni regolari in soccorso! Queste poche righe di codice gestiscono i campi correttamente citati con virgole, virgolette e newline incorporati basati sullo standard 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' ] ]

Non hai bisogno di un generatore di parser come lex / yacc. L'espressione regolare gestisce correttamente RFC 4180 grazie a lookbehind positivo, lookbehind negativo e lookahead positivo.

Clonare / scaricare il codice su https://github.com/peterthoeny/parse-csv-js


I regexps sono implementati usando macchine a stati finiti, quindi è necessario FSM.
Henry Henrinson,

@HenryHenrinson: non necessariamente. Ti sfido a trovare un problema con il codice sopra. Lo uso in produzione. È anche possibile eseguire analisi più complesse con espressioni regolari. Non è necessario un parser LL per creare un albero di sintassi. Ecco un blog: Come utilizzare le espressioni regolari per strutture annidate di analisi
Peter Thoeny

@HenryHenrinson: Oh, sì, manichino, siamo in violento accordo :-)
Peter Thoeny,

1

ecco la mia semplice vaniglia 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
}

-1

Ho costruito questo script javascript per analizzare un CSV in stringa su oggetto array. Trovo che sia meglio suddividere l'intero CSV in linee, campi ed elaborarli di conseguenza. Penso che ti sarà facile cambiare il codice in base alle tue esigenze.

Spero che ti possa aiutare. Grazie.

    //
    //
    // 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'
        }
    }

-3

Perché non usare solo .split (',')?

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

var str="How are you doing today?";
var n=str.split(" "); 

2
Perché questa è una cattiva risposta? È nativo, inserisce il contenuto delle stringhe in un array funzionale ...
Michea

20
Molte ragioni. Innanzitutto, non rimuove le doppie virgolette sui valori delimitati. Non gestisce la divisione di linea. Non sfugge alle virgolette doppie utilizzate per sfuggire alle virgolette doppie utilizzate nei valori delimitati. Non consente valori vuoti. ecc, ecc ... La flessibilità del formato CSV lo rende molto facile da usare ma difficile da analizzare. Non declasserò questo, ma solo perché non declasserò le risposte della concorrenza.
Evan Plaice,

1
Che dire quando si incontra un valore che contiene un carattere newline? Una semplice funzione di divisione la interpreterà erroneamente come la fine di una voce invece di saltarla come dovrebbe. L'analisi di CSV è molto più complicata della semplice fornitura di 2 routine divise (una per le nuove righe, una per i delimitatori).
Evan Plaice,

2
(cont) Anche diviso su valori null (a, null ,, value) non restituisce nulla mentre dovrebbe restituire una stringa vuota. Non fraintendetemi, la divisione è un buon inizio se si è sicuri al 100% che i dati in arrivo non danneggino il parser ma creare un parser robusto in grado di gestire tutti i dati conformi a RFC 4801 è significativamente più complicato.
Evan Plaice,

8
Evan, penso che la tua libreria javascript sia fantastica. Ma ecco un'altra prospettiva: ho apprezzato questa risposta, poiché sto semplicemente memorizzando una serie di numeri in modo molto prevedibile. Per me è molto più importante ottenere la compatibilità Javascript e la manutenibilità cross-browser il più lontano possibile in futuro, piuttosto che includere una grande libreria (sebbene ben scritta e ben collaudata). Esigenze diverse richiedono approcci diversi. Se mai avessi bisogno di una vera potenza CSV, mi impegnerò sicuramente a utilizzare la tua libreria! :-)
moodboom
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.