Kode Javascript untuk mem-parsing data CSV

215

Apakah ada yang punya ide di mana saya bisa menemukan beberapa kode javascript untuk mem-parsing data CSV?

Pierre-Gilles Levallois
sumber
3
Lihatlah jawaban ini di sini, ia memiliki jawaban yang baik: stackoverflow.com/questions/8493195/…
Dobes Vandermeer
14
Sebagian besar jawaban di bawah ini salah, selain dari Andy. Setiap jawaban yang menggunakan pencocokan pola atau pemisahan akan gagal - mereka tidak akan mendukung urutan pelarian. Untuk itu, Anda membutuhkan mesin keadaan terbatas.
greg.kindel
3
Parsing File CSV Lokal dengan JavaScript dan Papa Parse: joyofdata.de/blog/…
Raffael
4
Papa Parse adalah pilihan lain dengan banyak fitur (multi-threaded, dukungan baris tajuk, pembatas deteksi otomatis, dan lainnya)
Hinrich
1
Pilihan lain untuk PapaParse, saya menggunakannya dengan AngularJS dan berfungsi dengan baik.
Dmitry Buslaev

Jawaban:

257

Anda dapat menggunakan fungsi CSVToArray () yang disebutkan dalam entri blog ini.

<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
sumber
1
Ini dapat menangani koma yang disematkan, kutipan, dan pemisah baris, mis .: var csv = 'id, value \ n1, James \ n02, "Jimmy Smith, Esq." \ N003, "James" "Jimmy" "Smith, III" \ n0004, "James \ nSmith \ nUntuk Di Sini" 'var array = CSVToArray (csv, ",");
prototipe
4
Ini memberi undefineduntuk bidang kosong yang dikutip . Contoh: CSVToArray("4,,6")memberi saya [["4","","6"]], tetapi CSVToArray("4,\"\",6")memberi saya [["4",undefined,"6"]].
Pang
3
Saya punya masalah dengan firefox ini, dan skripnya menjadi tidak responsif. Tampaknya hanya mempengaruhi beberapa pengguna, jadi tidak dapat menemukan penyebabnya
JDandChips
8
Ada bug di regex: "([^\"\\"seharusnya "([^\\". Kalau tidak, kutipan ganda di mana saja dalam nilai yang tidak dikutip akan mengakhirinya sebelum waktunya. Menemukan ini dengan cara yang sulit ...
Walter Tross
5
Bagi siapa pun yang mencari versi yang dikurangi dari metode di atas, dengan perbaikan regex yang dijelaskan di atas diterapkan: gist.github.com/Jezternz/c8e9fafc2c114e079829974e3764db75
Josh Mc
147

jQuery-CSV

Ini adalah plugin jquery yang dirancang untuk bekerja sebagai solusi ujung ke ujung untuk mem-parsing CSV ke dalam data Javascript. Ini menangani setiap kasus tepi tunggal yang disajikan dalam RFC 4180 , serta beberapa yang muncul untuk ekspor Excel / Google Spreadsheed (yaitu sebagian besar melibatkan nilai nol) yang tidak ada dalam spesifikasi.

Contoh:

trek, artis, album, tahun

Berbahaya, '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'

Memperbarui:

Oh ya, saya mungkin juga harus menyebutkan bahwa itu sepenuhnya dapat dikonfigurasi.

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

Pembaruan 2:

Sekarang juga berfungsi dengan jQuery di Node.js. Jadi, Anda memiliki opsi untuk melakukan penguraian sisi-klien atau sisi-server dengan lib yang sama.

Pembaruan 3:

Sejak Google Code shutdown, jquery-csv telah dimigrasikan ke GitHub .

Penafian: Saya juga penulis jQuery-CSV.

Evan Plaice
sumber
29
Mengapa jQuery csv? Mengapa ini tergantung pada jQuery? Saya telah memindai sekilas sumbernya ... sepertinya Anda tidak menggunakan jQuery
paulslater19
17
@ paulslater19 Plugin tidak bergantung pada jquery. Sebaliknya, ia mengikuti pedoman pengembangan jQuery umum. Semua metode yang dimasukkan adalah statis dan berada di bawah namespace mereka sendiri (yaitu $ .csv). Untuk menggunakannya tanpa jQuery cukup buat objek $ global yang akan diikat oleh plugin selama inisialisasi.
Evan Plaice
2
adalah csvdalam kode solusi mengacu pada .csv filename? Saya tertarik dengan alat JS / JQuery yang bagus untuk mem-parsing file csv
bouncingHippo
1
@ BouncingHippo Dalam contoh itu hanya merujuk pada serangkaian data csv tetapi lib dapat digunakan untuk membuka file csv secara lokal di browser menggunakan HTML5 File API. Berikut ini contohnya dalam aksi jquery-csv.googlecode.com/git/examples/file-handling.html .
Evan Plaice
1
Mengingat itu tidak tergantung pada jQuery, akan lebih baik untuk menghapus ketergantungan "$" global dan membiarkan pengguna melewati referensi objek apa pun yang mereka inginkan. Mungkin default ke jQuery jika tersedia. Ada perpustakaan lain yang menggunakan "$" dan itu mungkin digunakan oleh tim pengembangan dengan proxy minimal dari perpustakaan itu.
RobG
40

Saya memiliki implementasi sebagai bagian dari proyek spreadsheet.

Kode ini belum diuji secara menyeluruh, tetapi siapa pun boleh menggunakannya.

Seperti yang dicatat oleh beberapa jawaban, implementasi Anda bisa lebih sederhana jika Anda benar-benar memiliki file DSV atau TSV , karena mereka melarang penggunaan catatan dan pemisah bidang dalam nilai. CSV, di sisi lain sebenarnya dapat memiliki koma dan baris baru di dalam bidang, yang memecah sebagian besar pendekatan berbasis regex dan split.

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 VanWagoner
sumber
9
Ini adalah salah satu jawaban favorit saya. Ini adalah parser nyata yang diimplementasikan dalam kode yang tidak banyak.
Trevor Dixon
1
Jika koma ditempatkan di ujung garis, sel kosong harus mengikutinya. Kode ini hanya melompat ke baris berikutnya, menghasilkan undefinedsel. Misalnya,console.log(CSV.parse("first,last,age\r\njohn,doe,"));
skibulk
Sel kosong juga harus diurai menjadi string kosong. Kode ini mem-parsing mereka menjadi nol, yang membingungkan karena sel-sel sebenarnya bisa mengandung nol:console.log(CSV.parse("0,,2,3"));
skibulk
@skibulk Komentar kedua Anda salah (setidaknya di Chrome berfungsi baik dengan contoh Anda). Namun, komentar pertama Anda valid, meskipun mudah diperbaiki - tambahkan berikut ini sebelumnya if ('\r' === chars[c]) { ... }:if (end === c-1) { row.push(reviver(table.length-1, row.length, '')); }
coderforlife
35

Berikut adalah parser CSV yang sangat sederhana yang menangani bidang yang dikutip dengan koma, baris baru, dan lolos dari tanda kutip ganda. Tidak ada pemisahan atau RegEx. Ini memindai string input 1-2 karakter sekaligus dan membangun array.

Uji di 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
sumber
Ini sederhana dan berfungsi untuk saya, satu-satunya hal yang saya ubah adalah menambahkan trim () ke nilai :)
JustEngland
3
Ini tampak lebih bersih dan lebih lurus ke depan. Saya harus mengurai file 4MB dan jawaban lain jatuh pada saya di IE8, tetapi ini berhasil.
Charles Clayton
3
Ini juga bekerja untuk saya. Saya harus melakukan satu modifikasi sekalipun untuk memungkinkan penanganan feed baris yang benar:if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; } if (cc == '\n' && !quote) { ++row; col = 0; continue; }
user655063
1
Pengguna lain (@ sorin-postelnicu) membantu menerbitkan fungsi pendamping untuk mengubah hasilnya menjadi objek kamus: jsfiddle.net/8t2po6wh .
Trevor Dixon
1
Ya, kapan saja kecepatan diperlukan atau jejak memori penting, solusi bersih seperti ini jauh lebih unggul. Mesin parsing state-esque jauh lebih halus.
Tatarize
14

Inilah tata bahasa PEG (.js) saya yang tampaknya baik-baik saja di RFC 4180 (yaitu menangani contoh di 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 '"'; }
  / [^"]

Cobalah di http://jsfiddle.net/knvzk/10 atau http://pegjs.majda.cz/online . Unduh parser yang dihasilkan di https://gist.github.com/3362830 .

Trevor Dixon
sumber
2
PASAK? Tidak membangun AST sedikit memori berat untuk tata bahasa Tipe III. Bisakah ia menangani bidang yang berisi karakter baris baru karena itulah kasus paling sulit untuk dibahas dalam parser 'tata bahasa biasa'. Either way, +1 untuk pendekatan baru.
Evan Plaice
1
Ya, ini menangani baris baru di dalam bidang.
Trevor Dixon
2
Bagus ... Dengan itu saja, itu lebih baik daripada 95% dari semua implementasi yang pernah saya lihat. Jika Anda ingin memeriksa kepatuhan RFC penuh, lihat tes di sini ( jquery-csv.googlecode.com/git/test/test.html ).
Evan Plaice
6
Permainan yang bagus. +1 untuk mengaktifkan saya ke PEG. Saya suka generator parser. "Mengapa memprogram dengan tangan dalam lima hari apa yang bisa kamu habiskan untuk otomatisasi seumur hidup selama lima tahun?" - Terence Parr, ANTLR
Subfuzion
14

csvToArray v1.3

Kompak (645 bytes) tetapi berfungsi untuk mengubah string CSV menjadi array 2D, sesuai dengan standar RFC4180.

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

Penggunaan Umum: jQuery

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

Penggunaan umum: Javascript

csvAsArray = csvAsString.csvToArray();

Ganti pemisah bidang

csvAsArray = csvAsString.csvToArray("|");

Ganti pemisah rekaman

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

Override Skip Header

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

Timpa semua

csvAsArray = csvAsString.csvToArray("|", "#", 1);
dt192
sumber
Ini kedengarannya menarik tetapi saya tidak dapat menemukan kode sekarang. Bisakah Anda mempostingnya lagi?
Sam Watkins
1
Saya telah memperbarui posting utama dengan tautan saat ini. Terimakasih banyak.
dt192
3

Saya tidak yakin mengapa saya tidak bisa kirtans ex. bekerja untukku. Tampaknya gagal di bidang kosong atau mungkin bidang dengan tanda koma ...

Yang ini tampaknya menangani keduanya.

Saya tidak menulis kode parser, hanya pembungkus di sekitar fungsi parser untuk membuat ini berfungsi untuk file. lihat Atribusi

    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
sumber
1

Ekspresi reguler untuk penyelamatan! Beberapa baris kode ini menangani bidang yang dikutip dengan benar dengan tanda koma, kutipan, dan baris baru berdasarkan standar 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' ] ]

Anda tidak memerlukan parser-generator seperti lex / yacc. Ekspresi reguler menangani RFC 4180 dengan benar berkat tampilan positif di belakang, tampilan negatif di belakang, dan tampilan positif di depan.

Klon / unduh kode di https://github.com/peterthoeny/parse-csv-js

Peter Thoeny
sumber
Regexps diimplementasikan menggunakan mesin negara terbatas sehingga Anda memang membutuhkan FSM.
Henry Henrinson
@HenryHenrinson: Belum tentu. Saya menantang Anda untuk menemukan masalah dengan kode di atas. Saya menggunakannya dalam produksi. Mungkin juga untuk melakukan parsing yang lebih kompleks dengan ekspresi reguler. Anda tidak perlu pengurai LL untuk membuat pohon sintaks. Berikut ini adalah blog: Cara Menggunakan Ekspresi Reguler ke Parse Nested Structures, Tersarang twiki.org/cgi-bin/view/Blog/BlogEntry201109x3
Peter Thoeny
@HenryHenrinson: Oh, ya, tiru aku, kami dalam perjanjian kekerasan :-)
Peter Thoeny
-1

Saya telah membuat skrip javascript ini untuk mengurai CSV dalam objek string ke array. Saya merasa lebih baik untuk memecah seluruh CSV menjadi garis, bidang dan memprosesnya. Saya pikir itu akan memudahkan Anda untuk mengubah kode sesuai dengan kebutuhan Anda.

Saya harap ini akan membantu Anda. Terima kasih.

    //
    //
    // 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
sumber
-3

Mengapa tidak menggunakan saja .split (',')?

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

var str="How are you doing today?";
var n=str.split(" "); 
Mikha
sumber
2
Mengapa ini jawaban yang buruk? Ini asli, menempatkan konten string ke dalam array yang bisa dikerjakan ...
Micah
20
Banyak alasan. Pertama, itu tidak menghapus tanda kutip ganda pada nilai yang dibatasi. Tidak menangani pemisahan garis. Tidak lolos dari tanda kutip ganda yang digunakan untuk melepaskan tanda kutip ganda yang digunakan dalam nilai yang dibatasi. Tidak mengizinkan nilai kosong. dll, dll ... Fleksibilitas format CSV membuatnya sangat mudah digunakan tetapi sulit untuk diuraikan. Saya tidak akan mengundurkan diri tetapi hanya karena saya tidak mengundurkan diri dari jawaban yang bersaing.
Evan Plaice
1
Bagaimana dengan ketika Anda menemukan nilai yang mengandung karakter baris baru? Fungsi pemisahan sederhana akan salah mengartikannya sebagai akhir entri alih-alih melewatinya seperti seharusnya. Parsing CSV jauh lebih rumit daripada hanya menyediakan 2 rutinitas split (satu untuk baris baru, satu untuk pembatas).
Evan Plaice
2
(cont) Juga dipecah pada nilai null (nilai a, null ,,) tidak mengembalikan apa-apa sedangkan seharusnya mengembalikan string kosong. Jangan salah paham, split adalah awal yang baik jika Anda 100% positif bahwa data yang masuk tidak akan merusak parser tetapi membuat parser kuat yang dapat menangani data apa pun yang sesuai dengan RFC 4801 secara signifikan lebih rumit.
Evan Plaice
8
Evan, saya pikir perpustakaan javascript Anda mengagumkan. Tapi inilah perspektif lain - saya menghargai jawaban ini, karena saya hanya menyimpan serangkaian angka dengan cara yang sangat mudah ditebak. Jauh lebih penting bagi saya untuk mendapatkan kompatibilitas dan perawatan Javascript lintas browser yang terjamin sejauh mungkin di masa depan, daripada menyertakan perpustakaan besar (meskipun ditulis dengan baik dan telah teruji dengan baik). Kebutuhan yang berbeda memerlukan pendekatan yang berbeda pula. Jika saya membutuhkan kekuatan CSV nyata, saya PASTI akan berkomitmen untuk menggunakan perpustakaan Anda! :-)
moodboom