2015-01-02 107 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