CSV verilerini ayrıştırmak için Javascript kodu


217

Birisi nerede CSV verilerini ayrıştırmak için bazı javascript kodu bulabiliriz hakkında bir fikrim var mı?


3
Bu yanıta bir göz atın, iyi cevapları var: stackoverflow.com/questions/8493195/…
Dobes Vandermeer

14
Aşağıdaki cevapların çoğu Andy'nin yanı sıra yanlış. Örüntü eşleme veya böler kullanan herhangi bir yanıt başarısız olmaya mahkumdur - kaçış dizilerini desteklemezler. Bunun için bir sonlu durum makinesine ihtiyacınız var.
greg.kindel

3
Yerel bir CSV Dosyasını JavaScript ve Papa Ayrıştırma ile Ayrıştırma: joyofdata.de/blog/…
Raffael

4
Papa Parse , birçok özelliğe sahip başka bir seçenektir (çok iş parçacıklı, başlık satırı desteği, otomatik algılayıcı sınırlayıcı ve daha fazlası)
Hinrich

1
PapaParse için başka bir oy, AngularJS ile kullanıyorum ve harika çalışıyor.
Dmitry Buslaev

Yanıtlar:


258

Bu blog girişinde belirtilen CSVToArray () işlevini kullanabilirsiniz .

<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
Bu, gömülü virgül, tırnak işaretleri ve satır sonlarını işleyebilir, örn .: var csv = 'id, değer \ n1, James \ n02, "Jimmy Smith, Esq." \ N003, "James" "Jimmy" "Smith, III" \ n0004, "James \ nSmith \ nWuz Here" 'var array = CSVToArray (csv, ",");
prototip

4
Bu verir undefinediçin boş alanlara edilir alıntı . Örnek: CSVToArray("4,,6")bana verir [["4","","6"]], ama CSVToArray("4,\"\",6")verir [["4",undefined,"6"]].
Pang

3
Firefox'ta bununla ilgili sorunlar yaşadım ve komut dosyası yanıt vermiyor. Ancak sadece birkaç kullanıcıyı etkiliyor gibi görünüyordu, bu yüzden sebebini bulamadım
JDandChips

8
Normal ifadede bir hata var: "([^\"\\"olmalı "([^\\". Aksi takdirde, alıntılanmamış bir değerdeki herhangi bir yerde yapılan çift tırnak, vaktinden önce sona erer. Bunu zor yoldan
buldum

5
Yukarıdaki yöntemin indirgenmiş bir sürümünü arayan herkes için, yukarıda açıklanan normal ifade düzeltmesi uygulandı: gist.github.com/Jezternz/c8e9fafc2c114e079829974e3764db75
Josh Mc

147

jQuery CSV

CSV'yi Javascript verilerine ayrıştırmak için uçtan uca bir çözüm olarak çalışmak üzere tasarlanmış bir jquery eklentisidir. RFC 4180'de sunulan her bir kenar durumu ve spesifikasyonun eksik olduğu Excel / Google Spreadsheed dışa aktarmaları (yani çoğunlukla boş değerleri içeren) için açılan bazı kenarları ele alır .

Misal:

parça, sanatçı, albüm, yıl

Tehlikeli, 'Busta Rhymes', 'Felaket Olduğunda', 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'

Güncelleme:

Oh evet, muhtemelen tamamen yapılandırılabilir olduğunu da belirtmeliyim.

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

Güncelleme 2:

Artık Node.js üzerinde jQuery ile de çalışıyor. Böylece, aynı lib ile istemci veya sunucu tarafı ayrıştırma yapma seçeneğiniz vardır.

Güncelleme 3:

Google Code kapatıldığından beri jquery-csv GitHub'a taşındı .

Feragatname: Ben de jQuery-CSV'nin yazarıyım.


29
Neden jQuery csv? Neden jQuery'ye bağlı? Kaynakta hızlı bir tarama yaptım ... jQuery kullanıyorsunuz gibi görünmüyor
paulslater19

17
@ paulslater19 Eklenti jquery'ye bağlı değildir. Bunun yerine, ortak jQuery geliştirme yönergelerini izler. Dahil edilen tüm yöntemler statiktir ve kendi ad alanları altında bulunur (örn. $ .Csv). Bunları jQuery olmadan kullanmak için, başlatma sırasında eklentinin bağlanacağı global bir $ nesnesi oluşturmanız yeterlidir.
Evan Plaice

2
olduğu csvçözüm kodunda bakın .csv filename? bir csv dosyasını ayrıştırmak için iyi bir JS / JQuery aracıyla ilgileniyorum
bouncingHippo

1
@bouncingHippo Örnekte sadece bir csv verisi dizisine atıfta bulunuluyor, ancak lib HTML5 Dosya API'sını kullanarak tarayıcıda yerel olarak csv dosyalarını açmak için kullanılabilir. İşte bir örnek jquery-csv.googlecode.com/git/examples/file-handling.html .
Evan Plaice

1
JQuery'ye bağlı olmadığı göz önüne alındığında, global "$" bağımlılığını kaldırmak ve kullanıcıların istedikleri nesne referansını geçmesine izin vermek daha iyi olur. Varsa, jQuery varsayılanı olabilir. "$" Kullanan başka kütüphaneler de vardır ve bu kütüphanelerin asgari proxy'si olan geliştirme ekipleri tarafından kullanılabilir.
RobG

40

Bir elektronik tablo projesinin parçası olarak bir uygulama var .

Bu kod henüz tam olarak test edilmemiştir, ancak herkes onu kullanabilir.

Bununla birlikte, bazı cevapların belirttiği gibi, gerçekte DSV veya TSV dosyanız varsa, uygulamalarınız değerlerde kayıt ve alan ayırıcılarının kullanılmasına izin vermediği için çok daha basit olabilir . Öte yandan CSV, bir alanın içinde virgül ve yeni satırlara sahip olabilir.

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
Bu benim en sevdiğim cevaplardan biri. Çok fazla kodda uygulanmayan gerçek bir ayrıştırıcıdır.
Trevor Dixon

1
Bir satırın sonuna virgül yerleştirilirse, boş bir hücre onu izlemelidir. Bu kod sadece bir sonraki satıra atlayarak undefinedhücreye neden olur. Örneğin,console.log(CSV.parse("first,last,age\r\njohn,doe,"));
skibulk

Ayrıca, boş hücreler boş dizelere ayrıştırılmalıdır. Bu kod, hücreleri aslında sıfır içerebileceğinden kafa karıştırıcı olan sıfırlara ayrıştırır:console.log(CSV.parse("0,,2,3"));
skibulk

@skibulk İkinci yorumunuz yanlış (en azından Chrome'da örneğinizle iyi çalışıyor). İlk yorumunuz kolayca düzeltilmesine rağmen geçerlidir - daha önce aşağıdakileri ekleyin if ('\r' === chars[c]) { ... }:if (end === c-1) { row.push(reviver(table.length-1, row.length, '')); }
coderforlife

35

Burada alıntı yapılan alanları virgül, yeni satırlar ve çıkış karakterli çift tırnak işaretleri ile işleyen son derece basit bir CSV ayrıştırıcısı. Bölme veya RegEx yok. Giriş dizesini bir seferde 1-2 karakter tarar ve bir dizi oluşturur.

Http://jsfiddle.net/vHKYH/ adresinde test edin .

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

Bu basit ve benim için çalışıyor, değiştirdiğim tek şey değere bir trim () eklemek oldu :)
JustEngland

3
Bu daha temiz ve daha açık görünüyor. 4mb dosyasını ayrıştırmak zorunda kaldım ve diğer cevaplar ie8'de bana çöktü, ama bu başardı.
Charles Clayton

3
Bu da benim için çalıştı. Satır beslemelerinin düzgün işlenmesine izin vermek için bir değişiklik yapmak zorunda kaldım:if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; } if (cc == '\n' && !quote) { ++row; col = 0; continue; }
user655063

1
Başka bir kullanıcı (@ sorin-postelnicu), sonucu bir sözlük nesnesine dönüştürmek için yardımcı bir işlev yayınladı: jsfiddle.net/8t2po6wh .
Trevor Dixon

1
Evet, her zaman hıza ihtiyaç duyulur veya bellek ayak izleri önemlidir, bunun gibi temiz bir çözüm çok daha üstündür. Durum makine-esque ayrıştırma çok daha pürüzsüz.
Ağustos'ta Tatarize

14

İşte RFC 4180'de iyi görünen PEG (.js) dilbilgim (yani, http://en.wikipedia.org/wiki/Comma-separated_values ​​adresindeki örnekleri işler ):

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 '"'; }
  / [^"]

Http://jsfiddle.net/knvzk/10 veya http://pegjs.majda.cz/online adresinden deneyin . Oluşturulan ayrıştırıcıyı https://gist.github.com/3362830 adresinden indirin .


2
PEG? Bir Tip III gramer için bir AST ağır hafızası inşa etmiyor. 'Normal dilbilgisi' ayrıştırıcısını kapsaması en zor durum olduğu için yeni satır karakterleri içeren alanları işleyebilir mi? Her iki durumda da, yeni bir yaklaşım için +1.
Evan Plaice

1
Evet, bir alandaki satırsonu ile ilgilenir.
Trevor Dixon

2
Güzel ... Yalnız bununla, şimdiye kadar gördüğüm tüm uygulamaların% 95'inden daha iyi. Tam RFC uyumluluğunu kontrol etmek istiyorsanız, buradaki testlere göz atın ( jquery-csv.googlecode.com/git/test/test.html ).
Evan Plaice

6
Güzel oynadı. Beni PEG'ye getirdiğim için +1. Ayrıştırıcıları seviyorum. "Neden beş gün içinde el ile programlayarak hayatınızın beş yılını otomatik olarak geçirebilirsiniz?" - Terence Parr, ANTLR
Subfuzion 28:13

14

csvToArray v1.3

CSV dizesini RFC4180 standardına uygun olarak 2D diziye dönüştürmek için kompakt (645 bayt) ancak uyumlu bir işlev.

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

Yaygın Kullanım: jQuery

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

Yaygın kullanım: Javascript

csvAsArray = csvAsString.csvToArray();

Alan ayırıcıyı geçersiz kıl

csvAsArray = csvAsString.csvToArray("|");

Kayıt ayırıcıyı geçersiz kıl

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

Atlama Üstbilgisini Geçersiz Kıl

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

Tümünü geçersiz kıl

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

Kulağa ilginç geliyor ama kodu şimdi bulamıyorum. Tekrar gönderebilir misin?
Sam Watkins

1
Ana yayını güncel bir bağlantıyla güncelledim. Çok teşekkürler.
dt192

3

Neden eski kirtanları bulamadığımdan emin değilim. benim için çalışmak. Boş alanlarda veya belki virgül içeren alanlarda başarısız görünüyor ...

Bu her ikisini de ele alıyor gibi görünüyor.

Ayrıştırıcı kodunu yazmadım, sadece bir dosya için bu işi yapmak için ayrıştırıcı işlevinin etrafında bir sarıcı. bkz. Atıf

    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

Kurtarmaya düzenli ifadeler! Bu birkaç kod satırı, RFC 4180 standardını temel alan katıştırılmış virgül, tırnak işaretleri ve yeni satırlara sahip düzgün şekilde alıntılanmış alanları işler.

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' ] ]

Lex / yacc gibi bir ayrıştırıcıya ihtiyacınız yoktur. Normal ifade, RFC 4180'i olumlu göz, negatif göz ve olumlu göz sayesinde düzgün bir şekilde işler.

Https://github.com/peterthoeny/parse-csv-js adresinde kodu kopyalayın / indirin


Normal ifadeler sonlu durum makineleri kullanılarak uygulanır, böylece aslında FSM'ye ihtiyacınız vardır.
Henry Henrinson

@HenryHenrinson: Mutlaka değil. Yukarıdaki kod ile ilgili bir sorun bulmak için size meydan okuyorum. Üretimde kullanıyorum. Düzenli ifadelerle daha karmaşık ayrıştırma yapmak da mümkündür. Bir sözdizimi ağacı oluşturmak için LL ayrıştırıcısına ihtiyacınız yoktur. İşte bir blog: İç İçe Yapıları Ayrıştırmak için Düzenli İfadeler Nasıl Kullanılır, twiki.org/cgi-bin/view/Blog/BlogEntry201109x3
Peter Thoeny

@HenryHenrinson: Ah, evet, kukla beni, şiddet içeren bir anlaşmaya
vartık

-1

Dizi nesnesine dizede bir CSV ayrıştırmak için bu javascript komut dosyası yaptık. Tüm CSV'yi satırlara, alanlara ayırmayı ve buna göre işlemeyi daha iyi buluyorum. Kodun ihtiyacınıza göre değiştirmenizi kolaylaştıracağını düşünüyorum.

Umarım bu sana yardımcı olur. Teşekkürler.

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

Neden sadece .split (',') kullanılmıyor?

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

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

2
Bu neden kötü bir cevap? Yereldir, dize içeriğini çalıştırılabilir diziye yerleştirir ...
Micah

20
Birçok sebep var. İlk olarak, sınırlanmış değerlerde çift tırnak işaretlerini kaldırmaz. Çizgi ayırmayı işlemez. Sınırlı değerlerde kullanılan çift tırnaklardan kaçmak için kullanılan çift-çift tırnaklardan kaçmaz. Boş değerlere izin vermez. vs, vs ... CSV formatının esnekliği kullanımı çok kolay ama ayrıştırmayı zorlaştırıyor. Bunu küçümsemem ama sadece rakip cevapları küçümsememem.
Evan Plaice

1
Yeni satır karakteri içeren bir değerle karşılaştığınızda ne olur? Basit bir bölme işlevi yanlış olması gerektiği gibi atlamak yerine bir girdinin sonu olarak yanlış yorumlayacaktır. CSV'yi ayrıştırmak, yalnızca 2 bölünmüş rutin sağlamaktan çok daha karmaşıktır (biri yeni satırlar için, biri sınırlayıcılar için).
Evan Plaice

2
(devam) Ayrıca null değerlere (a, null ,, value) bölündüğünde hiçbir şey döndürmezken boş bir dize döndürmelidir. Beni yanlış anlamayın, gelen verilerin ayrıştırıcıyı kırmayacağından% 100 olumlu iseniz, ancak RFC 4801 uyumlu herhangi bir veriyi işleyebilecek sağlam bir ayrıştırıcı oluşturmak önemli ölçüde daha karmaşıksa iyi bir başlangıçtır.
Evan Plaice

8
Evan, bence javascript kütüphanen harika. Ama işte başka bir bakış açısı - bu cevabı takdir ettim, çünkü bir dizi sayıyı çok öngörülebilir bir şekilde saklıyorum. Büyük bir (iyi yazılmış ve iyi test edilmiş) bir kitaplık içermekten çok, garantili çapraz tarayıcı Javascript uyumluluğu ve sürdürülebilirliğini mümkün olduğunca geleceğe taşımak benim için çok daha önemli. Farklı ihtiyaçlar farklı yaklaşımlar gerektirir. Gerçek CSV gücüne ihtiyacım olursa kesinlikle kütüphanenizi kullanmayı taahhüt edeceğim! :-)
moodboom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.