Кто-либо знает о каких-либо инструментах для обеспечения простых, быстрых запросов плоских файлов с помощью подобного 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!
Оупс! Я должен был вспомнить, как это делает 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.
Мне так и не удалось найти удовлетворительный ответ на мой вопрос, но я, по крайней мере, нашел решение моей игрушечной проблемы, используя опцию uniq
s «-f», о которой я не знал:
cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1
Часть awk
выше, очевидно, может быть полностью пропущена, если входной файл был создан со столбцами в
Я все еще возлагаю надежды на SQL-подобный инструмент.
вы можете использовать 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')]
У меня будет облегченная ORM для sqlite , которая упростит эту задачу, не требуя никаких файлов конфигурации и т. Д.
Если вы можете использовать PowerShell имеет множество мощных возможностей для синтаксического анализа и запроса текстовых файлов ( пример здесь ). В противном случае, используя .NET / Mono, вы можете сократить это и использовать LINQ в кратчайшие сроки.
Я только что наткнулся на этот скрипт Python , который делает что-то вроде того, что вы хотите, хотя он поддерживает только самые простые запросы.
Я написал TxtSushi в основном для выполнения выборки SQL для плоских файлов. Вот цепочка команд для вашего примера (все эти команды взяты из TxtSushi):
tabtocsv animals.txt | namecolumns - | tssql -table animals - \ 'select col1, max(as_int(col2)) from animals group by col1'
namecolumns требуется только потому, что animals.txt не имеет строки заголовка. Вы можете быстро понять, что это возможно, просмотрев пример сценария . Внизу главной страницы также есть ссылки на аналогичные инструменты.