![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Документ имеет логическую структуру и разбит на пункты, подпункты и т.д.:
1. Сделать то-то 2. Сделать то-то 2.1. Сделать то-то 2.2. Сделать то-то 3. Сделать то-то 4. Сделать то-то Кроме точек возможно отделение скобками: 1) 2) 3) Также возможно перечисление букв: а) б) в) Возможно до 3-х уровней подпунктов: 1.1.1. У кого-нибудь есть скрипт, проверяющий правильность нумерации? |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Для простейших случаев: 1. 2. 3.
я написал, а вот на более сложных вариантах появляется много нюансов |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Вот для случая с числами и точками (вложенность не важна):
|
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Спасибо! Я попробую на работе и отпишусь позже
![]() |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Скрипт находит лишнее:
Bad 1. at line 254 Was 2. Expect 2.1. 3. Bad 1. at line 422 Was 3. Expect 3.1. 4. Bad 1. at line 470 Was 7. Expect 7.1. 8. Bad 1. at line 516 Was 4. Expect 4.1. 5. Bad 1. at line 637 Was 2. Expect 2.1. 3. Bad 1. at line 788 Was 2. Expect 2.1. 3. Bad 1. at line 967 Was 4. Expect 4.1. 5. Bad 1. at line 1436 Was 3. Expect 3.1. 4. Bad 1. at line 1450 Was 2. Expect 2.1. 3. Bad 1. at line 1578 Was 5. Expect 5.1. 6. Bad 1. at line 1692 Was 2. Expect 2.1. 3. Bad 1. at line 1795 Was 6. Expect 6.1. 7. Bad 1. at line 1865 Was 3. Expect 3.1. 4. Bad 1. at line 1945 Was 2. Expect 2.1. 3. Bad 1. at line 2622 т.е. если есть перечисление: 1. 2. 3. то скрипт ожидает после "1." "1.1" и т.п. я сделал немножко другим алгоритмом: while(<IN>){ if(/^\s+(\d+)\.\D]/){ if ($1==$com && $1!=1){ print OUT "ошибка $."} } но при этом скрипт ловит только самые простые случаи: 1. 2. 2. 3. 4. |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Что значит лишнее? Насколько я понимаю, у Вас встречается что-то вроде
1. ... 2. ... 1. line 254 и скрипт говорит, что после 2. могут следовать либо 2.1. либо 3. а не 1. Или если 1. в строке 254 не начинает пункт списка, то как это отличить? (приведите кусок текста) |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
amg, возможно, я как-то неправильно его реализовал.
Кроме задачи поиска, необходимо было отсекать НЕ ошибки. Например, в тексте может быть: 1. Утвердить список... 2. Изменить пункты 1 - 2 постановления N, изложив их в следующей редакции "1. Сделать то-то # эти места, ограниченные кавычками, за ошибки не считаются 2. Сделать то-то;". # так как относятся к другим документам 3. Утвердить положение... 3. Ответственность... # а вот это ошибка Я залил небольшой фрагмент текста (2 мб нужно скачать), последнюю версию скрипта и лог найденых ошибок. http://slil.ru/28051690 т.е. на данный момент скрипт находит только ошибки вида: 1. 2. 3. 3. Ошибка или 1) 2) 2) Ошибка 3) Добавлено @ 08:55 Если Вы сможете поймать те же самые ошибки своим алгоритмом, то дайте знать, пожалуйста. Это сообщение отредактировал(а) Suppir - 7.10.2009, 08:56 |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Не, разбираться неохота: слишком большой файл, куча служебных слов, тоже, наверное, имеющих значение, в нем, похоже, много документов, т.е. нумерация не сквозная...
Можете попробовать воспользоваться функцией из моего кода: она принимает строку с номером пункта (типа 2.1.) и возвращает список "правильных" следующих пунктов (2.2., 3., 2.1.1.). Если программа запоминает предыдущий пункт, то можно из него сгенерировать "правильные" идущие следом и сравнить их с текущим. Или даже проще: написать функцию, решающую обратную задачу -- из текущего пункта генерировать строку, с которой должен начинаться предыдущий пункт (такая строка, очевидно, будет единственной, потому и проще). |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
"слишком большой файл, куча служебных слов, тоже, наверное, имеющих значение, в нем, похоже, много документов, т.е. нумерация не сквозная..."
У меня такого "добра" несколько гигабайт ![]() "из текущего пункта генерировать строку, с которой должен начинаться предыдущий пункт" - отличная идея, спасибо ![]() Это сообщение отредактировал(а) Suppir - 7.10.2009, 14:13 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |