3

IndexedDB に csv ファイルをどのように入力しますか? オンラインのどこにも非常に簡単なガイドが見つかりません。

以下は、私が使用したい csv ファイルの 1 つの例です

最初の列 (下の行 2) はタイムスタンプ (MS Excel)、列 2 (下の行 2) は読み取り値、その他すべての列は温度の読み取り値です。上記の 900 は、読み取り間の時間間隔を秒単位で示します。行の最終的な読み値は null であり、読み値の数から無視 (または削除) する必要があります。したがって、行の最初の読み取り値は、行のタイムスタンプから (900 秒に (行の読み取り数から 1 を引いた数) を掛けた値) を引いた時間に取得されます。最初の行の最初の値の場合、この値は (40271.0625-(0.00024*900*(1024-1))) で取得されました。

いわば、IndexedDB に 2 つの列が必要です。1 つは読み取り時間 (明らかにこれらは固有のものです) で、もう 1 つは温度です。何か案は?どんな助けでも大歓迎です!

ありがとう

4

5 に答える 5

1

CSV を IndexedDB に読み込むネイティブな方法はありません。ただし、それは完全に可能であり、(互換性を除けば) WebSQL がより良いオプションである理由はありません^. HTML5 File APIを使用して、CSV をブラウザーにロードすることもできます。

HTML5Rocks Todo アプリのようなものを IndexedDB データベースに行を追加する方法のリファレンスとして使用できると仮定すると、難しいのは CSV ファイルをオブジェクトに解析することです。IndexedDB は、本来列指向ではない「オブジェクト ストア」を使用します。したがって、データベースに追加する前に、CSV の各行をオブジェクトに変換する必要があります。

それを取得したら、データベースに行を 1 つずつ追加する必要があります。ルックアップ値を使用する列には、おそらくインデックスを配置する必要があります。あなたの場合、タイムスタンプ、読み取り回数、および温度値。

^ WebSQL は非推奨の API であるため、使用することはお勧めできません。

于 2011-12-08T04:03:07.180 に答える
1

David Flanagan in Javascript, The Definitive Guide v6 には、csv ファイルをインデックス付きデータベースにロードする例があります。それは私のために働いた。 githubのリンクを参照してください

于 2012-01-03T15:32:34.350 に答える
0

indexedDB は実際にはそのようには機能しません。SQL データベースのようにテーブルやビューなどを使用する代わりに、JavaScript オブジェクトがキーに対して格納されるオブジェクト ストアを使用します。

オブジェクト ストアでテーブルをエミュレートするには、テーブルに{row: 1, data: [col1, col2,...]}. その後、行やセルなどを取得できます。ただし、データベースの使用方法によっては、テーブルの通常の制約 (行を削除すると下の行が上に移動する、列が欠落しないなど) が自動的に行われないため、これは適切な解決策ではない可能性があります。申し込み。おそらく webSQL (SQLite に基づく) がより良い選択肢でしょうか?

于 2011-12-07T14:48:09.873 に答える
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)

しかし、それについてもっと NoSQL にするために、列の 1 つ (「タイムスタンプ」など) をオブジェクトのキーパスにし、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 に答える