Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как организовать сопоставление "один к нескольким"?

248
12 мая 2010 года
Dmitry2064
590 / / 06.12.2006
Вот есть, напр, фамилии или слова в разных падежах.
И надо, чтобы каждому такому варианту был бы сопоставлен именительный падеж.
Как это можно сделать. В каком виде и где хранить эти данные?

p.s. Пока я сохраняю все в текстовом файле в виде отдельных строк
 
Код:
Иванов
Иванов
Иванова
Иванов
Иванову
Иванов
Ивановым
Иванов

Т.е. если происходит совпадение данных в моей текстовой переменной с какой-то строкой, то для другой переменной брать текст следующей строки и т.п. Но это не оч. правильно, т.к. можно ошибиться с подсчетом строк и следующая строка окажется неверной. Можно ли как-то иначе организовать такую проверку?
327
14 мая 2010 года
UserNet2008
748 / / 03.04.2010
Может и не в тему
вот сссылкаhttp://www.delphimaster.ru/articles/search.html
248
17 мая 2010 года
Dmitry2064
590 / / 06.12.2006
Цитата: UserNet2008
Может и не в тему
вот сссылкаhttp://www.delphimaster.ru/articles/search.html



ОК. Начинаю читать!

405
18 мая 2010 года
Dmitrii
554 / / 16.12.2004
Цитата: Dmitry2064
Вот есть, напр, фамилии или слова в разных падежах.
И надо, чтобы каждому такому варианту был бы сопоставлен именительный падеж.
Как это можно сделать...

На всякий случай замечу, что даже самый обширный словарь с самым лучшим индексом не позволит Вам отличить друг от друга совпадающие формы написания фамилий женского и мужского родов в разных падежах.
Пример:
- жена Иванова (муж. р., род. п.);
- Анна Иванова (жен. р., им. п.);
- назначаю Иванова (муж. р., вин. п.).
Кроме того, существуют фамилии:
- несклоняемые вообще (Нестеренко);
- склоняемые только в мужском роде (Дибич).
Во всех указанных случаях для правильной идентификации рода потребуется выполнять анализ целого фрагмента текста, в котором встречается фамилия.

248
18 мая 2010 года
Dmitry2064
590 / / 06.12.2006
Согласен. Я как раз для таких фамилий предполагаю ручную/визуальную кореркцию падежа без занесения в словарь. Чтобы потом не было путаницы.

А как все же должен выглядеть двумерный массив данных? Может это быть простой текстовый файл (чтобы можно можно было при случае "блокнотом" его открыть и что-то подправить, если потребуется)?

Спасибо.
8.4K
18 мая 2010 года
z0rch
275 / / 02.09.2008
делайте так, как вам будет потом удобнее работать с вашими данными. если удобно будет редактировать блокнотом текстовый файл - делайте именно так.
248
19 мая 2010 года
Dmitry2064
590 / / 06.12.2006
Цитата: z0rch
делайте так, как вам будет потом удобнее работать с вашими данными.



Хорошо. А чем определять разные ячейки? Знаком табуляция или любым знаком, который не должен бы встретиться в тексте?
Например так:
Иванова¦Иванов
Иванову¦Иванов
Иванове¦Иванов
Ивановым¦Иванов
Петров¦Петров
Петрову¦Петров
Петровым¦Петров.
...
?

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

Вот как это можно описать?

Пока я делаю так:

 
Код:
Mytxt = "Ивановым"
Open mySlovar For Input As #1
 Do While Not EOF(1)
        Line Input #1, TextLine
        If TextLine = Mytxt Then ' если вхождение найдено,
        'то взять текст из сл. строки
        Line Input #1, TextLine1: Mytxt = TextLine1: Exit Do 'записали название
        End If
        Loop
            Close #1


Недостаток в том, что при ручном внесении исправлений или дополнений в такой "одноколонный" файл легко ошибиться строкой, и тогда в переменной окажутся неверные данные. Да и визуальный контроль затруднен. А если данные как бы в виде таблицы, то было бы все гораздо более наглядно.
7
19 мая 2010 года
@pixo $oft
3.4K / / 20.09.2006
А не легче ли(если я правильно понял) составлять список склонений для фамилии?Например,так
Цитата:
ИвановИванову|Ивыновым|Иванова…

8.4K
19 мая 2010 года
z0rch
275 / / 02.09.2008
действительно, если задача состоит в том, чтобы сохранять "правильные" склонения фамилий, то у вас сильно много повторяющихся слов (в им. падеже), тогда логичнее было б делать строки такого вида, как предложил @pixo $oft
Цитата:
Иванов:Иванова,Иванову,Ивановым.
Петров:Петрова,Петрову,Петровым.


upd: таблицей? легко! (=
условно например так:

 
Код:
--------------------------------
|им. падеж | род. падеж  | ... |
--------------------------------
|Иванов    | Иванова     | ... |
|Петров    | Петрова     | ... |
--------------------------------
248
19 мая 2010 года
Dmitry2064
590 / / 06.12.2006
Цитата: @pixo $oft
А не легче ли(если я правильно понял) составлять список склонений для фамилии?Например,так


Конечно так лучше. Но не понятно, как тогда искать "неправильности" и сопоставлять им "правильности"? Т.е. как программе объяснить, что символы между палочками (¦) есть как бы ячейки? И чем по этим чейкам перескакивать? Я пока силен только в такой конструкции:

 
Код:
Do While Not EOF(1)
Line Input #1, TextLine
...

а она, похоже, не подойдет для такого варианта организации данных.
7
19 мая 2010 года
@pixo $oft
3.4K / / 20.09.2006
Очень даже пойдёт.Считываете Line Input'ом целую строку,а потом парсите её.После символа "" следуют слова в падежах(т.е. до этого символа–именительный падеж),а дальше разделяете по запятой.Вроде метод Split есть(или с похожим названием).Как минимум,InStr и Mid вам в помощь
248
20 мая 2010 года
Dmitry2064
590 / / 06.12.2006
Цитата: @pixo $oft
Очень даже пойдёт.Считываете Line Input'ом целую строку,а потом парсите её...



Ага, понял направление мысли. Буду пробовать. Спасибо большое.

p.s. интересно, а если считывать не построчно и искать в "line" вхождения Instr, а обращаться к такому файлу как к матрице с ячейками, может быть будет быстрее работать процедура? или разница во времени окажется незаметна? Я где-то вычитал, что файл с произвольным доступом обратывается быстрее, чем с последовательным (если я правильно вижу связь).

p.s.s.
Столкнулся с тем, что возникает необходимость дописывать данные. Т.е. необходимо пополнять файл-словарь. Если какой-то падеж для какой-то фамилии не указан, то новые данные надо занести. А сделать эту запись возможно только в конец файла. А хотелось бы найдя нужную строку дописать ее недостающим падежом. Можно ли так сделать?

405
20 мая 2010 года
Dmitrii
554 / / 16.12.2004
Dmitry2064, мой совет - вернитесь к использованию Excel (Вы ведь всё равно работаете с этим приложением), а структуру данных возьмите ту, что предложил @pixo $oft. Возможностей по обработке данных (в том числе и по редактированию) будет куда больше.

Для обработки списков в ОЗУ очень удобно использовать объект [color=blue]Dictionary[/color].
248
21 мая 2010 года
Dmitry2064
590 / / 06.12.2006
Цитата: Dmitrii
Dmitry2064, мой совет - вернитесь к использованию Excel (Вы ведь всё равно работаете с этим приложением), а структуру данных возьмите ту, что предложил @pixo $oft. Возможностей по обработке данных (в том числе и по редактированию) будет куда больше.

Для обработки списков в ОЗУ очень удобно использовать объект [color=blue]Dictionary[/color].



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

Пока, навреное, буду дописывать в конец файла, как и предполагает комадна open #1 for append, а потом уже руками тащить в нужные строки (структура от @pixo $oft, конечно).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог