সিএসভি ডেটা পার্স করার জন্য জাভাস্ক্রিপ্ট কোড


216

CSV ডেটা পার্স করার জন্য আমি কোথায় কিছু জাভাস্ক্রিপ্ট কোড পেতে পারি সে সম্পর্কে কারও কি ধারণা আছে?


3
এই উত্তরটি এখানে কটাক্ষপাত, এটা ভাল উত্তর আছে: stackoverflow.com/questions/8493195/...
Dobes Vandermeer

14
নীচের উত্তরগুলির বেশিরভাগটি অ্যান্ডির দ্বারা একপাশে কেবল ভুল। প্যাটার্ন মেলানো বা বিভাজনগুলি ব্যবহার করে এমন কোনও উত্তর ব্যর্থ হওয়ার জন্য ডুমড হয় - তারা পালানোর ক্রমগুলি সমর্থন করবে না। তার জন্য, আপনার একটি সসীম রাষ্ট্র মেশিনের প্রয়োজন।
গ্রেগ.কিন্ডেল

3
জাভাস্ক্রিপ্ট এবং পাপা পার্সের
রাফায়েল

4
অনেকগুলি বৈশিষ্ট্য সহ একাধিক বিকল্প পাপা পার্সে রয়েছে (বহু-থ্রেডড, শিরোনাম সারি সমর্থন, স্বতঃ-
সনাক্তকারী ডিলিমেটার

1
পাপাপার্সের জন্য আর একটি ভোট, আমি এটি AngularJS এর ​​সাথে ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করে।
দিমিত্রি বুসলাইভ

উত্তর:


257

আপনি এই ব্লগ এন্ট্রিতে উল্লিখিত CSVToArray () ফাংশনটি ব্যবহার করতে পারেন ।

<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
এটি এম্বেড করা কমা, উদ্ধৃতি এবং লাইন ব্রেকগুলি পরিচালনা করতে পারে, যেমন: var csv = 'id, মান \ n1, জেমস \ n02, "জিমি স্মিথ, এসকিউ।" \ N003, "জেমস" "জিমি" "স্মিথ, তৃতীয়" \ n0004, "জেমস \ n স্মিথ W n এখানে" "ভার অ্যারে = CSVToArray (সিএসভি,", ");
প্রোটোটাইপ

4
এটা তোলে দেয় undefinedজন্য খালি ক্ষেত্র যে উদ্ধৃত । উদাহরণ: CSVToArray("4,,6")আমাকে দেয় [["4","","6"]], কিন্তু CSVToArray("4,\"\",6")দেয় [["4",undefined,"6"]]
পাইং

3
ফায়ারফক্সে আমার এটি নিয়ে সমস্যা ছিল এবং স্ক্রিপ্টটি প্রতিক্রিয়াহীন হয়ে পড়েছে। এটি কেবলমাত্র কয়েকটি ব্যবহারকারীকেই প্রভাবিত করেছিল বলে মনে হয়েছিল, কারণ খুঁজে পাওয়া যায়নি
জেডিএন্ডসিপশান

8
রেজেক্সে একটি বাগ রয়েছে: "([^\"\\"হওয়া উচিত "([^\\"। অন্যথায় অসমর্থিত মানটির যে কোনও জায়গায় একটি দ্বিগুণ উদ্ধৃতি অকালপূর্বক এটি শেষ করবে। এটি কঠিন
পথটি পেয়েছে

5
উপরের পদ্ধতিটির রেগেক্স
জোশ ম্যাক

147

jQuery এর-করা CSV

এটি জাভাস্ক্রিপ্ট ডেটাতে সিএসভি পার্স করার জন্য শেষ থেকে শেষের সমাধান হিসাবে কাজ করার জন্য তৈরি একটি জ্যাকেই প্লাগইন। এটি আরএফসি 4180 উপস্থাপিত প্রতিটি একক প্রান্ত কেস পরিচালনা করে সেই সাথে এক্সেল / গুগল স্প্রেডশীড রফতানির জন্য পপ আপ করে (যেমন বেশিরভাগ নাল মান জড়িত) যে অনুপস্থিতটি অনুপস্থিত রয়েছে।

উদাহরণ:

ট্র্যাক, শিল্পী, অ্যালবাম, বছর

বিপজ্জনক, 'বুস্তা রমিস', 'যখন বিপর্যয় হ'ল', 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'

হালনাগাদ:

হ্যাঁ, আমার সম্ভবত এটিও উল্লেখ করা উচিত যে এটি সম্পূর্ণরূপে কনফিগারযোগ্য।

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

আপডেট 2:

এটি এখন নোড.জেএস-তেও jQuery এর সাথে কাজ করে। সুতরাং আপনার কাছে ক্লায়েন্ট-সাইড বা সার্ভার-সাইড পার্সিং একই বিকল্পের সাহায্যে করার বিকল্প রয়েছে।

আপডেট 3:

গুগল কোড বন্ধ হওয়ার পরে, jquery-csv গিটহাবে স্থানান্তরিত হয়েছে

দাবি অস্বীকার: আমি jQuery-CSV এর লেখকও।


29
এটি jQuery সিএসভি কেন? কেন এটি jQuery উপর নির্ভর করে?
উত্সটির

17
@ paulslater19 প্লাগইন jquery এর উপর নির্ভর করে না। বরং এটি সাধারণ jQuery বিকাশের নির্দেশিকা অনুসরণ করে। অন্তর্ভুক্ত সমস্ত পদ্ধতি হ'ল স্থিতিশীল এবং তাদের নিজস্ব নেমস্পেসের অধীনে থাকে (যেমন cs .csv)। এগুলিকে jQuery ছাড়াই ব্যবহার করতে কেবল এমন একটি গ্লোবাল $ অবজেক্ট তৈরি করুন যা প্লাগইনটি আরম্ভের সময় বাঁধবে।
ইভান প্লেইস

2
হয় csvসমাধান কোডে পড়ুন .csv filename? আমি একটি ভাল সিএসভি ফাইল পার্স করার জন্য একটি ভাল জেএস / জিকুয়ের সরঞ্জামে আগ্রহী
বাউনিং

1
@ বাউন্সিং হিপ্পো উদাহরণস্বরূপ এটি কেবল CSV ডেটার একটি স্ট্রিংয়ের কথা উল্লেখ করছে তবে এইচআইবিএল 5 ফাইল এপিআই ব্যবহার করে ব্রাউজারে স্থানীয়ভাবে সিএসভি ফাইলগুলি খোলার জন্য লিব ব্যবহার করা যেতে পারে। এখানে jquery-csv.googlecode.com/git/example/file-handling.html ক্রিয়ায় এর উদাহরণ এখানে ।
ইভান প্লেইস

1
প্রদত্ত যে এটি jQuery এর উপর নির্ভরশীল নয়, বৈশ্বিক "$" নির্ভরতা অপসারণ করা এবং ব্যবহারকারীদের যে কোনও অবজেক্ট রেফারেন্সটি তারা পাস করতে দেওয়া ভাল। এটি উপলভ্য থাকলে সম্ভবত jQuery এ ডিফল্ট। অন্যান্য লাইব্রেরি রয়েছে যেগুলি "$" ব্যবহার করে এবং এটি সম্ভবত গ্রন্থাগারগুলির ন্যূনতম প্রক্সি সহ উন্নয়ন দলগুলি ব্যবহার করতে পারে।
রবিজি

40

আমার একটি স্প্রেডশিট প্রকল্পের অংশ হিসাবে একটি বাস্তবায়ন রয়েছে

এই কোডটি এখনও পুরোপুরি পরীক্ষিত হয়নি, তবে যে কেউ এটি ব্যবহারে স্বাগত।

উত্তরগুলির মধ্যে যেমন উল্লেখ করা হয়েছে, আপনার বাস্তবায়নে ডিএসভি বা টিএসভি ফাইল থাকলে আপনার প্রয়োগ অনেক সহজ হতে পারে , কারণ তারা মানগুলিতে রেকর্ড এবং ফিল্ড বিভাজকের ব্যবহারকে অস্বীকার করে। অন্যদিকে, CSV এর ক্ষেত্রের ভিতরে আসলে কমা ও নতুনলাইন থাকতে পারে, যা বেশিরভাগ রেজেক্স এবং বিভক্ত-ভিত্তিক পদ্ধতির বিরতি দেয়।

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
এটি আমার প্রিয় উত্তরগুলির মধ্যে একটি। এটি একটি বাস্তব পার্সার প্রচুর কোডে প্রয়োগ করা হয়নি।
ট্রেভর ডিকসন

1
যদি একটি লাইনের শেষে একটি কমা স্থাপন করা হয়, একটি খালি ঘর এটি অনুসরণ করা উচিত। এই কোডটি কেবলমাত্র পরবর্তী লাইনে চলে যায় যার ফলে একটি undefinedঘরের ফলাফল হয় । উদাহরণস্বরূপconsole.log(CSV.parse("first,last,age\r\njohn,doe,"));
স্কিবুল্ক

এছাড়াও, খালি সেলগুলি খালি স্ট্রিংগুলিতে পার্স করা উচিত। এই কোডটি তাদের শূন্যে বিভক্ত করে, যা বিভ্রান্তিকর কারণ কোষগুলি বাস্তবে জিরোগুলি ধারণ করতে পারে:console.log(CSV.parse("0,,2,3"));
স্কিবুল্ক

@ এসকিবুল্ক আপনার দ্বিতীয় মন্তব্যটি ভুল (কমপক্ষে ক্রোমে আপনার উদাহরণ দিয়ে ভাল কাজ করে)। আপনার প্রথম মন্তব্যটি বৈধ, যদিও এটি সহজেই ঠিক করা হয়েছে - নীচের ঠিক আগে যুক্ত করুন if ('\r' === chars[c]) { ... }:if (end === c-1) { row.push(reviver(table.length-1, row.length, '')); }
কোডারফোরাফুলি

35

এখানে একটি অত্যন্ত সাধারণ সিএসভি পার্সার রয়েছে যা কোমা, নতুন লাইনগুলি সহ উদ্ধৃত ক্ষেত্রগুলি পরিচালনা করে এবং ডাবল উদ্ধৃতি চিহ্ন থেকে রক্ষা পেয়েছে। এখানে কোনও বিভাজন বা রেজিএক্স নেই। এটি একবারে ইনপুট স্ট্রিং 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 = 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;
}

এটি সহজ এবং এটি আমার পক্ষে কাজ করে, আমি পরিবর্তিত একমাত্র জিনিসটি
মানটিতে

3
এটি পরিষ্কার এবং আরও সোজা এগিয়ে বলে মনে হচ্ছে। আমাকে একটি 4 এমবি ফাইল পার্স করতে হয়েছিল এবং অন্যান্য উত্তরগুলি আমার উপর ie8 এ ক্র্যাশ হয়েছিল, তবে এটি এটি পরিচালনা করে।
চার্লস ক্লেটন

3
এটি আমার জন্যও কাজ করেছিল। লাইন ফিডগুলি সঠিকভাবে পরিচালনা করার অনুমতি দেওয়ার জন্য আমাকে একটি পরিবর্তন করতে হয়েছিল:if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; } if (cc == '\n' && !quote) { ++row; col = 0; continue; }
ব্যবহারকারী 655063

1
অন্য একজন ব্যবহারকারী (@ সোরিন-পোষ্টেলনিকু) ফলশ্রুতিতে অভিধানটিকে একটি সামগ্রীতে পরিণত করতে সহায়তার সাথে একটি ফাংশন প্রকাশ করেছেন: jsfiddle.net/8t2po6W
ট্রেভর ডিকসন

1
হ্যাঁ, যে কোনও সময় গতি প্রয়োজন বা মেমরির পদচিহ্নগুলির বিষয়টি, এর মতো একটি পরিষ্কার সমাধান আরও উন্নত। স্টেট মেশিন-এস্ক পার্সিং এত মসৃণ।
টাটারাইজ

14

এখানে আমার পিইজি (.js) ব্যাকরণ যা আরএফসি 4180 এ ঠিক আছে বলে মনে হচ্ছে (যেমন এটি http://en.wikedia.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 এ ডাউনলোড করুন ।


2
PEG? টাইপ তৃতীয় ব্যাকরণের জন্য ভারী একটি এএসটি তৈরি করছে না heavy এটি কি এমন ক্ষেত্রগুলি পরিচালনা করতে পারে যেগুলিতে নিউলাইন চরগুলি রয়েছে কারণ এটি 'নিয়মিত ব্যাকরণ' পার্সারে অন্তর্ভুক্ত করা সবচেয়ে কঠিন বিষয়। যেভাবেই হোক, একটি অভিনব পদ্ধতির জন্য +1।
ইভান প্লেস 31'13

1
হ্যাঁ, এটি একটি ক্ষেত্রের ভিতরে নতুন লাইন পরিচালনা করে।
ট্রেভর ডিকসন

2
ভাল ... একা, এটি আমার দেখা সমস্ত বাস্তবায়নের 95% এর চেয়ে ভাল। আপনি যদি পুরো আরএফসি সম্মতিতে যাচাই করতে চান তবে পরীক্ষাগুলি এখানে দেখুন ( jquery-csv.googlecode.com/git/test/test.html )।
ইভান প্লেস

6
ভালো খেলেছ. আমাকে পিইজি-তে চালু করার জন্য +1। আমি পার্সার-জেনারেটর পছন্দ করি। "আপনি নিজের জীবনের পাঁচ বছর স্বয়ংক্রিয়ভাবে কাটাতে পারেন এমনটি পাঁচ দিনের মধ্যে কেন প্রোগ্রাম করবেন?" - টেরেন্স পারর,
এএনটিএলআর

14

csvToArray v1.3

একটি সিএসভি স্ট্রিংকে 2 ডি অ্যারে রূপান্তর করতে একটি কমপ্যাক্ট (645 বাইট) তবে অনুগত ফাংশন, আরএফসি 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);

এটি আকর্ষণীয় মনে হলেও আমি এখন কোডটি খুঁজে পাচ্ছি না। আপনি কি আবার পোস্ট করতে পারেন?
স্যাম ওয়াটকিন্স

1
আমি একটি বর্তমান লিঙ্ক সহ প্রধান পোস্ট আপডেট করেছি। অনেক ধন্যবাদ.
dt192

3

আমি নিশ্চিত না কেন আমি প্রাক্তন কীর্তন করতে পারলাম না। আমার জন্য কাজ করতে। দেখে মনে হচ্ছে এটি খালি মাঠগুলিতে বা পিছনের কমা দিয়ে ক্ষেত্রগুলিতে ব্যর্থ হচ্ছে ...

এই উভয় হ্যান্ডেল বলে মনে হচ্ছে।

আমি কোনও পার্সার কোডটি লিখিনি, পার্সার ফাংশনের চারপাশে কেবল একটি মোড়ক কোনও ফাইলের জন্য এই কাজটি তৈরি করতে। বৈশিষ্ট্য দেখুন

    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

নিয়মিত অভিব্যক্তি উদ্ধার! এই কয়েকটি লাইনের কোড হ্যান্ডেল এম্বেড এমড কমা, কোটস এবং আরএফসি 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' ] ]

আপনার কোনও পার্সার-জেনারেটরের দরকার নেই যেমন লেক্স / ইয়্যাক। নিয়মিত অভিব্যক্তি আরএফসি 4180 পরিচালনা করে সঠিকভাবে ইতিবাচক চেহারা, নেতিবাচক লুকবিহীন এবং ইতিবাচক চেহারাটির জন্য ধন্যবাদ to

ক্লোন / ডাউনলোড কোডটি https://github.com/peterthoeny/parse-csv-js এ


Regexps সীমাবদ্ধ রাষ্ট্র মেশিন ব্যবহার করে প্রয়োগ করা হয় যাতে আপনার বাস্তবিকই FSM প্রয়োজন।
হেনরি হেনরিসন

@ হেনরিহেনারিনসন: অগত্যা নয়। আমি আপনাকে উপরের কোড সহ একটি সমস্যা খুঁজে পেতে চ্যালেঞ্জ জানাই। আমি উত্পাদন এটি ব্যবহার। নিয়মিত প্রকাশের সাথে আরও জটিল বিশ্লেষণ করাও সম্ভব। সিনট্যাক্স ট্রি তৈরি করতে আপনার কোনও এলএল পার্সার লাগবে না। এখানে একটি ব্লগ রয়েছে: নেস্টেড স্ট্রাকচারগুলি পার্স করার নিয়মিত এক্সপ্রেশন কীভাবে ব্যবহার করবেন, twiki.org/cgi-bin/view/Blog/BlogEntry201109x3
পিটার থোনি

@ হেনরিহেনারসন: ওহ, হ্যাঁ, আমাকে ডামি, আমরা সহিংস চুক্তিতে
রয়েছি

-1

আমি এই জাভাস্ক্রিপ্ট স্ক্রিপ্টটি অ্যারে অবজেক্টের স্ট্রিংয়ে একটি সিএসভি পার্স করার জন্য তৈরি করেছি। আমি পুরো সিএসভি লাইন, ক্ষেত্রের মধ্যে বিভক্ত করা এবং সে অনুযায়ী তাদের প্রক্রিয়া করা ভাল better আমি মনে করি যে আপনার প্রয়োজন অনুসারে কোডটি পরিবর্তন করা আপনার পক্ষে সহজ করে দেবে।

আমি আশা করি এটা তোমাকে সাহায্য করবে। ধন্যবাদ।

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

শুধু .split (',') ব্যবহার করবেন না কেন?

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

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

2
কেন এটি খারাপ উত্তর? এটা তোলে নেটিভ, কার্যকর অ্যারের মধ্যে স্ট্রিং বিষয়বস্তু স্থাপন ...
মীখা

20
প্রচুর কারণ। প্রথমত, এটি সীমিত মানগুলিতে ডাবল উদ্ধৃতিগুলি সরিয়ে দেয় না। লাইন বিভাজন পরিচালনা করে না। সীমানাঙ্কিত মানগুলিতে ব্যবহৃত ডাবল উদ্ধৃতিগুলি এড়াতে ব্যবহৃত ডাবল-ডাবল উদ্ধৃতিগুলি ছেড়ে যায় না। খালি মানকে অনুমতি দেয় না। ইত্যাদি, ইত্যাদি ... সিএসভি ফর্ম্যাটটির নমনীয়তা এটিকে ব্যবহার করা খুব সহজ তবে পার্স করা কঠিন। আমি এটিকে হ্রাস করব না তবে কেবল কারণ আমি প্রতিযোগিতামূলক উত্তরগুলিকে চেয়েছিলাম না।
ইভান প্লেস

1
আপনি যখন একটি নিউলাইন চর ধারণ করে এমন কোনও মানটির মুখোমুখি হন তখন কী হবে? একটি সাধারণ বিভক্ত ফাংশনটি এটিকে এড়িয়ে যাওয়ার পরিবর্তে এন্ট্রি হিসাবে শেষ হওয়া হিসাবে এটি ভুলভাবে ব্যাখ্যা করবে। কেবল 2 বিভক্ত রুটিন সরবরাহের চেয়ে CSV পার্স করা আরও জটিল (
ইভান প্লেস

2
(বিরাম) এছাড়াও নাল মানগুলিতে বিভক্ত (ক, নাল, মান) কিছুই দেয় না যদিও এটি খালি স্ট্রিংটি ফিরিয়ে আনবে। আমাকে ভুল করবেন না, আপনি যদি 100% ধনাত্মক হন তবে আগত ডেটা পার্সারটি ভাঙবে না তবে আরএফসি 4801 এর সাথে সঙ্গতিপূর্ণ যে কোনও ডেটা হ্যান্ডেল করতে পারে এমন একটি দৃ rob় পার্সার তৈরি করা উল্লেখযোগ্যভাবে আরও জটিল split
ইভান প্লেস

8
ইভান, আমি মনে করি আপনার জাভাস্ক্রিপ্ট লাইব্রেরি দুর্দান্ত। তবে এখানে অন্য দৃষ্টিকোণটি রয়েছে - আমি এই উত্তরটির প্রশংসা করেছি, কারণ আমি কেবল একটি খুব অনুমানযোগ্য ফ্যাশনে ধারাবাহিক সংখ্যা সংরক্ষণ করছি। একটি বৃহত (ভাল-লিখিত এবং ভাল-পরীক্ষিত) লাইব্রেরি অন্তর্ভুক্ত করার চেয়ে যতটা সম্ভব ভবিষ্যতে গ্যারান্টিযুক্ত ক্রস ব্রাউজার জাভাস্ক্রিপ্টের সামঞ্জস্যতা এবং রক্ষণাবেক্ষণ পাওয়ার পক্ষে আমার পক্ষে আরও গুরুত্বপূর্ণ। বিভিন্ন প্রয়োজনের জন্য বিভিন্ন পদ্ধতির প্রয়োজন। আমার যদি কখনও সত্যিকারের সিএসভি পাওয়ার প্রয়োজন হয় তবে আমি অবশ্যই আপনার লাইব্রেরিটি ব্যবহার করার প্রতিশ্রুতি দেব! :-)
মুডবুম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.