Простые и быстрые SQL-запросы для плоских файлов
Вопрос
Кто-нибудь знает о каких-либо инструментах для предоставления простых и быстрых запросов к плоским файлам с использованием SQL-подобного декларативного языка запросов?Я бы предпочел не оплачивать накладные расходы на загрузку файла в базу данных, поскольку входные данные обычно выбрасываются почти сразу после выполнения запроса.
Рассмотрим файл с данными "animals.txt ":
dog 15
cat 20
dog 10
cat 30
dog 5
cat 40
Предположим, я хочу извлечь наибольшее значение для каждого уникального животного.Я хотел бы написать что-то вроде:
cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1"
Я могу получить почти такой же результат, используя sort
:
cat animals.txt | sort -t " " -k1,1 -k2,2nr
И я всегда могу заглянуть в awk
оттуда, но все это кажется немного awk
уорд (не смог удержаться), когда казалось, что SQL-подобный язык так чисто решает проблему.
Я рассматривал возможность написания оболочки для SQLite, которая автоматически создавала бы таблицу на основе входных данных, и я рассматривал возможность использования Hive в однопроцессорном режиме, но я не могу избавиться от ощущения, что эта проблема была решена раньше.Я что-то упускаю?Реализована ли эта функциональность уже другим стандартным инструментом?
Халп!
Решение 6
Мне так и не удалось найти удовлетворительного ответа на свой вопрос, но я, по крайней мере, нашел решение своей проблемы с игрушкой, используя uniq
вариант s "-f", о котором я не знал:
cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1
В awk
приведенная выше часть, очевидно, могла бы быть полностью пропущена, если бы входной файл был создан со столбцами в обратном порядке.
Тем не менее, я все еще не теряю надежды на SQL-подобный инструмент.
Другие советы
Я написал Тхцсуши в основном для выполнения SQL-выборки в плоских файлах.Вот цепочка команд для вашего примера (все эти команды взяты из TxtSushi):
tabtocsv animals.txt | namecolumns - | tssql -table animals - \ 'select col1, max(as_int(col2)) from animals group by col1'
namecolumns требуется только потому, что animals.txt не имеет строки заголовка.Вы можете получить быстрое представление о том, что возможно, просмотрев примеры сценариев.В нижней части главной страницы также есть ссылки на аналогичные инструменты.
Perl DBI с использованием DBD::Любые данные
вы можете использовать sqlite.Вот пример использования Python.
import sqlite3
conn = sqlite3.connect('/tmp/test.db')
cursor = conn.cursor()
try:
cursor.execute("""create table table1 (word varchar not null, number varchar not null)""")
except: pass
cursor.execute("insert into table1 values ('dog', '15')")
cursor.execute("insert into table1 values ('cat', '20')")
cursor.execute("insert into table1 values ('dog', '10')")
cursor.execute("select max(number) , word from table1 group by word")
print cursor.fetchall()
выходной сигнал
$ ./python.py
[(u'20', u'cat'), (u'15', u'dog')]
Я просто наткнулся на этот скрипт на Python который делает что-то вроде того, что вы хотите, хотя он поддерживает только очень простые запросы.
У нас у меня будет облегченный ORM для sqlite это упростило бы эту задачу, не требуя каких-либо файлов конфигурации и т.д.
Если вы можете, использование PowerShell обладает множеством мощных возможностей для синтаксического анализа и запросов к текстовым файлам (пример здесь).В противном случае, используя .NET / Mono, вы можете сократить это и использовать LINQ в кратчайшие сроки.
Я создал инструмент, который мог бы помочь.http://www.mccoyonlinestore.com/index.php?txtSearch=mccoy_rdbms ваш sql может быть "Выбрать максимальное (значение) из animals" или это может быть "Выбрать * из порядка животных по значению desc"
Вы можете искать Драйверы HXTT JDBC.Они предоставляют драйверы JDBC для большинства типов плоских файлов, Excel и т.д.
Вы можете выполнять к нему простые SQL-запросы.
У них также доступны пробные версии