Заполнение IndexedDB данными из файла .csv - PullRequest
3 голосов
/ 21 июля 2011

Как заполнить IndexedDB файлом csv?Я не могу найти очень простое руководство в Интернете.

Вот пример одного из файлов CSV, который я хочу использовать, все они в значительной степени похожи на это: http://www.mediafire.com/?hlx2tpacw5dqat5

Первый столбец (вторая строка вниз) - это временная метка (MS Excel), столбец 2 (вторая строка вниз) - это количество показаний, все остальные столбцы - это показания температуры.Выше 900 указывает интервал времени в секундах между показаниями.Окончательное значение в строке равно нулю и его следует отбросить (или убрать) из числа чтений.Поэтому первое чтение в строке было взято во время отметки времени строк минус (900 секунд, умноженное на (число чтений в строке минус один)).В случае первого значения в первой строке это значение было взято в (40271.0625- (0.00024 * 900 * (1024-1))).

Мне бы хотелось иметь два столбца, поэтомуговорить, в моей IndexedDB.Один на время чтения (очевидно, они будут уникальными) и один для температур.Есть идеи?Любая помощь будет принята с благодарностью!

Спасибо

Ответы [ 5 ]

4 голосов
/ 13 декабря 2014

Вы можете использовать Alasql Библиотека базы данных JavaScript JavaScript. У него есть специальные операторы для загрузки данных из Файлы 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>

Попробуйте этот образец на сайте alasql.org.

1 голос
/ 08 декабря 2011

Нет собственного способа загрузить CSV в IndexedDB. Впрочем, это вполне возможно, и нет никаких причин, почему WebSQL был бы лучшим вариантом (кроме совместимости) ^. Вы даже можете использовать HTML5 File API для загрузки CSV в браузер.

Предполагая, что вы можете использовать что-то вроде приложения HTML5Rocks Todo в качестве справочного материала о том, как добавлять строки в базу данных IndexedDB, трудной частью будет анализ файла CSV в объект. IndexedDB использует «хранилища объектов», которые не являются естественными. Поэтому вам придется превратить каждую строку CSV в объект, прежде чем добавлять его в базу данных.

Получив это, вы должны добавить строки в базу данных одну за другой. Вы, вероятно, захотите поместить индекс в любые столбцы, которые хотите использовать для поиска значений. В вашем случае отметка времени, отсчеты показаний и умеренное значение.

^ WebSQL является устаревшим API, поэтому его использование не является хорошей идеей.

1 голос
/ 03 января 2012

Дэвид Фланаган в Javascript, The Definitive Guide v6 имеет пример, который загружает CSV-файл в индексированную базу данных.Это сработало для меня. см. Ссылку на github

0 голосов
/ 05 сентября 2012

Предполагается, что 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);
    }
}

Вам просто нужно быть осторожным, чтобы путь ключа хранилища объектов указывал на уникально идентифицируемый столбец.

0 голосов
/ 07 декабря 2011

indexedDB на самом деле не работает так.Вместо таблиц, представлений и т. Д., Таких как база данных SQL, у вас есть хранилища объектов, в которых объекты javascript хранятся в ключах.

Чтобы хранилище объектов имитировало таблицу, вы можете заполнить ее такими объектами, как {row: 1, data: [col1, col2,...]}.Затем вы можете извлечь строки, ячейки и т. Д. Однако, в зависимости от того, как вы хотите использовать базу данных, это может быть не очень хорошим решением, поскольку обычные ограничения таблицы (удаление строк сдвигает нижние строки вверх, отсутствие пропущенных столбцов и т. Д.) Не будут автоматическиприменять.Может быть, лучше использовать webSQL (основанный на SQLite)?

...