2014-05-20 33 views
6

我正在開發Wordpress中的網頁。該網頁需要與所有縣的組合框。我有一個csv格式的數據集,所有這些縣都有10k行。 當用戶在下拉列表中選擇一個縣時,我只想要顯示在網頁中的所選縣數據。這是我的要求。Javascript將CSV文件加載到數組中

在WordPress,我的網頁,我將使用

<script type="text/javascript" src="http://xxx/wp  content/uploads/2014/05/countyList1.js"></script> 

和網頁下拉代碼的js文件是

<select name="county" id="county" onload="setCounties();" onchange="getSelectedCountyData();"></select> 

在countyList1.js文件我有setCounties()和getSelectedCountyData()函數。

到目前爲止,我可以看到與縣列表的下拉列表。我不知道如何讀取CSV文件並將選定的縣過濾器應用到此列表。

我試過FileReader對象,我可以在網頁上加載CSV內容,但我不希望用戶選擇CSV。我已經有了這個數據集。

我想從這個SO後How to read data From *.CSV file using javascript?這個jquery.csv-0.71庫,但我需要幫助。

這裏是當一個縣被選定

function getSelectedCountyData() { 
     cntrySel = document.getElementById('county'); 
     //selCty = countyList[cntrySel.value]; 
     handleFiles(); 
} 

function handleFiles() { 

    $(document).ready(function() { 
     $.ajax({ 
      type: "GET", 
      url: "D:\Docs\Desktop\csvfile.csv", 
      dataType: "csv", 
      success: function (data) { processData(data); } 
     }); 
    }); 
} 

function processData(allText) { 
    var allTextLines = allText.split(/\r\n|\n/); 
    var headers = allTextLines[0].split(','); 
    var lines = []; 

    for (var i = 1; i < allTextLines.length; i++) { 
     var data = allTextLines[i].split(','); 
     if (data.length == headers.length) { 

      var tarr = []; 
      for (var j = 0; j < headers.length; j++) { 
       tarr.push(headers[j] + ":" + data[j]); 
      } 
      lines.push(tarr); 
     } 
    } 
    console.log(lines); 
    drawOutput(lines); 
} 

function drawOutput(lines) { 
    //Clear previous data 
    document.getElementById("output").innerHTML = ""; 
    var table = document.createElement("table"); 
    for (var i = 0; i < lines.length; i++) { 
     var row = table.insertRow(-1); 
     for (var j = 0; j < lines[i].length; j++) { 
      var firstNameCell = row.insertCell(-1); 
      firstNameCell.appendChild(document.createTextNode(lines[i][j])); 
     } 
    } 
    document.getElementById("output").appendChild(table); 
} 
+0

@Teemu刪除它後,我得到錯誤無法讀取未定義的屬性ajax。感謝您的幫助。 – Aqua267

回答

2

不能使用AJAX來從用戶機器取文件,這被調用的代碼。這絕對是錯誤的做法。

使用的FileReader API:

<input type="file" id="file input"> 

JS:

console.log(document.getElementById("file input").files); // list of File objects 

var file = document.getElementById("file input").files[0]; 
var reader = new FileReader(); 
content = reader.readAsText(file); 
console.log(content); 

然後解析content爲CSV。請記住,你的解析器目前不逃值CSV處理,如:value1,value2,"value 3","value ""4"""

+0

但用戶沒有上傳csv文件。我在wordpress中有CSV文件,url是http://xxx/wp-content/uploads/2014/05/csvFile.csv。我如何將這個文件傳遞給FileReader? – Aqua267

+0

只是爲了說明我正在尋找只在Javascript中做到這一點。我不熟悉jquery/ajax。 – Aqua267

+0

如果文件已經上傳,並且您有文件內容,那麼您不再需要'FileReader'。 'FileReader'是你在用戶機器上讀取文件的包裝。 – Halcyon

19

我強烈建議考慮這個插件:

http://github.com/evanplaice/jquery-csv/

我用這一個項目處理大型CSV文件和它可以很好地處理將CSV解析爲數組。您可以使用它來調用您在代碼中指定的本地文件,因此您不依賴文件上載。

一旦你有上面的插件,你基本上可以使用下面的解析CSV:然後

$.ajax({ 
    url: "pathto/filename.csv", 
    async: false, 
    success: function (csvd) { 
     data = $.csv.toArrays(csvd); 
    }, 
    dataType: "text", 
    complete: function() { 
     // call a function on complete 
    } 
}); 

一切都將住在數組中數據爲您操作,因爲你需要。如果需要,我可以提供處理陣列數據的更多示例。

插件頁面上有很多很棒的例子可以用來做各種事情。

+0

感謝您的鏈接。我正在嘗試像下面的那樣,但數據是未定義的。我之前沒有使用ajax或jquery,因此非常感謝您的幫助。我知道我錯過了一些顯而易見的東西,但無法弄清楚: $ .ajax({url:「https://dl.dropboxusercontent.com/u/25575808/energy/nodes.csv」, aync:false, 成功:函數(CSVD){ 數據= $ .csv2Array(CSVD);} , 數據類型: 「文本」, 完成:函數(){// 呼籲完整 功能} }); – Aqua267

+0

明白了..這是一個錯字異步。再次感謝。 – Aqua267

+1

我想這個解決方案,但得到「XMLHttpRequest不能加載文件: https,chrome-extension-resource「。有沒有人知道這個解決方法? –

3

如果您不太擔心文件的大小,那麼您可能更容易將數據作爲JS對象存儲在另一個文件中,並將其導入到您的文件中。可以同步或異步使用語法<script src="countries.js" async></script>。節省您需要導入文件並解析它。

但是,我可以看到爲什麼你不想重寫10000個條目,所以這裏是我寫的一個基本的面向對象的csv解析器。

function requestCSV(f,c){return new CSVAJAX(f,c);}; 
function CSVAJAX(filepath,callback) 
{ 
    this.request = new XMLHttpRequest(); 
    this.request.timeout = 10000; 
    this.request.open("GET", filepath, true); 
    this.request.parent = this; 
    this.callback = callback; 
    this.request.onload = function() 
    { 
     var d = this.response.split('\n'); /*1st separator*/ 
     var i = d.length; 
     while(i--) 
     { 
      if(d[i] !== "") 
       d[i] = d[i].split(','); /*2nd separator*/ 
      else 
       d.splice(i,1); 
     } 
     this.parent.response = d; 
     if(typeof this.parent.callback !== "undefined") 
      this.parent.callback(d); 
    }; 
    this.request.send(); 
}; 

可以這樣使用;

var foo = requestCSV("csvfile.csv",drawlines(lines)); 

第一個參數是文件,相對於你的html文件在這種情況下的位置。 第二個參數是一個可選的回調函數,當文件被完全加載時運行。

如果你的文件有不分離的恩典,那麼它不會繼續這個,因爲它只是通過在返回和逗號處切分來創建2d數組。如果您需要該功能,則可能需要查看regexp。

//THIS works 

"1234","ABCD" \n 
"[email protected]£$" \n 

//Gives you 
[ 
[ 
    1234, 
    'ABCD' 
], 
[ 
    '[email protected]£$' 
] 
] 

//This DOESN'T! 

"12,34","AB,CD" \n 
"[email protected],£$" \n 

//Gives you 

[ 
[ 
    '"12', 
    '34"', 
    '"AB', 
    'CD' 
] 
[ 
    '"[email protected]', 
    '£$' 
] 
] 

如果你不習慣OO方法;他們通過「構造函數」函數創建一個新的對象(如數字,字符串,數組)。在某些情況下非常方便。這個功能可以用來同時加載10個不同回調的文件(取決於你的csv愛情程度!)

0

這就是我曾經使用csv文件進入數組。無法獲得上述答案,但這對我有效。

$(document).ready(function() { 
    "use strict"; 
    $.ajax({ 
     type: "GET", 
     url: "../files/icd10List.csv", 
     dataType: "text", 
     success: function(data) {processData(data);} 
    }); 
}); 

function processData(icd10Codes) { 
    "use strict"; 
    var input = $.csv.toArrays(icd10Codes); 
    $("#test").append(input); 
} 

使用上面鏈接的jQuery-CSV插件。

相關問題