javascript - 将 CSV 文件读取到 HTML 下拉菜单
问题描述
我正在尝试将 .csv 文件读取到 HTML 中的下拉列表中。目前使用下面的代码,我的下拉列表没有被填充。我不确定是因为我的路径还是我在 HTML 中没有正确调用它。有什么建议吗?
代码(我发现这个代码作为一个例子,并试图实现它来测试没有运气):
(function() {
var csv_path = "C:\Users\userName\Documents\Qlik\Request Page\streamFileTEST.csv";
var renderCSVDropdown = function(csv) {
var dropdown = $('select#selectStyle');
for (var i = 0; i < csv.length; i++) {
var record = csv[i];
var entry = $('<option>').attr('value', record.someProperty);
console.log(record);
dropdown.append(entry);
}
};
$.get(csv_path, function(data) {
var csv = CSVToArray(data);
renderCSVDropdown(csv);
});
}());
function CSVToArray(strData, strDelimiter) {
strDelimiter = (strDelimiter || ",");
var objPattern = new RegExp((
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
"([^\"\\" + strDelimiter + "\\r\\n]*))"
), "gi");
var arrData = [
[]
];
var arrMatches = null;
while (arrMatches = objPattern.exec(strData)) {
var strMatchedDelimiter = arrMatches[1];
if (strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter) {
arrData.push([]);
}
var strMatchedValue;
if (arrMatches[2]) {
strMatchedValue = arrMatches[2].replace(new RegExp("\"\"", "g"), "\"");
} else {
strMatchedValue = arrMatches[3];
}
arrData[arrData.length - 1].push(strMatchedValue);
}
return (arrData);
}
#selectStyle {
height: 29px;
overflow: hidden;
width: 470px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<img class="imgQlik" src="qlik-sense-logo.png">
<hr>
<form action="mailto:emailAddress.com" method="post" enctype="text/plain">
<div>
<table id="requestTable">
<tbody>
<tr>
<td class="tdLabel">
<label>Name:</label>
</td>
<td class="tdInput">
<input type="text" id="user-name" name="display-name" pattern="[A-Za-z\s]+" maxlength="50" minlength="2" required>
</td>
</tr>
<tr>
<td class="tdLabel">
<label>Stream List:</label>
</td>
<td>
<select id="selectStyle" name="streamlistselect"></select>
</td>
</tr>
</tbody>
</table>
</div>
<input class="buttonRequest" type="submit" value="Submit Request">
</form>
解决方案
1个主要概念-出于安全考虑,您无法通过浏览器读取文件系统。所以做一个get请求是C:\Users\userName\....
行不通的。
然后只是一些小事情之后:
用户需要自己上传文件,所以我添加了一个文件类型的输入供您的用户上传他们的 csv 文件。我将其限制为仅具有
accept=".csv"
属性的 csv 文件然后您需要一种处理该文件的方法,我为您整理了 handleFile() 函数,该函数使用FileReader从上传的 csv 文件中读取数据。
接下来,我们使用 csv 数据调用 renderCSMDropdown,我稍微更新了您的循环以遍历由“,”分隔的元素,并将选项节点附加到您的选择元素。我还在选项中添加了一个文本属性,以便您可以看到它们。
$("#inputFile").on("change", handleFile);
var renderCSVDropdown = function(csv) {
var dropdown = $('#selectStyle');
var elements = csv.split(",");
for (var i = 0; i < elements.length; i++) {
var record = elements[i];
var entry = $('<option>', {value: record, text: record})
dropdown.append(entry);
}
};
function handleFile() {
var file = $(this).prop('files')[0];
var fileReader = new FileReader();
fileReader.onload = function (evt) {
renderCSVDropdown(evt.target.result);
};
fileReader.readAsText(file, "UTF-8");
}
#selectStyle {
height: 29px;
overflow: hidden;
width: 470px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<img class="imgQlik" src="qlik-sense-logo.png">
<hr>
Choose csv file: <input type="file" id="inputFile" accept=".csv"><br/><br/>
<form action="mailto:emailAddress.com" method="post" enctype="text/plain">
<div>
<table id="requestTable">
<tbody>
<tr>
<td class="tdLabel">
<label>Name:</label>
</td>
<td class="tdInput">
<input type="text" id="user-name" name="display-name" pattern="[A-Za-z\s]+" maxlength="50" minlength="2" required>
</td>
</tr>
<tr>
<td class="tdLabel">
<label>Stream List:</label>
</td>
<td>
<select id="selectStyle" name="streamlistselect"></select>
</td>
</tr>
</tbody>
</table>
</div>
<input class="buttonRequest" type="submit" value="Submit Request">
</form>
推荐阅读
- php - 停止 foreach 循环的麻烦取决于 Promise 解决或拒绝
- angular - 使用带有嵌套对象的模型的角度打字稿错误
- python - ValueError:未知层:CapsuleLayer
- javascript - 如何检查文件夹的访问权限
- macos-sierra - 安装 Spacy 的问题
- mysql - Mysql 复杂的自然连接选择语句
- python - 按多个条件过滤 numpy 数组行时的问题
- php - Wordpress 中使用的 PHP foreach 循环 wp_customize->add_control
- javascript - 使用 Javascript 将 href 替换为 onlick
- angular - “可观察”类型上不存在“地图”
' 原生脚本