SQL

Работа с файлами журнала регистрации 1С в Рython

Время прочтения: 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.

Это значительно облегчит нам работу с данными, их дальнейший анализ и возможные манипуляции. Надеюсь данная статья будет полезна в случае, если вы столкнулись с подобной проблемой и поможет ее решить.

Советуем почитать