Простые и быстрые SQL-запросы для плоских файлов

StackOverflow https://stackoverflow.com/questions/2277960

  •  21-09-2019
  •  | 
  •  

Вопрос

Кто-нибудь знает о каких-либо инструментах для предоставления простых и быстрых запросов к плоским файлам с использованием 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-запросы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top