Intereting Posts
Удалить из базы данных все выбранные строки, кроме первых двух максимальное значение, представленное bigint Ошибка недопустимого аргумента SQL Get Error Подзапрос SQL Server возвращает более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, <=,>,> = Spring JPA – параметр с этой позицией не существует SQL – «DISTINCT» на основе только нескольких столбцов? SqlDataAdapter не заполняет DataSet Невозможно создать JDBC-драйвер класса '' для подключения URL-адреса 'null': драйвер Tomcat & SQL Server JDBC запрос, который будет подсчитывать и увеличивать количество повторяющихся экземпляров этой записи ORACLE Преобразование длинной миллисекунды в дату Плюсы и минусы имени таблицы с пробелами SQLite: эффективный способ сбросить множество строк Выполнение подготовленных в NHibernate операторов в SQL Server Management Studio Экспорт таблицы HTML в PDF со многими столбцами с помощью jsPDF получение значений из sql-считывателя c #

База данных «на лету» со сценарием

У меня есть набор файлов .csv, которые я хочу обработать. Было бы намного проще обрабатывать его с помощью SQL-запросов. Интересно, есть ли какой-нибудь способ загрузить CSV-файл и использовать язык SQL, чтобы изучить его с помощью языка сценариев, такого как python или ruby. Загрузка его с чем-то похожим на ActiveRecord была бы потрясающей.

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

Мой вопрос в том, какой язык и какие модули следует использовать для этой задачи. Я огляделся и не мог найти ничего, что бы соответствовало моей потребности. Возможно ли это?

Есть sqlite3 , включенный в python. С его помощью вы можете создать базу данных ( по памяти ) и добавить к ней строки, а также выполнить SQL-запросы.

Если вам нужна аккуратная функция ActiveRecord, вы должны добавить внешний ORM, например sqlalchemy . Это отдельная загрузка, хотя

Быстрый пример с использованием sqlalchemy:

 from sqlalchemy import create_engine, Column, String, Integer, MetaData, Table from sqlalchemy.orm import mapper, create_session import csv CSV_FILE = 'foo.csv' engine = create_engine('sqlite://') # memory-only database table = None metadata = MetaData(bind=engine) with open(CSV_FILE) as f: # assume first line is header cf = csv.DictReader(f, delimiter=',') for row in cf: if table is None: # create the table table = Table('foo', metadata, Column('id', Integer, primary_key=True), *(Column(rowname, String()) for rowname in row.keys())) table.create() # insert data into the table table.insert().values(**row).execute() class CsvTable(object): pass mapper(CsvTable, table) session = create_session(bind=engine, autocommit=False, autoflush=True) 

Теперь вы можете запрашивать базу данных, фильтровать любое поле и т. Д.

Предположим, вы запустили код выше на этом csv:

 name,age,nickname nosklo,32,nosklo Afila Tun,32,afilatun Foo Bar,33,baz 

Это создаст и заполнит таблицу в памяти name полей, age , nickname . Затем вы можете запросить таблицу:

 for r in session.query(CsvTable).filter(CsvTable.age == '32'): print r.name, r.age, r.nickname 

Это автоматически создаст и запустит запрос SELECT и вернет правильные строки.

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

Используйте БД в библиотеке, такой как SQLite . Существуют версии Python и Ruby .

Загрузите CSV в таблицу, там могут быть модули / библиотеки, которые тоже помогут вам здесь. Затем SQL прочь.

Посмотрел Perl и Text :: CSV и DBI? В CPAN есть много модулей, чтобы сделать именно это. Вот пример (от ЗДЕСЬ ):

 #!/usr/bin/perl use strict; use warnings; use DBI; # Connect to the database, (the directory containing our csv file(s)) my $dbh = DBI->connect("DBI:CSV:f_dir=.;csv_eol=\n;"); # Associate our csv file with the table name 'prospects' $dbh->{'csv_tables'}->{'prospects'} = { 'file' => 'prospects.csv'}; # Output the name and contact field from each row my $sth = $dbh->prepare("SELECT * FROM prospects WHERE name LIKE 'G%'"); $sth->execute(); while (my $row = $sth->fetchrow_hashref) { print("name = ", $row->{'Name'}, " contact = ", $row->{'Contact'}. "\n"); } $sth->finish(); name = Glenhuntly Pharmacy contact = Paul name = Gilmour's Shoes contact = Ringo 

Просто введите perldoc DBI и perldoc Text :: CSV в командной строке для получения дополнительной информации.

Файлы CSV не являются базами данных – у них нет индексов, и любое симуляция SQL, которую вы наложили на них, будет меньше, чем поиск всей вещи снова и снова.

Вы можете использовать язык сценариев для анализа CSV-файла и хранения данных в SQLite , который просто использует один файл для хранения. Оттуда вы имеете его в базе данных и можете запускать против него запросы.

Кроме того, в Windows вы можете настроить источник данных ODBC в виде файла CSV. Но автоматизировать это может быть сложно.

Я использовал решение nosklo (спасибо!), Но у меня уже был первичный ключ (переданный как pk_col) в строке столбца (первая строка csv). Поэтому я решил поделиться своей модификацией. Я использовал троицу.

 table = Table(tablename, metadata, *((Column(pk_col, Integer, primary_key=True)) if rowname == pk_col else (Column(rowname, String())) for rowname in row.keys())) table.create() 

PHP FlatfileDB, доступный здесь, является очень хорошим вариантом, если вы создаете веб-приложение