【问题标题】:Parse CSV records in to an array of objects in JavaScript将 CSV 记录解析为 JavaScript 中的对象数组
【发布时间】:2019-11-24 10:09:40
【问题描述】:

我是 JS 新手,在 Regex 中没有太多 exp 可以玩字符串操作。

这是我的 CSV 文件,其中包含表格形式的记录,第一行作为标题,从下一行开始显示值:

Name  City   Country
John  Chennai IN
Ken   Brisban AUS
Ben   NY      US

我需要这样的对象数组中的输出:

[
{Name: 'John',City: "Chennai",Country:"IN"}
{Name: 'Ken',City: "Brisbane",Country:"AUS"}
{Name: 'Ben',City: "NY",Country:"US"}
]

我正在上传一个 CSV 文件,需要将这些记录保存到数据库中 以下是我上传 CSV 并尝试解析 CSV 记录后触发的代码块:

        $scope.processFiles = function() {
            //var input = document.getElementById("fileOutput");
            var input = document.querySelector('input[type = "file"]')
            var file = input.files[0];
            var reader = new FileReader();
            var output;
            reader.onload = function (e) {
                var csvToText = e.target.result;
                output = csvToJSON(csvToText);
                console.log(output);
            };
            reader.readAsText(file);
            event.preventDefault();
        }

        function csvToJSON(csv) {
            var lines = csv.split("\n");
            var result = [];
            var headers;
            for (var i = 0; i < lines.length; i++) {
                headers = lines[i].split("\n");
            }
            var cont = 0;
            for (var i = 0; i < lines.length; i++) {

                var obj = {};
                var currentline = lines[i].split("\n");
                for (var j = 0; j < headers.length; j++) {
                    obj[cont] = currentline[j];
                }
                cont++;
                result.push(obj);
            }
            console.log(result);
            //console.log(JSON.stringify(result));

            //return result;
        }

我得到的输出如下,即值显示在一行中,带有逗号分隔符,第四个数组元素不应该显示。

0: {0: "Name,City,Country"}
1: {1: "John,Chennai,IN"}
2: {2: "Ken,Brisbane,AUS"}
3: {3: "Ben,NY,USA"}
4: {4: ""}

【问题讨论】:

    标签: javascript arrays csv filereader


    【解决方案1】:

    我已更正您的函数以返回所需格式的输出:

    function csvToJSON(csv) {
        var lines = csv.split("\n");
        var result = [];
        var headers;
        headers = lines[0].split(",");
    
        for (var i = 1; i < lines.length; i++) {
            var obj = {};
    
            if(lines[i] == undefined || lines[i].trim() == "") {
                continue;
            }
    
            var words = lines[i].split(",");
            for(var j = 0; j < words.length; j++) {
                obj[headers[j].trim()] = words[j];
            }
    
            result.push(obj);
        }
        console.log(result);
    }
    

    【讨论】:

    • 但是第三个对象名称(国家)是用双引号括起来的——比如这个“国家”,你能帮忙吗
    • @Mar1009 不太明白这个问题。你能举个例子解释一下吗?
    • 0:{姓名:“John”,城市:“Chennai”,“国家”:“IN”} 1:{姓名:“Ken”,城市:“布里斯班”,“国家”: "AUS"} 2: {Name: "Ben", City: "NY", "Country": "USA"} 3: {Name: ""} 如你所见,Country 是双引号,我需要去掉其中
    • @Mar1009 已修复。现在就试试吧。
    • 谢谢 Arun 现在好了
    【解决方案2】:

    试试这个。

    function csvToJSON(csv) {
    
        //lop off any trailing or starting whitespace
        csv = csv.trim();
    
        //prep
        let lines = csv.split('\n'),
            headers,
            output = [];
    
        //iterate over lines...
        lines.forEach((line, i) => {
    
            //...break line into tab-separated parts
            let parts = line.split(/\t+/);
    
            //...if not the headers line, push to output. By this time
           //we have the headers logged, so just match the value to
           //header of the same index
            if (i) {
                let obj = {};
                parts.forEach((part, i) => obj[headers[i]] = part);
                output.push(obj);
    
            //...else if headers line, log headers
            } else
                headers = parts;
        })
    
        //done
        console.log(output);
        return output;
    }
    

    CodePen。 (注意:在 CodePen 中,我从 HTML div 读取 CSV,因此代码中的细微差别。)

    【讨论】:

      【解决方案3】:

      这样的东西应该可以工作

      function csvToJSON(csv) {
                  var lines = csv.split("\n");
                  var result = [];
                  var headers = lines[0].split(",");
      
                  lines.forEach( (line, index) => {
                    if (index === 0) continue // skip the first line (headers)
      
                    let data = {};
                    let cells = line.split(",") // separate by commas
                    cells.forEach( (cell, index) => {
                      let header = headers[index];
                      data[header] = cell;
                    }
                    result.push(data);
                  }
      
                  console.log(result);
                  //console.log(JSON.stringify(result));
      
                  return result;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-18
        • 2014-12-02
        • 2011-08-17
        • 2023-02-09
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 2020-05-02
        相关资源
        最近更新 更多