2015-01-02 42 views
5

我的目标是打开一个CSV文件,然后使用PapaParse将其内容解析到<div>。到目前为止,它似乎正在工作,但不是实际的值,它只是返回未定义。我不知道什么是错的,可能是一个奇怪的CSV文件(我使用另存为的Excel表格创建了这个文件),或者它可能只是草率编码。阅读CSV时,PapaParse返回undefined

JS

var data; 

function handleFileSelect(evt) { 
    var file = evt.target.files[0]; 

    Papa.parse(file, { 
     header: true, 
     dynamicTyping: true, 
     complete: function (results) { 
      data = results; 
     } 
    }); 
    $(".graphcontainer").append("<div class='parse'>" + data + "</div>"); 
} 

$(document).ready(function() { 
    $("#csv-file").change(handleFileSelect); 
}); 

HTML

<div class="graphcontainer">Parser Output:</div> 
<div class="buttoncontainer"> 
    <input type="file" id="csv-file" name="files"/> 
</div> 

编辑:这里是我一直在(http://www.topdeckandwreck.com/excel%20graphs/)测试文件。不知道这是否真正相关,因为这样做的目标是让用户能够打开任何CSV文件,然后将图形制作出来:)

+0

尝试使用不同的CSV文件后,它刚刚返回[对象对象] –

+0

您可能想要将您正在使用的CSV文件添加到您的问题中。 – Tomalak

回答

10

您很可能有时间问题。

爸爸是一个异步库,一个告示牌是提供complete回调的事实。

这意味着您不能使用全局变量将其结果从A转移到B.实际上,您应该避免使用全局变量。

结果准备就绪后,您想完成的所有工作都必须在回调函数中完成。 这适用于JavaScript中的任何异步过程。

function handleFileSelect(evt) { 
    if (!(evt.target && evt.target.files && evt.target.files[0])) { 
     return; 
    }  
    Papa.parse(evt.target.files[0], { 
     header: true, 
     dynamicTyping: true, 
     complete: function (results) { 
      debugDataset(results); 
      renderDataset(results); 
     } 
    }); 
} 

function debugDataset(dataset) { 
    var formatted = JSON.stringify(dataset, null, 2); 
    $("<div class='parse'></div>").text(formatted).appendTo(".graphcontainer"); 
} 

function renderDataset(dataset) { 
    // render code here... 
} 

$(function() { 
    $("#csv-file").change(handleFileSelect); 
}); 
+0

事情是,我想能够从另一个库中的函数中使用该变量,使图形超出2个值(x,y),所以我认为如果我只是做一个全局变量以便玩它进一步沿着。在这里,我只是输出它在一个div看看发生了什么(由于某些原因F12不显示任何东西在控制台)。 结果仍然相同,只有它现在在我的所有文件上输出[object Object] –

+0

不,您不能使用全局变量,因为您不知道何时将设置全局变量。您**必须**在回调中执行所有结果处理。提示:当您从该回调调用函数时,技术上仍在回调中。您不必将所有代码都塞进该函数中,只需触发它的所有处理即可。 – Tomalak

+0

解析器仍然只是输出[object Object]而不是实际的数据,不管我使用什么CSV文件(试着用一个随机的在线生成器做一些)。 –

0

我想你想看到的结果时,它的实际完成:

function handleFileSelect(evt) { 
    var file = evt.target.files[0]; 

    Papa.parse(file, { 
     header: true, 
     dynamicTyping: true, 
     complete: function (results) { 
      var data = results; 
      $(".graphcontainer").append("<div class='parse'>" + data + "</div>"); 
     } 
    }); 
} 
+1

这就是我刚刚回答说的那种......;) – Tomalak

+0

因为某些原因,哼哼,我没有注意到它:-P – blint

0

行,所以我的问题解决了,解决的办法是这个(VAR需要包含results.data)

{

function handleFileSelect(evt) { 
    var file = evt.target.files[0]; 

    Papa.parse(file, { 
     complete: function (results) { 
      var data = results.data; 
      $(".graphcontainer").append("<div class='parse'>" + data + "</div>"); 
     } 
    }); 
} 

$(function() { 
    $("#csv-file").change(handleFileSelect); 
}); 

}

感谢其他人的帮助

+1

提示:如果你的代码不是独立可执行的,只需使用*“{} (代码示例)“*按钮而不是*”代码片段“*按钮。通过这种方式,您可以防止在答案中创建非功能性的“运行代码段”按钮。 – Tomalak