Простые, быстрые запросы SQL для плоских файлов - PullRequest
14 голосов
/ 17 февраля 2010

Кто-нибудь знает какие-либо инструменты для обеспечения простых и быстрых запросов плоских файлов с использованием 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 в однопроцессорном режиме, но не могу не почувствовать, что эта проблема была решено раньше. Я что-то пропустил? Эта функция уже реализована другим стандартным инструментом?

Halp!

Ответы [ 8 ]

3 голосов
/ 01 апреля 2010

Я написал TxtSushi в основном для выполнения SQL-выборок на плоских файлах. Вот цепочка команд для вашего примера (все эти команды из TxtSushi):

tabtocsv animals.txt | namecolumns - | tssql -table animals - \
'select col1, max(as_int(col2)) from animals group by col1'

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

1 голос
/ 17 февраля 2010

Я только что наткнулся на этот скрипт Python , который делает что-то вроде того, что вы хотите, хотя он поддерживает только очень простые запросы.

1 голос
/ 17 февраля 2010

вы можете использовать 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')]
1 голос
/ 17 февраля 2010

Perl DBI с использованием DBD :: AnyData

0 голосов
/ 22 июля 2016

Вы можете искать HXTT JDBC Drivers . Они предоставляют драйверы JDBC для большинства типов плоских файлов, Excel и т. Д.

Вы можете выполнять простые SQL-запросы к нему.

У них также есть пробные версии

0 голосов
/ 18 декабря 2012

Я сделал инструмент, который мог бы помочь. http://www.mccoyonlinestore.com/index.php?txtSearch=mccoy_rdbms ваш sql может быть "Выберите Макс (значение) из животных" или это может быть "Выбрать * из списка животных по значению desc"

0 голосов
/ 27 февраля 2010

Мне так и не удалось найти удовлетворительный ответ на мой вопрос, но я, по крайней мере, нашел решение проблемы с игрушкой, используя опцию uniq s "-f", о которой я не знал:

cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1

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

Я все еще надеюсь на SQL-подобный инструмент.

0 голосов
/ 17 февраля 2010

У нас будет облегченная ORM для sqlite , которая упростит эту задачу, не требуя никаких файлов конфигурации и т. Д.

Если вы можете использовать PowerShell, он обладает множеством мощных возможностей для разбора и запроса текстовых файлов (пример здесь ). В противном случае, используя .NET / Mono, вы можете сократить это и использовать LINQ в кратчайшие сроки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...