使用.csv文件数据填充IndexedDB

时间:2011-07-20 21:10:32

标签: javascript html5 csv indexeddb

如何使用csv文件填充IndexedDB?我无法在网上找到一个非常简单的指南。

以下是我想要使用的其中一个csv文件的示例,它们非常类似:http://www.mediafire.com/?hlx2tpacw5dqat5

第一列(第二行向下)是时间戳(MS Excel),第2列(第2行向下)是读数,其他所有列都是温度读数。上面的900表示读数之间的时间间隔(秒)。连续的最终读数为空,应该与读数的数量相反(或取消)。因此,连续的第一次读取是在行时间戳减去时(900秒乘以(行中的读数减去1))。如果是第一行的第一个值,则该值取自(40271.0625-(0.00024 * 900 *(1024-1)))。

我希望在我的IndexedDB中有两列,可以这么说。一个用于读取的时间(显然这些是唯一的)和一个用于温度。有任何想法吗?非常感谢任何帮助!

由于

5 个答案:

答案 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);
    }
}

您只需要注意使对象库的关键路径指向唯一可识别的列。