【问题标题】:Uncaught SyntaxError when trying to reading csv data尝试读取 csv 数据时未捕获的 SyntaxError
【发布时间】:2017-01-07 13:54:42
【问题描述】:

我正在使用 Mootools JSONP 从返回 CSV 文件的 url 中读取数据。现在 CSV (Adj Close) 中的一列有一个空格,它中止文件的读取并将错误抛出到控制台上。读取 csv 数据时,我有哪些选择(如果有)?

我收到错误:

table.csv:1 Uncaught SyntaxError: Unexpected identifier

更多信息:我可以看到 csv 文件正在下载到浏览器中。我不能从浏览器中读取它吗?

var url = 'http://ichart.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2000&d=0&e=31&f=2010&g=w&ignore=.csv';

  loaderJSONP(url);

loaderJSONP = function(URL) {
  //Get Data
  new Request.JSONP({
    url: URL,
    onSuccess: function(response) {
      show_response(response, $('post'));
    }
  }).send();

  show_response = function(obj, result) {
    console.log(obj);
  };
}

【问题讨论】:

  • 您需要在 URL 周围加上引号
  • 我的错...对问题进行了编辑。感谢您指出错字
  • 该网址没有返回 JSONP 字符串,而是返回 csv 文件
  • 我同意。我正在寻找解决方法来加载 csv 文件或将输出预处理到 json。这甚至可能吗?
  • 这个应用程序中也有服务器端吗?就像@Tim Wienk 在 Github 中建议的那样......这样你就可以在服务器端转换数据,然后在应用程序和服务器之间使用 JSON 请求它。

标签: javascript cross-domain jsonp mootools


【解决方案1】:

在此处添加answer I gave on GitHub,以供将来参考:

JSONP 的思想是资源返回“带有 Padding 的 JSON”,其中 JSON 是 JavaScript Object Notation 中的一个值,而 Padding 是一个函数调用,旨在绕过同源策略。

  • JSON:{"a":"b"}
  • JSONP:myCallbackFunction({"a":"b"})

因此,基本上,JSONP 资源应该返回有效的、可执行的 JavaScript 代码,并且您(或在本例中为 MooTools More)提供“myCallbackFunction”的定义。然后将资源位置附加&callback=myCallbackFunction 并作为HTML <script> 标记的src 注入。标签被注入到文档中,并使用提供的数据调用该函数,这样您就可以处理您的事情了。 (如果您想知道,MooTools 不会将函数本身称为“myCallbackFunction”。)

您从 ichart.yahoo.com 请求的资源返回 CSV 格式,我怀疑它是否支持任何回调函数填充,这意味着它可能无法以这种方式工作。

我可以看到两个选项:

  1. 查看Yahoo's developer console,看看yahoo.finance.historicaldata 表是否适合您的需求,或者是否有其他方法可以通过YQL 获取您的数据。
  2. 通过其他方式(某些服务器)获取 CSV,并将其提供回您的应用程序(使用可选的预解析,因此您不必在 JavaScript 中解析 CSV)。

回答后续问题,关于选项 2,关于为什么没有结果:

您必须使用作为查询参数传递的回调值。

试试这样的东西(未经测试):

function print_json($data) {
    $json = json_encode($data);

    if (array_key_exists('callback', $_GET) && !preg_match('/[^\w.]/', $_GET['callback'])) {
        header('Content-type: application/javascript; charset=utf-8');
        echo $_GET['callback'], '(', $json, ')';
    } else {
        header('Content-type: application/json; charset=utf-8');
        echo $json;
    }
}

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多