SQL-как JOIN для двух текстовых файлов в Python, есть ли встроенный способ? - PullRequest
3 голосов
/ 02 сентября 2010

Обычная задача, которую я должен выполнить - это SQL-подобное JOIN для двух текстовых файлов. то есть создайте новый файл из файлов "левой руки" и "правой руки", используя какое-то соединение для столбца идентификатора, разделяемого между ними. Иногда требуются изменения, такие как внешние соединения и т. Д.

Конечно, я мог бы написать простой сценарий, чтобы сделать это в общем виде, но есть ли модуль Python - встроенный или устанавливаемый - который может это сделать? То, что может обрабатывать огромные файлы, было бы идеально.

EDIT:

  • Я знаю о PyTables, но это самое простое решение для плоских текстовых файлов?
  • Под "огромными файлами" я подразумеваю, что иногда файл "левой руки" слишком велик для хранения в памяти
  • Отсутствие (пока) ответа Python меня беспокоит. Я использую не тот инструмент / парадигму для этого? Причина, по которой я попросил библиотеку Python, заключается в том, чтобы можно было легко добавлять другие преобразования в каждой строке (проверять идентификаторы и т. Д.).

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

[дикая идея]

Будут ли эти файлы помещаться в память вашей системы и оставаться достаточно неподвижными? В этом случае вы можете загрузить их в таблицы, используя SQLite, а затем присоединить их к своему сердцу, используя собственный SQL.

[/ дикая идея]

Обновление

Поцарапайте это. Оператор сказал, что один из файлов слишком велик для хранения в памяти. . Смотрите этот ответ @ Дейв Кирби . SQLite можно использовать с базой данных на диске.

0 голосов
/ 02 сентября 2010

Если вы используете систему Unixy или Cygwin, взгляните на команду соединения - она ​​может сделать именно то, что вы просите.

[26] % join --help
Usage: join [OPTION]... FILE1 FILE2
For each pair of input lines with identical join fields, write a line to
standard output.  The default join field is the first, delimited
by whitespace.  When FILE1 or FILE2 (not both) is -, read standard input.

  -a FILENUM        print unpairable lines coming from file FILENUM, where
                      FILENUM is 1 or 2, corresponding to FILE1 or FILE2
  -e EMPTY          replace missing input fields with EMPTY
  -i, --ignore-case ignore differences in case when comparing fields
  -j FIELD          equivalent to `-1 FIELD -2 FIELD'
  -o FORMAT         obey FORMAT while constructing output line
  -t CHAR           use CHAR as input and output field separator
  -v FILENUM        like -a FILENUM, but suppress joined output lines
  -1 FIELD          join on this FIELD of file 1
  -2 FIELD          join on this FIELD of file 2
      --help     display this help and exit
      --version  output version information and exit

Unless -t CHAR is given, leading blanks separate fields and are ignored,
else fields are separated by CHAR.  Any FIELD is a field number counted
from 1.  FORMAT is one or more comma or blank separated specifications,
each being `FILENUM.FIELD' or `0'.  Default FORMAT outputs the join field,
the remaining fields from FILE1, the remaining fields from FILE2, all
separated by CHAR.

Important: FILE1 and FILE2 must be sorted on the join fields.

Report bugs to <bug-coreutils@gnu.org>.

Если вы хотите что-то более сложное или вам абсолютно необходимосделайте это на python, а затем подумайте о том, чтобы прочитать файлы в базу данных SQLite в памяти - тогда у вас есть все возможности SQL для объединения и манипулирования данными.

edit просто прочитайте, что файлыслишком велики, чтобы уместиться в памяти.Вы все еще можете использовать SQLite, но создать временную базу данных на диске.

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