2012-09-03 16 views
6

por favor considere esto javascript:.csv como datos en función del éxito 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); 
    } 
}) 

La URL devuelve un archivo csv, pero yo estoy especificando el tipo de datos jsonp porque se trata de una petición Ajax entre dominios . Sin ese parámetro, aparece el error "no se permite el origen".

Como especifico el tipo de datos jsonp, la función ajax arroja un error porque el archivo .csv no tiene formato JSON. Pero en la consola de desarrollo puedo ver que el navegador SÍ recibe un archivo .csv coherente. Así que sé que estoy recibiendo con éxito el archivo CSV. Creo que debería ser posible, pero no estoy seguro de cómo recibir correctamente este archivo csv en mi función de ajax.

Por supuesto, si pudiera hacer que esta URL devuelva una cadena JSON correctamente formateada que sería la mejor, pero no estoy seguro de poder hacerlo.

Aquí es un violín, donde se puede probar, que tendrá que abrir la consola dev para ver que el error: http://jsfiddle.net/92uJ4/3/

Cualquier ayuda es muy apreciada.

Tim

Respuesta

7

Por desgracia, las restricciones de varios dominios significa que esto no va a funcionar. El sistema está diseñado específicamente para que no pueda extraer contenido arbitrario de dominios cruzados con AJAX. No hay ningún tipo de método de análisis previo para convertir los datos que no son JSONP que está obteniendo en datos JSONP reales (porque eso sería contrario al punto de las restricciones).

Deberá realizar una llamada a un servidor local que extraiga los datos de Yahoo! y lo envía a su solicitud de AJAX, o encuentra un servicio de algún tipo que extraerá de una URL arbitraria y devolverá los datos como JSONP. Como sucede, Yahoo! proporciona tal servicio: YQL (lenguaje de consulta de Yahoo). Ver this link para más detalles.

para lograr lo que usted está queriendo, utilice el código de este violín: 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

Gracias por la gran información. Estaba pensando que este era el caso de que este método de extraer información no era realmente factible. Su solución se ve muy bien, estaba mirando YQL antes, creo que esa es la manera de hacerlo. –

+0

¿Esta implementación guarda algo en la base de datos YQL? ¿o simplemente recupera los datos para una mayor manipulación? Gracias @JoeC –

+0

@PT_C: Hasta donde sé, no guarda nada en la base de datos YQL. Debería ser solo un pase. Sin embargo, como se trata de un tercero, no puede garantizar que no estén registrando la información que pasa a través de sus sistemas, por lo que no utilizaría esto para nada confidencial. Sería mejor implementar su propia solución del lado del servidor para extraer datos en ese caso. –

0

la modificación de la última proporcionan jsFiddle me lleva a la siguiente solución:
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

Cuestiones relacionadas