【问题标题】:Check for potential CSV file issue in D3在 D3 中检查潜在的 CSV 文件问题
【发布时间】:2017-08-09 11:33:17
【问题描述】:

我有一个 D3 项目,它使用一个非常大的 CSV 文件来读取数据。它工作正常,但有时用户会因为以下问题之一无限期地看到旋转的加载图像。
我需要能够捕捉这些问题并向用户显示一些有意义的消息,而不是永无止境的等待消息:

  1. 当数据文件 (MyData.csv) 不存在时
  2. 当 MyData.csv 存在但为空时
  3. 当 MyData.csv 存在时,它不为空但格式不正确(更改第一行的列标题名称以进行测试)。

理想情况下,我希望能够区分它们。

function loadData() {
    d3.csv('MyMap.csv', function(data) {
        data.forEach(function(d) {
            doSomething()
        });

        // load primary data set
        d3.csv('MyData.csv', function (data) {
            doSomethingWithData(data);
        }); // main data set
    });
};

更新了错误检查

var ErrorEnum = Object.freeze({NOTFOUND: 1, EMPTY: 2, INVALIDFORMAT: 3});
var mapFileName = 'MyMap_empty.csv';
var dataFileName = 'MyData_empty.csv';

function redirectOnFileError(fileName, url, errID) {
    var errTitle = errID == ErrorEnum.NOTFOUND ? "File Not Found" : (errID == ErrorEnum.EMPTY ? "Empty File" : "Invalid File Format");
    var errText = fileName + (errID == ErrorEnum.NOTFOUND ? " could not be found" : (errID == ErrorEnum.EMPTY ? " is empty" : " has invalid format"));
    console.log(errText);

    swal({
        title: errTitle,
        text: errText,
        type: "error",
        confirmButtonText: "OK"
        },
        function(isConfirm){
            // somehow we never get here!
            console.log("here ...");
            if (isConfirm) {
                    window.location.href = url;
            }
        }); 
        // hack ... callback function above is not executed, so using below jQuery to use "OK" button's class and 'click' it
        $('.swal2-confirm').click(function(){
            window.location.href = url;
    });
}

function loadData() {
    d3.csv(mapFileName, function (error, data) {
        if (error && error.status === 404) {
            redirectOnFileError(mapFileName, "fnf.html", ErrorEnum.NOTFOUND);
        }
        else if (data.length === 0) {
            redirectOnFileError(mapFileName, "ef.html", ErrorEnum.EMPTY);
        }
        else {
            data.forEach(function (d) {
                // DoSomethingHere();
            });

        // load primary data set
        d3.csv(dataFileName, function (error, data) {
            if (error && error.status === 404) {
                redirectOnFileError(dataFileName, "fnf.html", ErrorEnum.NOTFOUND);
            }
            else if (data.length === 0) {
                redirectOnFileError(dataFileName, "ef.html", ErrorEnum.EMPTY);              }
            else {
                // DomSomethingWithData();
            }); // main data set
    });
}
}
};

【问题讨论】:

    标签: javascript d3.js crossfilter file-exists


    【解决方案1】:

    第一种和第二种情况都可以在这里回答(关于第三种情况,请参阅下面的PS)。

    在我们开始之前,让我们看看一个有效的、现有的 CSV 文件:

     d3.csv("https://gist.githubusercontent.com/GerardoFurtado/2e9f269f7a0f56cf7e23b480afcf280a/raw/5e361753a695534915e81786013976aa94685695/csvfile.csv", function(error, data) {
      console.log(data)
    });
    <script src="https://d3js.org/d3.v4.min.js"></script>

    如您所见,一切正常。这是我将在下一个 sn-ps 中使用的 CSV。

    第一个场景

    你的第一个场景...

    当数据文件(MyData.csv)不存在时

    ...可以使用d3.csv函数中的第一个参数来处理,也就是错误(如果有的话):

    d3.csv(url, function(error,data){...
    //error here ----------^
    

    在下面的 sn-p 中,我们正在检查错误中的 target.status。它会给你一个404,它会打印在控制台中。我只是在更改上一个 CSV 文件的 url:

    d3.csv("https://gist.githubusercontent.com/GerardoFurtado/2e9f269f7a0f56cf7e23b480afcf280a/raw/fakeurl.csv", function(error, data) {
      if (error && error.target.status === 404) {
          console.log("File not found")
        }
    });
    <script src="https://d3js.org/d3.v4.min.js"></script>

    第二种情况

    你的第二个场景...

    当 MyData.csv 存在但为空时

    ... 可以固定检查数据的长度。这是一个演示,使用我的第一个 CSV 的修改版本(没有行):

    d3.csv("https://gist.githubusercontent.com/GerardoFurtado/2e9f269f7a0f56cf7e23b480afcf280a/raw/5e361753a695534915e81786013976aa94685695/csvfileempty.csv", function(error, data) {
      if (error && error.target.status === 404) {
          console.log("File not found")
        }
      if(data.length === 0){
      console.log("File empty")
      }
    });
    <script src="https://d3js.org/d3.v4.min.js"></script>

    PS:您的第三种情况(“文件格式不正确”)只能由您解决:您是唯一知道文件结构的人。

    【讨论】:

    • 非常感谢。我将对此进行测试并发回结果。
    • 我编辑了问题和代码,将您的建议纳入其中,但似乎我做错了什么;我在 dc.js 中得到“d3 未定义”,这是我以前没有得到的。我想这与我将您的代码合并到我的代码中的方式有​​关。我是 D3/CrossFilter/DC 世界的新手,可能是我添加 if...then...else 的方式。
    • @NoBullMan 不要编辑您的答案以将我的代码放入其中:人们会认为这是您的尝试。将您的代码留在问题中。这样,人们可以根据您的代码提出解决方案,而不是我的。另外,请记住,由于我没有在问题中看到 DC 标签,因此我的答案使用“纯”D3。请编辑您的问题并添加 DC 标签。
    • 我更新了帖子并保留了原始问题,并在下面添加了更新后的代码,并附有您的建议。我不认为 DC 是相关的,因为如果文件存在且不为空,代码就可以工作。这是我缺少的文件错误检查。添加更新后,我仍然遇到我提到的问题;可能与我添加建议更改的方式有关(在 if...then...else 语句中添加“{”和“}: 的方式。
    • 在我的代码中我还有其他东西,我添加了你的代码,我认为我破坏了一些东西;喜欢错误的大括号位置!
    猜你喜欢
    • 2016-03-16
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多