3

如何使用 csv 文件填充 IndexedDB?我在网上的任何地方都找不到非常简单的指南。

这是我要使用的 csv 文件之一的示例,它们都非常像:http ://www.mediafire.com/?hlx2tpacw5dqat5

第一列(向下第 2 行)是时间戳(MS Excel),第 2 列(向下第 2 行)是读数量,所有其他列都是温度读数。上面的 900 表示读数之间的时间间隔(以秒为单位)。一行中的最终读数为空,应从读数数量中忽略(或取走)。因此,行中的第一个读数是在行时间戳减去(900 秒乘以(行中的读数数减一))时进行的。对于第一行的第一个值,该值取自 (40271.0625-(0.00024*900*(1024-1)))。

我想要的是两列,可以这么说,在我的 IndexedDB 中。一个用于读数时间(显然这些将是唯一的),另一个用于温度。有任何想法吗?任何帮助将不胜感激!

谢谢

4

5 回答 5

5

您可以使用Alasql JavaScript SQL 数据库库。它具有用于从 TXT、CSV、TAB、XLS 和 XLSX 文件加载数据的特殊运算符。它也适用于 IndexedDB。在此示例中,您需要将 alasql.min.js 库添加到您的项目中,而不是创建或附加(如果已创建)IndexedDB 数据库,然后只需从带有标题的 CSV 数据文件中选择列 INTO IndexedDB 表。

<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 站点上试试这个示例。

于 2014-12-13T18:51:19.693 回答
1

没有将 CSV 加载到 IndexedDB 的本地方法。不过这完全有可能,而且没有理由说 WebSQL 会是更好的选择(除了兼容性)^。您甚至可以使用 HTML5 File API将 CSV 加载到浏览器中。

假设您可以使用HTML5Rocks Todo 应用程序作为如何向 IndexedDB 数据库添加行的参考,困难的部分是将 CSV 文件解析为对象。IndexedDB 使用不是自然柱状的“对象存储”。因此,您必须在将 CSV 的每一行添加到数据库之前将其转换为一个对象。

完成后,您必须将行一一添加到数据库中。您可能希望在要使用查找值的任何列上放置索引。在您的情况下,时间戳、读数计数和温带值。

^ WebSQL 是一个已弃用的 API,因此使用它不是一个好主意。

于 2011-12-08T04:03:07.180 回答
1

Javascript, The Definitive Guide v6 中的 David Flanagan 有一个示例,它将 csv 文件加载到索引数据库中。它对我有用。 见github上的链接

于 2012-01-03T15:32:34.350 回答
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,我将其中一列(比如“时间戳”)作为对象的键路径,并使用 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);
    }
}

您只需要小心使 objectstore 的键路径指向唯一可识别的列。

于 2012-09-05T03:53:27.287 回答
0

indexedDB 并不是这样工作的。而不是像 SQL 数据库那样拥有表和视图等,而是拥有对象存储,其中 javascript 对象根据键存储。

要使对象存储模拟一个表,您可以使用诸如{row: 1, data: [col1, col2,...]}. 然后,您可以检索行和单元格等。但是,根据您希望如何使用数据库,这可能不是一个好的解决方案,因为表的通常约束(删除行会将较低的行向上移动,没有丢失的列等)不会自动申请。也许 webSQL(基于 SQLite)会是更好的选择?

于 2011-12-07T14:48:09.873 回答