2011-07-20 57 views
2

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

这里是我想使用CSV文件中的一个例子,他们都非常喜欢的是:http://www.mediafire.com/?hlx2tpacw5dqat5

第一列(两排下来)是时间戳(MS Excel)中,列2(第2行向下)是读数的数量,所有其他列都是温度读数。上面的900表示读数之间的时间间隔(秒)。连续的最终读数为空,应该从读数数量中排除(或带走)。因此,连续第一次读取是在行时间戳减去时(900秒乘以(行中读数减一))得到的。在第一行的第一个值的情况下,该值取(40271.0625-(0.00024 * 900 *(1024-1)))。

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

谢谢

回答

0

indexedDB并不是真的那样工作。而不是像SQL数据库那样拥有表格和视图等,您拥有对象存储,其中JavaScript对象存储在对应的键上。

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

1

没有原生的方式将CSV加载到IndexedDB中。尽管这是完全可能的,但没有理由为什么WebSQL会是更好的选择(除了兼容性)^。您甚至可以使用HTML5 File API将CSV加载到浏览器中。

假设您可以使用类似HTML5Rocks Todo app的内容作为如何将行添加到IndexedDB数据库的参考,那么硬件部分会将CSV文件解析为对象。 IndexedDB使用非自然列式的“对象存储”。因此,在将CSV添加到数据库之前,必须将每行CSV转换为对象。

一旦你得到了,你必须逐行添加到数据库的行。你可能想要在你想使用查找值的列上放置索引。在你的情况下,时间戳,读数和温和值。

^WebSQL是一个弃用的API,所以使用它不是一个好主意。

1

Javascript中的David Flanagan,权威指南v6有一个示例,它将csv文件加载到索引数据库中。它为我工作。 see link on github

+0

有点过时了,但我给他发了拉请求 –

0

假设你有CSV解析成的阵列的阵列,即, VAR数据= [[ “时间戳”,[ “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”)作为对象的关键路径,并使用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); 
    } 
} 

您只需要小心将对象存储区的关键路径指向唯一可识别的列。

3

您可以使用Alasql JavaScript SQL数据库库。它有专门的操作程序,用于加载来自 TXT,CSV,TAB,XLS和XLSX文件的数据。它也适用于IndexedDB。在这个例子中,您需要添加 alasql.min.js库到您的项目,而不是创建或附加(如果已经创建)IndexedDB数据库,然后只需选择列INTO IndexedDB表格从CSV数据文件与标题。

<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> 

尝试this sample在alasql.org网站。