Example JavaScript code to parse CSV data

前端 未结 12 1741
梦谈多话
梦谈多话 2020-11-21 07:58

Where could I find some JavaScript code to parse CSV data?

12条回答
  •  灰色年华
    2020-11-21 08:37

    I have constructed this JavaScript script to parse a CSV in string to array object. I find it better to break down the whole CSV into lines, fields and process them accordingly. I think that it will make it easy for you to change the code to suit your need.

        //
        //
        // 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 the last character 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 a 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'
            }
        }
    

提交回复
热议问题