【问题标题】:How to structure a csv in order to have a readable json file?如何构建 csv 以获得可读的 json 文件?
【发布时间】:2018-03-31 12:37:04
【问题描述】:

我对如何构建 csv 文件感到有些困惑,目前我是这样做的:

但是当我解析时它给了我一个像这样的 json:

[
  {
    "20": "15",
    "New York": "Singapore",
    "Employee": "Employee"
  }
]

我应该如何构建 csv 以正确输出相关值'

这里有一个jsFiddle 可以玩

【问题讨论】:

  • 目前没有 csv 文件,但您是否尝试将 for(var i=1;i<rows.length;i++) 更改为 for(var i=0;i<rows.length-1;i++)
  • 您的 CSV 没有第一行的列名;输出显示它期望它们。
  • @AlonEitan 不,同样的事情
  • @AlonElton 你是对的,对不起。刚刚来自一些PHP问题。我删除了那个链接。

标签: javascript jquery json csv


【解决方案1】:

CSV 文件基本上只是多行逗号分隔值的列表。

您所要做的就是检查您的 CSV 字符串并从中填充一个 Javascript 对象。

这个快速函数背后的基本逻辑是在每个 newlinesplit 你的字符串,然后在每个 , 上再次拆分它:

const csv = `New York,Employee,20
Singapore,Employee,15`;

const csvToObject = s => s.split('\n').map(line => line.split(','));

console.log(csvToObject(csv));

【讨论】:

  • 看起来它正在工作,试图将它应用到我的 jsfiddle 但没有运气,我应该在哪里使用它同时拥有var arr = (dataArray); $("#dvCSV").append(JSON.stringify(arr, null, ' '));
  • 看起来几乎完美,只是有[ [ "New York", "Employee", "20\r" ], [ "Singapore", "Employee", "15" ] ]为什么\r`?
  • @rob.m 你可以split('\r\n')replace('\r','') 如果你觉得有必要。
  • 试过 `$("#dvCSV").append(JSON.stringify(res, null, ' ')).replace('\r','');
  • 但我仍然在输出中得到 /r
【解决方案2】:
CT,TY,VA
NY,EMP,20
AL,EMP,10

上述 csv 格式生成正确格式的 JSON。第一行指定每列的 JSON 中的标题或键。

所以在第一行取一个适合你的名称,然后生成的 JSON 将链接到第一行。

或者像这样var firstRowCells = ['firstKey','secondKey','thirdKey'];

对数组中的键进行硬编码

$(function () {
    var firstRowCells = ['firstKey','secondKey','thirdKey'];
    var csv = $("#fileUpload").val();

    $("#upload").bind("click", function () {
        var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt)$/;
        if (regex.test($("#fileUpload").val().toLowerCase())) {
            if (typeof (FileReader) != "undefined") {
                var reader = new FileReader();
                reader.onload = function (e) {
                    var rows = e.target.result.split("\r\n");

                    if(rows.length>0){

                        var dataArray = new Array();
                        for(var i=1;i<rows.length;i++)
                        {
                            var cells = GetCSVCells(rows[i], ",");
                            var obj = {};
                            for(var j=0;j<cells.length;j++)
                            {
                                obj[firstRowCells[j]] = cells[j];
                            }
                            dataArray.push(obj);
                        }

                        $("#dvCSV").html('');
                        var arr = (dataArray);
                        $("#dvCSV").append(JSON.stringify(arr, null, '  '));
                    }
                }
                reader.readAsText($("#fileUpload")[0].files[0]);
            } else {
                alert("This browser does not support HTML5.");
            }
        } else {
            alert("Please upload a valid CSV file.");
        }
    });
});

function GetCSVCells(row, separator){
    return row.split(separator);
}
#dvCSV {
  white-space: pre-wrap
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
  <input type="file" id="fileUpload" name="fileUpload" />
  <input type="button" id="upload" value="Upload" name="upload"/>
  <hr />
<div id="dvCSV"></div>

【讨论】:

  • 我在每个单元格城市添加了顶部标签 - empl - num 然后我上传了 cv 文件,我得到了Uncaught ReferenceError: firstRowCells is not defined",
  • @rob.m 我已经编辑了我错过拼写单词的答案
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多