2012-09-03 27 views
6

Vui lòng xem xét javascript này:Nhận .csv tập tin dưới dạng dữ liệu trong chức năng thành công ajax

$.ajax({ 
    url:'http://ichart.finance.yahoo.com/table.csv?s=GS&a=00&b=1&c=2010&d=08&e=3&f=2012&g=d&ignore=.csv', 
    type:'get', 
    dataType:'jsonp', 
    success:function(data){ 
     alert(data); 
    } 
}) 

URL trả về một tập tin .csv, nhưng tôi xác định kiểu dữ liệu jsonp bởi vì đây là một yêu cầu ajax cross-domain . Không có tham số đó, tôi nhận được lỗi "origin is not allowed".

Vì tôi chỉ định loại dữ liệu jsonp, hàm ajax ném lỗi vì tệp .csv không phải là định dạng JSON. Nhưng trong giao diện điều khiển dev tôi có thể thấy rằng trình duyệt KHÔNG nhận được tệp .csv mạch lạc. Vì vậy, tôi biết tôi đang thành công khi nhận tệp CSV. Tôi nghĩ rằng nó sẽ là có thể, nhưng tôi không chắc chắn làm thế nào để nhận được một cách chính xác này csv tập tin vào chức năng ajax của tôi ??

Tất nhiên nếu tôi có thể làm cho URL này trả về một chuỗi JSON được định dạng đúng sẽ là tốt nhất, nhưng tôi không chắc chắn tôi có thể làm điều đó.

Đây là một fiddle nơi bạn có thể thử nó, bạn sẽ phải mở ra dev console để thấy rằng lỗi: http://jsfiddle.net/92uJ4/3/

Any help is appreciated rất nhiều.

Tim

Trả lời

7

Thật không may, hạn chế tên miền chéo có nghĩa là điều này sẽ không hoạt động. Hệ thống được xây dựng đặc biệt để bạn không thể kéo nội dung tên miền chéo tùy ý bằng AJAX. Không có bất kỳ loại phương thức phân tích cú pháp nào để chuyển đổi dữ liệu không phải JSONP mà bạn đang nhận được vào dữ liệu JSONP thực tế (vì điều đó sẽ đánh bại điểm hạn chế).

Bạn sẽ phải thực hiện cuộc gọi đến máy chủ cục bộ để lấy dữ liệu từ Yahoo! và gửi nó đến yêu cầu AJAX của bạn hoặc tìm một dịch vụ thuộc loại nào đó sẽ lấy từ một URL tùy ý và trả về dữ liệu dưới dạng JSONP. Khi nó xảy ra, Yahoo! cung cấp một dịch vụ như vậy: YQL (ngôn ngữ truy vấn Yahoo). Xem this link để biết thêm chi tiết.

Để thực hiện những gì bạn đang mong muốn, sử dụng mã trong fiddle này: http://jsfiddle.net/c5TeM/1/

function get_url(remote_url) { 
    $.ajax({ 
     url: "http://query.yahooapis.com/v1/public/yql?"+ 
"q=select%20*%20from%20html%20where%20url%3D%22"+ 
encodeURIComponent(remote_url)+ 
"%22&format=json", 
     type: 'get', 
     dataType: 'jsonp', 
     success: function(data) { 
      alert(data.query.results.body.p); 
     }, 
     error: function(jqXHR, textStatus, errorThrow){ 
      alert(jqXHR['responseText']); 
     } 
    }) 
} 
+0

Cảm ơn bạn vì những thông tin tuyệt vời. Tôi đã nghĩ rằng đó là trường hợp phương pháp kéo thông tin này không thực sự khả thi. Giải pháp của bạn trông tuyệt vời, tôi đã xem xét YQL trước đây, tôi đoán đó là cách để làm điều đó. –

+0

Việc triển khai này có lưu bất kỳ thứ gì vào cơ sở dữ liệu YQL không? hay nó chỉ lấy dữ liệu để thao tác tiếp theo? Cảm ơn @JoeC –

+0

@ PT_C: Theo như tôi biết, nó không lưu bất kỳ thứ gì vào cơ sở dữ liệu YQL. Nó chỉ nên là một thông qua. Tuy nhiên, vì đây là bên thứ ba, bạn không thể đảm bảo rằng họ không đăng nhập thông tin đi qua hệ thống của họ, vì vậy tôi sẽ không sử dụng thông tin này cho bất kỳ điều gì nhạy cảm. Sẽ tốt hơn nếu bạn triển khai giải pháp phía máy chủ của riêng bạn để lấy dữ liệu trong trường hợp đó. –

0

sửa đổi quy định cuối cùng jsfiddle đưa tôi đến với các giải pháp sau đây:
http://jsfiddle.net/9zcsxq5a/

var str_parse = function(data){ 
    data = data.replace(/<[/]*body[^>]*>/g,''); 
    data = data.replace(/<--[\S\s]*?-->/g,''); 
    data = data.replace(/[\r]+/g,''); 
    data = data.replace(/<noscript[^>]*>[\S\s]*?<\/noscript>/g,''); 
    data = data.replace(/<script[^>]*>[\S\s]*?<\/script>/g,''); 
    data = data.replace(/<script.*\/>/,''); 
    return data 
} 

get_url = function(URL){ 
    $.ajax({ 
    url:"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"+ 
    encodeURIComponent(URL)+"%22", 
    dataType: "jsonp", 
    type: 'get', 
    success: function(r){ 
     data=r.results[0]; 
     data = str_parse(data); 
     data = data.split(/[\n]+/); 

    //// first line of the csv holds the colnames 
     var HEADER = data[0].split(","); 
     data.shift(); 

    /// create { OBJECT } structure for each row 
     data = (function(){ 
     var o=[]; 
     data.forEach(function(E){ 
      o.push((function(){ 
      var _o={}; 
      for(var i=0, s=E.split(",");i<s.length;i++) 
       _o[HEADER[i]]=s[i]; 
      return _o; 
      }())); 
     }); 
     return o; 
     }()); 

    /// THE FINAL OBJECT 
     console.log(data); 
     return data; 
    } 
    }); 
} 

$('#a').click(function() { 
    get_url("http://ichart.finance.yahoo.com/table.csv?a=8&b=11&e=10&g=d&c=2005&d=2&f=2016&s=YHOO"); 
}); 


The csv is passed through, asis and will then be modified to become a json object, similar to the one (but whithout date restrictions) that you will, get when you use

http://query.yahooapis.com/v1/public/yql?q=select%20%2a%20from%20yahoo.finance.historicaldata%20where%20symbol%20in%20%28%27YHOO%27%29%20and%20startDate%20=%20%272009-09-11%27%20and%20endDate%20=%20%272010-03-10%27&diagnostics=true&env=store://datatables.org/alltableswithkeys

Các vấn đề liên quan