Время прочтения: 3 мин.
В ходе рабочей деятельности ко мне попал файл журналов регистрации 1с (в формате lgd) размером около 40 Гб и у меня стояла задача получить из него данные, и по возможности подключить его к рабочей СУБД, а именно МS SQL.
Для подключения lgd файлов к MS SQL необходимы дополнительные расширения, установить которые у меня не было возможности, поэтому в данной статье я буду рассматривать получение данных из файла lgd без использования ms sql.
Начать следует с понимания того, что находится внутри данного файла и как он структурирован.
В данной ситуации самыми логичными действиями будет открыть файл как текстовый.
Но текстовый файл таких размеров обычный текстовый редактор не откроет.
И в случае ограниченных ресурсов после довольно долгих изысканий открылось два пути.
Первый путь использовать far manager3, в режиме просмотра он сможет открыть файл и продемонстрировать, что находится внутри.
Второй же путь — использовать построчный вывод python. В данной конкретной ситуации не стоит использовать какие-либо дополнительные библиотеки для анализа и обработки данных (pandas) они лишь дополнительно загрузят систему и вернут огромное количество ошибок, единственное стоит импортировать библиотеку codecs.
Но предварительно стоит сменить расширение файла на txt:
import codecs
with codecs.open('C:\\path_to_file\\file.txt', 'r','cp866' ) as f:
for i in range(200):
print(f.readline())
Скорее всего он вернет огромное количество неизвестных символов (кодировка будет сбита), но в моей ситуации он также вернул записи создания таблиц в sqlite:
Ytablesqlite_sequencesqlite_sequence CREATE TABLE table_a(name,seq)Е}
ЛMtableloggCREATE TABLE name_t (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
A INTEGER,
B INTEGER,
C INTEGER,
D INTEGER,
Также это можно увидеть в far manager.
Итак, мы разобрались с внутренностями файла — это файл базы данных sqlite.
Следовательно, к ней можно подключиться. Я использовал для этого библиотеку sqlite3:
import sqlite3
Подключаемся к базе:
conn = sqlite3.connect('file.lgd')
И создаем курсор — он понадобится нам для работы с ней:
cursor = conn.cursor()
Далее, чтобы извлечь данные из базы используем метод execute и пишем запрос на sqlite:
cursor.execute('''SELECT * FROM base''')
Мы можем извлечь информацию непосредственно из запроса, для этого мы можем использовать методы cursor.fetchone() или cursor.fetchall().
Первый возвращает одну строку из запроса, второй — все.
Демонстрация cursor.fetchone():
(2, 'A','b')
Как мы можем увидеть, нам возвращается кортеж строки и собственно здесь мы уже можем подключить pandas для более удобного анализа и преобразования данных.
Итоговый код у меня вышел примерно такой:
import sqlite3
conn = sqlite3.connect('file.lgd')
cursor = conn.cursor()
cursor.execute('''SELECT * FROM table_n''')
# создаю список столбцов для данных сохраняя последовательность
columns = ['a','b','f']
c = cursor.fetchall()
# создаю лист для строк и объединяю в общий словарь
rows = []
for i in c:
g = dict(zip(columns,i)) # также внутри цикла фильтрую нежелательные символы табулции
g['a'] = g['a'].replace('\r\n','')
g['b'] = g['b'].encode('cp1251', errors = 'replace').decode('utf-8',errors = ' replace')
# у меня полностью слетела русская кодировка с файла и таким преобразованием мне удалось ее восстановить
g['f'] = g['f'].replace('\n','')
rows.append(g)
#print(rows)
frame = pd.DataFrame.from_dict(rows, orient = 'columns')
frame
В итоге получаем фрейм, который мы можем преобразовать как в excel файлы, так и в csv.
Это значительно облегчит нам работу с данными, их дальнейший анализ и возможные манипуляции. Надеюсь данная статья будет полезна в случае, если вы столкнулись с подобной проблемой и поможет ее решить.