javascript - 将 d3.csv 修改为小写列名的正确方法

标签 javascript csv d3.js

有一个应用程序可以处理客户提供的 csv 数据文件。 Javascript 区分大小写。但大多数统计数据包不区分大小写,因此列名以各种大写形式出现。此外,如果他们通过 SAS、SPSS 或其他程序运行文件并另存为新文件,将所有内容转换为大写或小写,则大写字母可能会发生变化。

因此我修改了 D3,使其自动将列名转换为小写。这可以通过修改 d3.js 源代码以添加 .toLocaleUpperCase() 轻松完成,如下所示:

    ...
    dsv.parse = function(text, f) {
      var o;
      return dsv.parseRows(text, function(row, i) {
        if (o) return o(row, i - 1);
        var a = new Function("d", "return {" + row.map(function(name, i) {
          return JSON.stringify(name.toLocaleUpperCase()) + ": d[" + i + "]";
        }).join(",") + "}");
        o = f ? function(row, i) {
          return f(a(row), i);
        } : a;
      });
    };
    ...

唯一的小挑战是我不能将其作为小猴子补丁或插件添加到我的代码中。这个代码块在 d3.dsv 被导入时被调用,这取决于 d3_xhr 被定义,这需要 d3.xhr 等。所以我下载整个 d3.js并如上修改,保存为d3.mod.js

可以想象一下,当我们需要更新 d3 时,这会在一两年内困扰我或其他开发人员。处理此类模组的正确™方法是什么?

最佳答案

您可以使用d3.csv访问器接受以指定您希望如何转换行数据。

下面的函数接受一个对象并将其所有属性转换为小写。该示例使用 d3.csv.parse() 而不是 d3.csv() 因为它在这里演示更直接,但您可以使用 做同样的事情d3.csv().

不幸的是,这个函数会在每一行被调用,而不是在它读入行标题时被调用一次。也许有更好的方法...

var string = "Year,Make,Model,Length\n" +
  "1997,Ford,E350,2.34\n" +
  "2000,Mercury,Cougar,2.38\n";

function convertPropsToLowerCase(d) {
  Object.keys(d).forEach(function(origProp) {
    var lowerCaseProp = origProp.toLocaleLowerCase();
    // if the uppercase and the original property name differ
    // save the value associated with the original prop
    // into the lowercase prop and delete the original one
    if (lowerCaseProp !== origProp) {
      d[lowerCaseProp] = d[origProp];
      delete d[origProp];
    }
  });
  return d;
}

var obj = d3.csv.parse(string, convertPropsToLowerCase);

console.log(JSON.stringify(obj,null, '\t'));
/*
[
	{
		"year": "1997",
		"make": "Ford",
		"model": "E350",
		"length": "2.34"
	},
	{
		"year": "2000",
		"make": "Mercury",
		"model": "Cougar",
		"length": "2.38"
	}
] 
*/
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

关于javascript - 将 d3.csv 修改为小写列名的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998476/

相关文章:

javascript - D3 .bandwidth() 返回 NaN

c# - 如何在javascript中解压缩在C#中压缩的字符串?

javascript - 创建自定义验证器以检查输入是否为 Parsley 中的字符串

mysql - 在数据库中的何处(如何)存储类别(某种)树?

java - 解析单个 CSV 行

javascript - 在 D3.js 中使用的 JSON 文件格式

javascript - 淡出文本标签以及 d3 中的节点

javascript - 如何在用户每次返回主页时停止播放背景视频?

javascript - 更改历史记录中的 document.location.hash

python - 需要将抓取的数据写入csv文件(线程)