Загрузка строк из txt с разделителем
|
|
Yarri | Дата: Четверг, 02 Июля 2009, 12:51 | Сообщение # 1 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Доброго дня всем. С MMB работаю так, поскольку постольку. Сейчас поставлена задача сделать диск по мемуарам, письмам и дневникам. Я смотрел как это сделано было у as-mastera в его кулинарной программе. Понравилось, и решил взять за основу систему хранения данных в txt. Их потом легче добавлять и редактировать, не залезая в саму программу. Сам файл читается, но как разобрать его по кускам, чтобы в список вывести только фамилии? Хелп рыл два дня, но там только про один массив из одной строки. Прошу помочь По самой программе. По клику на фамилии будет выводиться в параграф справа его аннотация и вверху появляться кпопки на саму аннотацию, дневники и на галерею фотографий, если она есть. Для этого я файл основной так и разбил. Здесь старый скрин, от аннотации решил отказаться, я ее запихаю так же в текстовый файл. Кляманин#klyam#3#1# Сначала фамилия автора дневника (-ов) Затем "имя файла" с аннотацией, который надо будет считать и загрузить в параграф. Далее количество дневников, которые будут лежать в файлах "имя файла" + номер от 1 до кол-ва дневников. После признак наличия фотографий, если 1, то вкл дополнительно кнопку фотоальбома и грузим туда фотки с каталога foto/"имя автора"/*.jpg Я думаю, логично таким образом все сделать
Сообщение отредактировал Yarri - Четверг, 02 Июля 2009, 12:52 |
|
| |
YURIY | Дата: Четверг, 02 Июля 2009, 13:35 | Сообщение # 2 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (Yarri) Сам файл читается, но как разобрать его по кускам, чтобы в список вывести только фамилии? Хелп рыл два дня, но там только про один массив из одной строки. Там должно говориться о такой функции: GetArrayItem. Если есть строка Кляманин#klyam#3#1#, каждый элемент можно получить так: a$=GetArrayItem(s$,#,N) Строка, Разделитель, Номер Также советую посмотреть готовые проекты на сайте - похожих проектов просто море!
Вечная память Андрею Сергееву!
|
|
| |
Yarri | Дата: Четверг, 02 Июля 2009, 13:59 | Сообщение # 3 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Рылся. Вот потому как море, видимо и пропустил. Спасибо, испробую. Т.е. если у меня массив, то мне надо получать его таким образом a$[i]=GetArrayItem(s$,#,N), где i - количество строк в массиве
|
|
| |
YURIY | Дата: Четверг, 02 Июля 2009, 14:02 | Сообщение # 4 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Зачем вам лишний массив? 1. Считываете в цикле все строки файла. 2. В каждой строке вы будете знать сколько у вас элементов (разделённых #). Количество ведь всегда постоянное. И разбиваете строку. Массив вам не нужен.
Вечная память Андрею Сергееву!
|
|
| |
Yarri | Дата: Пятница, 03 Июля 2009, 12:25 | Сообщение # 5 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Элементы у меня получаются, но только почему то по первой строке. А как вывести в список только первые элементы строки? Запутался окончательно....
|
|
| |
Sower | Дата: Пятница, 03 Июля 2009, 12:54 | Сообщение # 6 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Quote (Yarri) А как вывести в список только первые элементы строки? a$=GetArrayItem(s$,#,1) в a$ будет первый эллемент (смотрите, чтобы в начале строки небыло #, иначе это будет второй эллемент)
|
|
| |
Alex3A | Дата: Пятница, 03 Июля 2009, 13:44 | Сообщение # 7 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Все же, на базе данных это будет намного быстрее, умнее и приятней
|
|
| |
Yarri | Дата: Пятница, 03 Июля 2009, 14:12 | Сообщение # 8 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Делаю так ListBoxAddItem("ListAutors","RESET") Items$='<SrcDir>\doc\ListAutors.txt' a$=GetArrayItem(Items$,#,1) ListBoxAddItem("ListAutors","a $") На экране только цифра 1 и пустое место. (в свойствах параграфа вывод времени отключен) При таком скрипте выводит как на скриншоте сверху. ListBoxAddItem("ListAutors","RESET") Items$='<SrcDir>\doc\ListAutors.txt' ListBoxAddItem("ListAutors","Items$") Где я промахнулся? Примечание: ListBoxAddItem("ListAutors","a $") после а нет пробела. Это глюк форума.
Сообщение отредактировал Yarri - Пятница, 03 Июля 2009, 14:25 |
|
| |
Alex3A | Дата: Пятница, 03 Июля 2009, 14:42 | Сообщение # 9 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (Yarri) Items$='<SrcDir>\doc\ListAutors.txt' А что это такое? Как из имени файла ты что то хочеш получить? Наверное надо сначало файл загрузить? переменная Items$ содежит имя файла, а не его содержимое!Добавлено (03 Июль 2009, 14:42) --------------------------------------------- Items$=StrFromFile('<SrcDir>\doc\ListAutors.txt',1,-1)
|
|
| |
Yarri | Дата: Пятница, 03 Июля 2009, 14:59 | Сообщение # 10 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Всем спасибо. Понял. Вот такой скрипт. С максимальным количеством решил пока не заморачиваться. Можно и вручную посчитать. И все-таки с массивом удобнее, ибо мне проще выкусить элемент двухмерного массива для обработки по выделенному элементу. Тем более что если пользовать далее сортировку по имени. ListBoxAddItem("ListAutors","RESET") For i=1 To 16 Items$[i]=StrFromFile('<SrcDir>\doc\ListAutors.txt',i,-1) a$[i]=GetArrayItem(Items$[i],#,1) Next i ListBoxAddItem("ListAutors","a$[]") В общем то можно и Items не делать масивом....
Сообщение отредактировал Yarri - Пятница, 03 Июля 2009, 15:00 |
|
| |
YURIY | Дата: Пятница, 03 Июля 2009, 16:15 | Сообщение # 11 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (Yarri) С максимальным количеством решил пока не заморачиваться. Количество строк в файле - функция NOL. Quote (Yarri) Items$[i]=StrFromFile('<SrcDir>\doc\ListAutors.txt',i,-1) А что это интересно такое? В каждый элемент Items$ загружается весь файл целиком начиная с i-строки. В чём смысл? Думаю, нужно так: Code p$='<SrcDir>\doc\ListAutors.txt' ListBoxAddItem("ListAutors","RESET") For i=1 To NOL(p$) Items$=StrFromFile(p$,i,1) a$=GetArrayItem(Items$,#,1) ListBoxAddItem("ListAutors","a$") Next i
Вечная память Андрею Сергееву!
|
|
| |
Yarri | Дата: Пятница, 03 Июля 2009, 16:25 | Сообщение # 12 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| А разве не выделенная i строка? Спасибо, попробую и так. Для оптимизаций нет пределов
|
|
| |
YURIY | Дата: Пятница, 03 Июля 2009, 16:44 | Сообщение # 13 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (Yarri) А разве не выделенная i строка? Что-то я ничего не понял... А что требуется сделать?
Вечная память Андрею Сергееву!
|
|
| |
Alex3A | Дата: Пятница, 03 Июля 2009, 16:54 | Сообщение # 14 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (YURIY) А что требуется сделать? Во! В этом суть!
|
|
| |
Yarri | Дата: Понедельник, 06 Июля 2009, 15:50 | Сообщение # 15 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Quote (YURIY) Quote (Yarri) С максимальным количеством решил пока не заморачиваться. Количество строк в файле - функция NOL. Quote (Yarri) Items$[i]=StrFromFile('<SrcDir>\doc\ListAutors.txt',i,-1) А что это интересно такое? В каждый элемент Items$ загружается весь файл целиком начиная с i-строки. В чём смысл? От массива с Items я избавился. Quote (YURIY) Думаю, нужно так: Code p$='<SrcDir>\doc\ListAutors.txt' ListBoxAddItem("ListAutors","RESET") For i=1 To NOL(p$) Items$=StrFromFile(p$,i,1) a$=GetArrayItem(Items$,#,1) ListBoxAddItem("ListAutors","a$") Next i В данном случае на экран выводится только одно ФИО автора. А мне нужен список всех авторов, т.е. первое поле всех строк до #. При использовании a$[i] и a$[] на выводе все получается.
|
|
| |
toizy | Дата: Понедельник, 06 Июля 2009, 16:34 | Сообщение # 16 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Quote (Yarri) только одно ФИО автора. В сценарии ошибок не вижу, должно быть, либо цикл имеет одну итерацию либо файл имеет одну строку.Добавлено (06 Июль 2009, 16:34) --------------------------------------------- А вообще, после a$=GetArrayItem(Items$,#,1) рекомендую вставить Message("", "a$"), многое сразу станет ясно
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
Alex3A | Дата: Понедельник, 06 Июля 2009, 16:59 | Сообщение # 17 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| И чего тебе надобно? Просто загрузить чего то в лист, или при загрузке как то обработать каждую строку. Любой скрипт переводится на простые слова и по русски. p$='<SrcDir>\doc\ListAutors.txt' присвоить переменной p$ текст ListBoxAddItem("ListAutors","RESET") очистить листбокс For i=1 To NOL(p$) цикл до окончания файла Items$=StrFromFile(p$,i,1) считать одну строку из файла,начиная с iтой a$=GetArrayItem(Items$,#,1) взять из полученной строки первую часть до знака# ListBoxAddItem("ListAutors","a$") добавить ее в лист Next i увеличить указатель цикла на 1 Quote (Yarri) В данном случае на экран выводится только одно ФИО автора В даном случае выводится список всех авторов.1avtor...6avtor. Содержимое файла 1avtor#1eeeee#rrrr# 2avtor#2eeeee#rrrr# 3avtor#3eeeee#rrrr# 4avtor#4eeeee#rrrr# 5avtor#5eeeee#rrrr# 6avtor#6eeeee#rrrr# Чего у тебя не выходит, или чего тебе надобно непонятно. 1avtor#1eeeee#rrrr# тут подразумевается перевод строки коды #13#10 (делает кнопа ентер, при нажатии) 2avtor#2eeeee#rrrr# если их нет то и получиш только первого автора, строка заканчивается этими символами, пс, вк, перевод строки возврат каретки.
Сообщение отредактировал Alex3A - Понедельник, 06 Июля 2009, 17:02 |
|
| |
YURIY | Дата: Понедельник, 06 Июля 2009, 22:29 | Сообщение # 18 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (Yarri) В данном случае на экран выводится только одно ФИО автора. А мне нужен список всех авторов, т.е. первое поле всех строк до #. Что-то вы делаете не так.
Вечная память Андрею Сергееву!
|
|
| |
Yarri | Дата: Вторник, 07 Июля 2009, 13:51 | Сообщение # 19 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Список авторов набивал в ноутпаде с ентером на перевод строки. Если бы была только одна строка (гипотетически предположим, что этот тип ентера игнорируется mmb), то при цикле и выводе в массив a$[i] все остальные фамилии были бы пропущены. У меня же работает как-то странно при отсутствии массива, если вы утверждаете, что где-то начудил. Переменная a$=GetArrayItem(Items$,#,1) получает данные как положено. ------------------- Японский городовой. Вот в чем разница. ListBoxAddItem("ListAutors","a$") стояла после окончания массива. Таким образом добавлялся в список только один элемент. Т.е. либо Code a$=GetArrayItem(Items$,#,1) ListBoxAddItem("ListAutors","a$") [color=red]Next i [/color] либо Code a$[i]=GetArrayItem(Items$,#,1) [color=red]Next i [/color] ListBoxAddItem("ListAutors","a$[]")
|
|
| |
Alex3A | Дата: Вторник, 07 Июля 2009, 15:55 | Сообщение # 20 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Ты опять что то чудиш! Я тебе расписал работающий код. a$ и a$[] являются раазными переменными, строкой и массивом, функция GetArrayItem(Items$,#,1) возвращает строку, ее можно присвоить как строковой переменной a$ так и елементу массива строк a$[], указав при присваивании индекс элемента массива a$[i]. можно копипастить. a$='ooooo' a$[1]='jjjjj' Message("это значение строковой переменной","a$") Message("это значение элемента массива","a$[1]") Message("это значение массива","a$[]")
|
|
| |
YURIY | Дата: Вторник, 07 Июля 2009, 18:06 | Сообщение # 21 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (Yarri) Японский городовой. Вот в чем разница. Действительно, зачем рабочий скрипт, который я дал выше, переделывать и снова вставлять туда массив? Я вам дал работающий пример - что ещё нужно? Если вы не пользуетесь нашей помощью - вам просто никто больше не будет помогать, вот и всё.
Вечная память Андрею Сергееву!
|
|
| |
toizy | Дата: Вторник, 07 Июля 2009, 23:19 | Сообщение # 22 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| И ладно бы, если б мы видели тот самый текстовый файл... Явно что проблема с ним
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
Dym | Дата: Среда, 08 Июля 2009, 05:29 | Сообщение # 23 |
Поэт
Группа: Проверенные
Сообщений: 220
Репутация: 9
Награды: 7
Статус: Offline
| Quote (Yarri) Сам файл читается, но как разобрать его по кускам, чтобы в список вывести только фамилии? Вот маленький пример.
Вы не поверите, но я опять в строю – одним лишь взглядом свои мысли подаю! "Записи Дыма" <> "Лирика Дыма" <> "Помощник дурака" © Dym
|
|
| |
Yarri | Дата: Среда, 08 Июля 2009, 13:44 | Сообщение # 24 |
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
| Никто от помощи не отказывается. Наоборот, благодарен, что расписали как и что. Я у себя оставил вариант без массивов. Но просто сюда выложил оба рабочих варианта.На всякий случай. В первом варианте мы читаем последовательно файл, выкусываем первый элемент и запихиваем его в список. Далее следующий элемент и в список его. Во втором варианте мы читаем весь фал целиков, выкусывая из него первые элементы и запихивая их в массив. А уже после посылаем его в список. Мало ли кому еще из начинающих понадобится подобное решение? Насчет содержимого файла. В первом посте в скриншоте в правом большом окне он как есть. Повторюсь, сейчас все работает.
|
|
| |
toizy | Дата: Четверг, 09 Июля 2009, 13:04 | Сообщение # 25 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| ага. Зачит, разобрались? Вообще,можно оставить массивы, если уже не планирууется обращаться к файлу и с памятью нет проблем.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |