如何使用csv文件填充IndexedDB?我无法在网上找到一个非常简单的指南。
以下是我想要使用的其中一个csv文件的示例,它们非常类似:http://www.mediafire.com/?hlx2tpacw5dqat5
第一列(第二行向下)是时间戳(MS Excel),第2列(第2行向下)是读数,其他所有列都是温度读数。上面的900表示读数之间的时间间隔(秒)。连续的最终读数为空,应该与读数的数量相反(或取消)。因此,连续的第一次读取是在行时间戳减去时(900秒乘以(行中的读数减去1))。如果是第一行的第一个值,则该值取自(40271.0625-(0.00024 * 900 *(1024-1)))。
我希望在我的IndexedDB中有两列,可以这么说。一个用于读取的时间(显然这些是唯一的)和一个用于温度。有任何想法吗?非常感谢任何帮助!
由于
答案 0 :(得分:4)
您可以使用Alasql JavaScript SQL数据库库。它有专门的操作员来加载数据 TXT,CSV,TAB,XLS和XLSX文件。它也适用于IndexedDB。在此示例中,您需要添加 alasql.min.js库到你的项目,比创建或附加(如果已经创建)IndexedDB数据库, 然后只需选择列INTO IndexedDB表FROM CSV datafile with headers。
<script src='alasql.min.js'></script>
<script>
alasql('CREATE INDEXEDDB DATABASE IF NOT EXISTS geo;\
ATTACH INDEXEDDB DATABASE geo; \
USE geo; \
DROP TABLE IF EXISTS country; \
CREATE TABLE country; \
SELECT * INTO country FROM CSV("country.csv",{headers:true});\
SELECT VALUE COUNT(*) FROM country',[], function(res){
document.write('Number of records loaded into IndexedDB: ', res.pop());
});
</script>
在alasql.org网站上试试this sample。
答案 1 :(得分:1)
没有本地方法可以将CSV加载到IndexedDB中。这完全可能,并且没有理由为什么WebSQL会是一个更好的选择(除了兼容性)^。您甚至可以使用HTML5 File API将CSV加载到浏览器中。
假设您可以使用HTML5Rocks Todo app之类的内容作为如何向IndexedDB数据库添加行的参考,那么困难的部分就是将CSV文件解析为对象。 IndexedDB使用非天然柱状的“对象存储”。因此,在将CSV添加到数据库之前,您必须将CSV的每一行转换为对象。
一旦你有了这个,就必须逐行将这些行添加到数据库中。您可能希望在要使用查找值的任何列上放置索引。在您的情况下,时间戳,读数和温度值。
^ WebSQL是一个弃用的API,所以使用它不是一个好主意。
答案 2 :(得分:1)
David Flanagan在Javascript,The Definitive Guide v6中有一个示例,它将csv文件加载到索引数据库中。它对我有用。 see link on github
答案 3 :(得分:0)
indexedDB并不像那样。而不是像SQL数据库那样拥有表和视图等,而是有对象存储,其中javascript对象存储在密钥中。
要使对象存储模拟表,可以使用{row: 1, data: [col1, col2,...]}
之类的对象填充它。然后,您可以检索行和单元格等。但是,根据您希望如何使用数据库,这可能不是一个好的解决方案,因为表的通常约束(删除行向下移动较低的行,没有丢失的列等)将不会自动应用。也许webSQL(基于SQLite)会是更好的选择吗?
答案 4 :(得分:0)
假设您已将CSV解析为数组数组,即 var data = [[“timestamp”,[“temp1”,“temp2”,“temp3”], [“timestamp2”,[“temp4”,“temp5”,“temp6”], 等。];
然后我将列映射到行名称:
columns = ["timestamp", "temperature"];
然后使用它们构建一个简单的字典:
var objectStore = db.transaction("temperatures", "readwrite").objectStore("temperatures");
for (var i = 0; i < data.length; i++) {
var data = {};
var row = data[i];
for (var j = 0; j < row.length; j++) {
data[columns[j]] = row[j];
}
objectStore.put(data, i);
}
这样您就可以使用objectStore.get(rownumber)
但是为了更多关于它的NoSQLish,我将其中一个列(比如说“timestamp”)作为对象的keypath,并使用multiEntry来索引温度数组的所有子值。以这种方式创建:
db.createObjectStore("temperatures", {keyPath: "timestamp"});
db.createIndex("temp", "temperature", {"multiEntry": true});
然后当你放,不要打扰使用钥匙:
objectStore.put(data);
然后您可以根据以下内容检索内容:
objectStore.get("2012-04-05");
但真正伟大的是,现在你有一个反向的温度指数,让你可以说“给我所有温度在20到30度之间的记录”:
objectStore.index("temp").openCursor(IDBKeyRange.bound(20, 30)).onsuccess = function(e) {
var cursor = e.target.result;
if (cursor) {
cursor.continue();
console.log("Found record: ", cursor.value);
}
}
您只需要注意使对象库的关键路径指向唯一可识别的列。