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

Кто-либо знает о каких-либо инструментах для обеспечения простых, быстрых запросов плоских файлов с помощью подобного SQL декларативного языка запросов? Я не заплатил бы издержки загрузки файла в DB, так как входные данные обычно выводятся почти сразу после того, как запрос выполняется.

Рассмотрите файл данных, "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!

14
задан Jonas 24 June 2010 в 22:43
поделиться

6 ответов

Оупс! Я должен был вспомнить, как это делает javascript.

Оказывается, вы используете функцию apply, как в:

(apply #'format format-args)
-121--3165633-

Обратите внимание, что застежки -молнии могут содержать записи как для каталогов, так и для файлов. При создании архивов с помощью команды застежек -молний передайте параметр -D , чтобы отключить явное добавление записей каталога в архив. При выполнении метода ZipFile.extractall Python 2 6 вместо записи каталога создается файл . Поскольку архивные записи не обязательно в порядке, это приводит к тому, что ZipFile.extractall довольно часто терпит неудачу, поскольку пытается создать файл в подкаталоге файла. Если у вас есть архив, который вы хотите использовать с модулем Python, просто извлеките его и повторно запишите с помощью опции -D . Вот небольшой фрагмент, который я использовал некоторое время, чтобы сделать именно это:

P=`pwd` && 
Z=`mktemp -d -t zip` && 
pushd $Z && 
unzip $P/<busted>.zip && 
zip -r -D $P/<new>.zip . && 
popd && 
rm -rf $Z

Замените < busted > .zip и < new > .zip реальными именами файлов относительно текущего каталога. Затем просто скопируйте всю вещь и вставьте ее в командную оболочку, и она создаст новый архив, готовый к раскачиванию с помощью Python 2.6. Существует команда zip , которая удалит эти записи каталога без распаковки, но IIRC она ведет себя странно в различных средах оболочки или конфигурации zip.

-121--1350970-

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

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

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

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

0
ответ дан 1 December 2019 в 16:31
поделиться

вы можете использовать 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
ответ дан 1 December 2019 в 16:31
поделиться

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

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

0
ответ дан 1 December 2019 в 16:31
поделиться

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

1
ответ дан 1 December 2019 в 16:31
поделиться

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

1
ответ дан 1 December 2019 в 16:31
поделиться

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

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

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

3
ответ дан 1 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: