javascript - सीएसवी डेटा पार्स करने के लिए जावास्क्रिप्ट कोड





csv (8)


मुझे लगता है कि मैं पर्याप्त रूप से कीर्तन के जवाब को हरा सकता हूं

jQuery-CSV दर्ज jQuery-CSV

यह एक jquery प्लगइन है जो जावास्क्रिप्ट डेटा में सीएसवी को पार्स करने के लिए एंड-टू-एंड समाधान के रूप में काम करने के लिए डिज़ाइन किया गया है। यह आरएफसी 4180 में प्रस्तुत किए गए प्रत्येक एकल किनारे के साथ-साथ कुछ जो एक्सेल / Google स्प्रेडशीड निर्यात (यानी अधिकतर शून्य मानों को शामिल करते हैं) के लिए पॉप अप करते हैं, जो कि स्पेक गायब है।

उदाहरण:

ट्रैक, कलाकार, एल्बम, साल

खतरनाक, 'बुस्टा राइम्स', 'जब आपदा स्ट्राइक्स', 1 99 7

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

अद्यतन करें:

ओह हाँ, मुझे शायद यह भी उल्लेख करना चाहिए कि यह पूरी तरह विन्यास योग्य है।

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

अद्यतन 2:

यह अब jQuery के साथ Node.js पर भी काम करता है। तो आपके पास एक ही lib के साथ क्लाइंट-साइड या सर्वर-साइड पार्सिंग करने का विकल्प है।

अद्यतन 3:

चूंकि Google Code shutdown, jquery-csv को गिटहब में माइग्रेट कर दिया गया है

अस्वीकरण: मैं jQuery-CSV का लेखक भी हूं।

क्या किसी को कोई विचार है कि मुझे CSV डेटा को पार्स करने के लिए कुछ जावास्क्रिप्ट कोड कहां मिल सकता है?




यहां मेरा पीईजी (.js) व्याकरण है जो आरएफसी 4180 में ठीक है (यानी यह 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 '"'; }
  / [^"]

इसे http://jsfiddle.net/knvzk/10 या http://pegjs.majda.cz/online पर आज़माएं। https://gist.github.com/3362830 पर जनरेटेड पार्सर डाउनलोड https://gist.github.com/3362830




यहां एक बेहद सरल सीएसवी पार्सर है जो उद्धृत फ़ील्ड को अल्पविराम, नई लाइनों, और डबल कोटेशन अंक से बचता है। कोई विभाजन या RegEx नहीं है। यह एक समय में इनपुट स्ट्रिंग 1-2 वर्ण स्कैन करता है और एक सरणी बनाता है।

इसे 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 = col = 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;
}



मेरे पास स्प्रेडशीट प्रोजेक्ट के हिस्से के रूप में implementation

यह कोड अभी तक पूरी तरह से परीक्षण नहीं किया गया है, लेकिन इसका उपयोग करने के लिए किसी का भी स्वागत है।

चूंकि कुछ उत्तरों ने नोट किया है, हालांकि, यदि आपके पास वास्तव में DSV या TSV फ़ाइल है, तो आपका कार्यान्वयन बहुत आसान हो सकता है, क्योंकि वे मानों में रिकॉर्ड और फील्ड विभाजक के उपयोग को अस्वीकार करते हैं। दूसरी ओर, सीएसवी वास्तव में एक क्षेत्र के अंदर अल्पविराम और न्यूलाइन हो सकती है, जो अधिकांश रेगेक्स और विभाजित-आधारित दृष्टिकोण को तोड़ती है।

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



आप इस ब्लॉग एंट्री में उल्लिखित CSVToArray() फ़ंक्शन का उपयोग कर सकते हैं।

<script type="text/javascript">
    // ref: http://.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>






csvToArray v1.3

एक कॉम्पैक्ट (645 बाइट्स) लेकिन एक सीएसवी स्ट्रिंग को 2 डी सरणी में बदलने के लिए अनुपालन समारोह, आरएफसी 4180 मानक के अनुरूप है।

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

सामान्य उपयोग: jQuery

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

सामान्य उपयोग: जावास्क्रिप्ट

csvAsArray = csvAsString.csvToArray();

फील्ड विभाजक ओवरराइड करें

csvAsArray = csvAsString.csvToArray("|");

रिकॉर्ड विभाजक ओवरराइड करें

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

छोड़ें हेडर ओवरराइड करें

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

सभी ओवरराइड करें

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



यह सुनिश्चित करने के लिए कुछ अन्य साइट आपके डेटा को चोरी करने की कोशिश करने के लिए बुरा चालें नहीं कर सकती हैं। उदाहरण के लिए, सरणी कंस्ट्रक्टर को बदलकर , फिर इस JSON URL को <script> टैग के माध्यम से, दुर्भावनापूर्ण तृतीय-पक्ष साइट JSON प्रतिक्रिया से डेटा चुरा सकती है। while(1); लगाकर while(1); शुरुआत में, स्क्रिप्ट इसके बजाय लटकाएगी।

XHR और दूसरी तरफ एक अलग JSON पार्सर का उपयोग करके एक ही-साइट अनुरोध, आसानी से while(1); अनदेखा कर सकता है while(1); उपसर्ग।







javascript csv