SQL Python / Bash для TSV Flatfiles (без sqlite) - PullRequest
4 голосов
/ 21 сентября 2011

Справочная информация:

sqlite отлично подходит для выполнения операций SQL с данными, загруженными в базы данных, но много раз в моей работе мне нужно было выполнять операции выбора, объединения и определения операторов.файлы, которые не загружены в базу данных и не обязательно стоят времени для загрузки / инициализации в базу данных.Кроме того, характеристики произвольного доступа в sqlite часто замедляют операции, выполняемые с каждой строкой в ​​базе данных.

Вопрос:

Существует ли набор типов SQLкоманды / fxns (предпочтительно python / bash), которым не нужен sqlite и который работает только с необработанными файлами с вкладками?Например, вместо того, чтобы использовать таблицы для выбора строк, просто используйте номера столбцов.

Пример

select col1,col2,col3 from fileName.tsv where col1[int] < 3

Примечание: я понимаю, что многое из этого можно сделать с помощью awk, cut, bash-присоединиться и т.д .;Мне было интересно, есть ли что-то более SQLesque?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Вы можете взломать что-нибудь вместе, используя модуль csv и список :

import csv

reader = csv.reader(open('data.csv', 'r'))
rows = [row for row in reader]

# select * from data where first column < 4
# this won't actually work as-is! see the edit below
[row for row in rows if row[0] < 4]

# select * from data where second column >= third column
[row for row in rows if row[1] >= row[2]]

# select columns 1 and 3 from data where first column is "mykey"
[[row[0], row[2]] for row in rows if row[0] == "mykey"]

Возможно, вы сможете сделать еще более впечатляющие вещи с помощью функциональных инструментов программирования Python , хотя, если вы еще не знакомы с FP, это, вероятно, слишком большая тема для изучения только для этого; -)


Редактировать: Еще пара советов:

  • Если вы собираетесь выполнять только один «запрос» на сценарий, вы можете вырезать промежуточное хранилище данных (rows в моем примере):

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    result = [row for row in reader if row[0] == "banana"]
    
  • Программа чтения csv генерирует весь свой вывод в виде текста, поэтому, если вы хотите рассматривать один столбец как целое число, вам придется сделать это самостоятельно.Например, если ваш второй и третий столбцы являются целыми числами,

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    rows = [[row[0], int(row[1]), int(row[2])] for row in reader]
    # perform a "select" on rows now
    

    (Это означает, что мой первый пример выше не будет работать как есть.) Если все ваших столбцовявляются целыми числами, то вы можете вызвать функциональную функцию map:

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    rows = [map(int, row) for row in reader]
    
1 голос
/ 21 сентября 2011

После поиска в Google python equivalent of DBD::CSV я нашел KirbyBase . Похоже, это будет соответствовать всем требованиям.

Поскольку я обычно не использую Python, я никогда не пробовал его.

Отредактировано, чтобы добавить: Хорошо, после взгляда на документацию, команды запроса не совсем SQL, но они намного более SQLesque, чем использование awk.

0 голосов
/ 21 сентября 2011

Я настоятельно рекомендую парсер Microsoft 2.2 ... за исключением того, что я полагаю, что вы используете Linux.Уверен, это не сработает.Но я приведу здесь ссылки на случай, если кто-то не использует Linux.

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24659 http://www.codinghorror.com/blog/2005/08/microsoft-logparser.html

...