【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取

在入门系列的教程中,我们常用 d3.json() 函数来读取 json 格式的文件。json 格式很强大,但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 OpenOffice Calc 等生成的表格文件,因为简单易懂,容易编辑。

108

Microsoft Excel 通常会保存为 xls 格式, OpenOffice Calc 通常会保存为 ods 格式。这些格式作为表格文件来说都很强大,但要读取它们是有些麻烦的,D3 中也没有提供这样的方法。但是表格软件都会支持生成 csv 格式,它是一种非常基本的、通用的、简单的表格文件。本文将会说明在 D3 中怎么读取和使用 csv 文件。

 

1. CSV 格式是什么

CSV(Comma Separated Values),逗号分隔值,它是以纯文本形式存储表格数据的,每个单元格之间用逗号(Comma)分隔。CSV格式没有一个通用标准,通常使用的是 RFC 4180 中所示的描述。

CSV 的文本格式如下:

理解起来非常简单,每一个单元格之间用逗号隔开。如果想在单元格里输入逗号怎么办呢?用双引号框起来就行,如下:

有些软件在保存CSV格式时,会让你选择使用什么符号(逗号、分号等)来分隔单元格,尽量选择逗号吧。

 

2. 在 OpenOffice 中编辑和保存 CSV 文件

Microsoft Excel 虽然强大却是收费的,近几年我已不使用。 OpenOffice 不仅开源免费,而且功能同样强大。下面来说一下用 OpenOffice 怎么编辑和保存为 CSV 文件,当然一般自己摸索着也能会用,非常简单。

(1) 首先,打开 OpenOffice Calc 。就像 Microsoft Office 中有 Word、Excel、PowerPoint 一样,OpenOffice 中编辑表示使用的是 Calc 。打开之后,像正常一样输入单元格的内容,假设输入如下:

101

(2)点击“文件”,“另存为”。文件类型选择 “CSV 文本”,底下再勾选上“编辑筛选设置”。

102

(3) 弹出的对话框中,选择编码(建议用 UTF8),字段分隔符选择”逗号”,文本分隔符选择“冒号”。点击“确定”。

103

(4) 保存成功后,用记事本打开,结果如下:

104

在 D3.js 中,读取 CSV 文件的函数只支持用逗号分隔单元格,所以请务必这样保存。

 

3. 在 D3.js 中读取 CSV 文件

在 D3.js 中提供了 d3.csv() 函数来读取 CSV 文件。函数 API 可参见: https://github.com/mbostock/d3/wiki/CSV 。

用它读取文件的代码如下:

这段代码是读取了 table.csv 文件后,再输出读到的数据。输出如下:

105

我们可以看到,变量中 csvdata 是保存了一个数组,数组中的每个元素都一个对象,每个对象里都有 age 、name、sex 三个成员变量。这三个成员变量正是所编辑的表格的头一排的三个单元格。如此,我们就可以在代码中这样调用了。

 

4. 将读入的数据转换为字符串

在 D3 的官方 API 中,看上去似乎还有一些函数: parse 、parseRows、format、formatRows。但经过我的试验,只有 format 一个函数可以使用,其它的都是在 D3 内部使用的。基本上需要读入 CSV 的数据的情况下,只要有上面第3节所叙述的内容就足够了。下面是 format 的使用方法。

上面的代码,str 中保存的就是转换后的字符串。

5. 结束语

CSV 格式是一种非常简单的表格文件,它的每个单元格以逗号分隔,有的表格编辑软件在保存的时候会让选择用分号或逗号等保存,这时候最好是选择用逗号。

在 D3 中读取 CSV 文件基本上只需要用 d3.csv() 函数即可。

谢谢阅读。


文档信息


【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取》上有15条评论

  1. 老师,用d3.csv()读取的是字符串,而用format读取的是数字,您是不是弄错了,我看API是这么说的,实验了一下,也是这样。

    • csvdata 这一个值是对象,我所指的是这个。d3.csv 所读取的文件本身自然是字符串。

  2. 老师你好,我读取csv文件的时候遇到 有一列属性是以数字开头的字符串
    (“20to35”类似这样)。请问下除了修改表格中这一列的属性名称还有其他方法吗?
    谢谢!

    • 参考以下用法:

      var array = [];
      var str = “20to35″;
      array[str] = 10;
      console.log(array[str]);

      字符串是可以作为数组的下标的。

        • 请问你是怎么读取csv文件的,我照着上边的方法,结果一直出错

  3. 老师你好,我按照您教的方法搭建了一个服务器端,把文件都放进去了,但是还是不能显示数据,是为什么呢?

  4. 一回复就出错,打了3遍。。囧。。。。
    站长,我的想法是通过修改本地的CSV或者其他数据文件,可以使得HTML展示不同的数据。。。重点是本地

    我现在是用PYTHON,生成数据后,把数据写死在HTML代码中。能不能灵活一些

    还有就是我用

    可以调用本地的D3.JS但是还是不能调用CSV,不知道是不支持还是我操作有误

    求站长大腿

    谢谢

    • 当然数据最好是写在外部文件里,不要写在 HTML文件里。

      你说“还有就是你用”,什么?似乎有一些文字没有打出来,

      估计你打了一些html的标签

  5. 不能读本地的CSV,一定要在服务器端吗?

    • 对的,大部分浏览器会加油限制,不能读取本地文件,但是火狐浏览器除外,你可以使用火狐试试。

      谢谢。

  6. 我按照上文中写的在之间加了这样一段:

    var csvdata;

    d3.csv(“2-1130about.csv”,function(error,csvdata){
    if(error){
    console.log(error);
    }
    console.log(csvdata);
    });
    for(var i=0;i<csvdata.length;i++){
    var course = csvdata[i].course;
    var pv = csvdata[i].pv;
    var uv = csvdata[i].uv;
    console.log(
    "course:"+course+"\n"+
    "pv:"+pv+"\n"+
    "uv:"+uv
    );
    }
    但是调试时显示“csvdata”为“undefined”,请问应该怎样改呢?
    刚刚学javascript和d3,有很多基本知识还不了解,烦请老师指点一下~
    O(∩_∩)O谢谢

    • 这种情况我无法知道具体问题,有可能是你的csv文件有问题,有可能是服务器的问题

评论已关闭。