How to read data From *.CSV file using javascript?

后端 未结 13 976
不知归路
不知归路 2020-11-22 00:46

My csv data looks like this:

heading1,heading2,heading3,heading4,heading5,value1_1,value2_1,value3_1,value4_1,value5_1,value1_2,value2_2,value3_2,val

13条回答
  •  傲寒
    傲寒 (楼主)
    2020-11-22 01:07

    Here's a JavaScript function that parses CSV data, accounting for commas found inside quotes.

    // Parse a CSV row, accounting for commas inside quotes                   
    function parse(row){
      var insideQuote = false,                                             
          entries = [],                                                    
          entry = [];
      row.split('').forEach(function (character) {                         
        if(character === '"') {
          insideQuote = !insideQuote;                                      
        } else {
          if(character == "," && !insideQuote) {                           
            entries.push(entry.join(''));                                  
            entry = [];                                                    
          } else {
            entry.push(character);                                         
          }                                                                
        }                                                                  
      });
      entries.push(entry.join(''));                                        
      return entries;                                                      
    }
    

    Example use of the function to parse a CSV file that looks like this:

    "foo, the column",bar
    2,3
    "4, the value",5
    

    into arrays:

    // csv could contain the content read from a csv file
    var csv = '"foo, the column",bar\n2,3\n"4, the value",5',
    
        // Split the input into lines
        lines = csv.split('\n'),
    
        // Extract column names from the first line
        columnNamesLine = lines[0],
        columnNames = parse(columnNamesLine),
    
        // Extract data from subsequent lines
        dataLines = lines.slice(1),
        data = dataLines.map(parse);
    
    // Prints ["foo, the column","bar"]
    console.log(JSON.stringify(columnNames));
    
    // Prints [["2","3"],["4, the value","5"]]
    console.log(JSON.stringify(data));
    

    Here's how you can transform the data into objects, like D3's csv parser (which is a solid third party solution):

    var dataObjects = data.map(function (arr) {
      var dataObject = {};
      columnNames.forEach(function(columnName, i){
        dataObject[columnName] = arr[i];
      });
      return dataObject;
    });
    
    // Prints [{"foo":"2","bar":"3"},{"foo":"4","bar":"5"}]
    console.log(JSON.stringify(dataObjects));
    

    Here's a working fiddle of this code.

    Enjoy! --Curran

提交回复
热议问题