5 Выделение табличной информации из файлов различных типов - Разработка средств автоматизации поиска структурированной информации в гетерогенной среде

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

Выделение информации из таблиц в документах Excel

Для выделение табличных данных из документов Excel вначале необходимо выделить на листе часть с данными и далее выделить из нее заголовки.

Во-первых, необходимо проверить лист на пустоту. Для этого, используется стандартную функцию UsedRange объекта WorkSheet(Рабоичй лист) [9]. В случае, если UsedRange. Rows. Count и UsedRange. Columns. Count одновременно равны единице, то можно сделать вывод, что данный пустой. Ну, а далее, когда мы прошли проверку листа на пустоту, то необходимо выделить диапазон с данными.

Для решения данной задачи можно было бы использовать ту же самую функцию(UsedRange), которая выделяет диапазон используемых ячеек, но у нее есть один большой недостаток. Недостаток заключается в том, что используемой ячейкой считается не только заполненная ячейка, но и ячейка в которой когда-либо находились данные. К примеру, я ввел данные в ячейку А1, а далее удалил их из этой ячейки. Таким образом, данная функция вернет ячейку А1, несмотря на то, что на данный момент она пустая, так как ранее она использовалась. Таким образом, необходимо разработать собственный алгоритм для выделения данных с листа Excel.

Этапы выделения данных с листа Excel:

    1. Найти одну непустую ячейку на листе. 2. От этой ячейки двигаться вверх, вниз, вправо, влево до тех пор, пока не встретится пустая ячейка(выделить диапазон ячеек). 3. Считать заголовки таблицы.

Ниже будет рассмотрен этап для выделения непустой ячейки. Во-первых, для выделения диапазона непустых ячеек необходимо вначале выделить одну непустую ячейку. Для этого будет использована стандартная функция в языке C# "UsedRange ".

Ниже будет рассмотрен алгоритм для выделения диапазона ячеек.

На вход нам попадает непустая ячейка из предыдущего этапа. После того, как найдена непустая ячейка приложение определяет диапазон этих данных. Для этого она начинает идти вверх, вниз, влево, вправо до тех пор, пока не встретит пустую ячейку. На выходе мы получаем диапазон ячеек.

Ниже будет рассмотрен этап выделения заголовков.

На вход нам попадает диапазон ячеек с данными из предыдущего этапа. После того, как диапазон выделен, приложение перемещается на самую верхнюю заполненную строчку и считывает заголовки данной таблицы слева направо. Если количество считанных заголовков меньше или равно ширине диапазона минус 4, то приложение переходит к следующей строке с данными и формирует новый уровень заголовков. И так до тех пор, пока количество непустых ячеек в ряде будет больше или равно Таким образом, после проведения всех этих манипуляций мы получаем, список заголовков таблицы или null, если лист пуст.

Ниже будет рассмотрен пример работы алгоритма.

Далее приложение начинает искать в нем первую непустую ячейку. С помощью функции "UsedCells" можно получить доступ к верхней левой заполненной ячейке или получить пустую ячейку, если лист пуст.

Далее из ячейки C4 программа начнет двигаться вверх, вниз, влево, вправо до тех пор пока не встретит пустую ячейку или не дойдет до конца листа.

Так как у нас количество заголовков в первой строке больше или равно ширине диапазона минус 4(14>14-4), то перехода к считыванию следующей строки не будет. Таким образом, модель таблицы будет состоять только из одного уровня заголовков, в который будут входить следующие заголовки:

    - Хозяева. - Гости. - Тур. - Месяц. - Место. - Id команды. - Класс тренера. - 1. - Бюджет. - Голов забито. - Голов пропущено. - Голов забито игру назад. - Голов пропущено игру назад.

Выделение информации из таблиц в документах WORD

С WORD все обстоит проще. DLL для работы с документами WORD дает широкие возможности для различных действий на основе этих документов.

В данной библиотеке все таблицы документа хранятся в свойстве WordDocument. Tables и поэтому доступ к этой таблице сводится к тому, что необходимо просто указать индекс интересующей таблицы [10]. К примеру, строка WordDocument. Tables[1] в результате вернет ссылку на первую таблицу в документе.

Таким образом, алгоритм извлечения таблиц сводится к следующему. Во-первых запрашивается таблица из массива WordDocument. Tables[1] и далее идет проход по первой строке этой таблицы с целью извлечения ее заголовков.

Единственной проблемой может быть, когда несколько ячеек заголовка слиты воедино, но эта ситуация обработана с помощью блока try-catch.

Таким образом, результатом обработки таблицы 1 будет список заголовков таблицы:

    - Хозяева. - Гости. - Работа. - Id. - Место в составе.

Выделение информации из таблиц в документах HTML

На входе в приложение мы получаем HTML файл или ссылку на документ формате HTML. Для его парсинга, а именно извлечения данных из тэгов будет использована dll библиотека "HtmlAgilityPack", которая работает с языком Xpath.

Ниже приведены этапы работы данного алгоритма:

    1. Выделить все таблицы из документа 2. Для каждой таблицы, проверить наличие внутренних таблиц в этих таблицах. Те, таблицы, которые имеют внутренние таблицы отбросить. 3. Из оставшихся от предыдущего этапа оставить только те таблицы, у которых количество ячеек больше 5 и, у которых хотя бы 50% содержат числовые данные.

Чтобы найти таблицы нужно странице обратиться с помощью языка Xpath. Запрос будет выглядеть следующим образом:

HtmlNodeCollection tables = d. DocumentNode. SelectNodes("//table");

Данный код означает, что из документа берутся все DOM-узлы с тэгом "table", то есть таблицей. Итого у нас есть коллекция кодов всех таблиц, которые имеются на данной странице.

Таблицы на страницах могут быть 2 видов: информационные и те, которые используются для разметки страницы. Таким образом, необходимо оставить только те таблицы, которые несут информационную нагрузку.

Для этого в цикле обращаемся к каждой таблице из коллекции и начинаем определять ее тип.

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

Для реализации проверки таблицы - является она внутренней или нет - мы будем искать в коде таблицы фрагмент "<table", открывающий тэг таблицы, который говорит о том, что внутри таблицы имеется еще одна таблица. Если мы обнаруживаем данный фрагмент, то это значит, что таблица не внутренняя, и мы ее отбрасываем.

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

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

Если эта проверка пройдена, то проверим таблицу на количество ячеек. В данной работе было определено, что если в таблице менее 6 ячеек, то мы их отсекаем.

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

Похожие статьи




5 Выделение табличной информации из файлов различных типов - Разработка средств автоматизации поиска структурированной информации в гетерогенной среде

Предыдущая | Следующая