Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Загрузка строк из txt с разделителем
YarriДата: Четверг, 02 Июля 2009, 12:51 | Сообщение # 1
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
Доброго дня всем.
С MMB работаю так, поскольку постольку.
Сейчас поставлена задача сделать диск по мемуарам, письмам и дневникам.
Я смотрел как это сделано было у as-mastera в его кулинарной программе.
Понравилось, и решил взять за основу систему хранения данных в txt. Их потом легче добавлять и редактировать, не залезая в саму программу.

Сам файл читается, но как разобрать его по кускам, чтобы в список вывести только фамилии?
Хелп рыл два дня, но там только про один массив из одной строки.
Прошу помочь

По самой программе.
По клику на фамилии будет выводиться в параграф справа его аннотация и вверху появляться кпопки на саму аннотацию, дневники и на галерею фотографий, если она есть.
Для этого я файл основной так и разбил.
Здесь старый скрин, от аннотации решил отказаться, я ее запихаю так же в текстовый файл.
Кляманин#klyam#3#1#
Сначала фамилия автора дневника (-ов)
Затем "имя файла" с аннотацией, который надо будет считать и загрузить в параграф.
Далее количество дневников, которые будут лежать в файлах "имя файла" + номер от 1 до кол-ва дневников.
После признак наличия фотографий, если 1, то вкл дополнительно кнопку фотоальбома и грузим туда фотки с каталога foto/"имя автора"/*.jpg
Я думаю, логично таким образом все сделать

Прикрепления: 3907590.jpg (176.3 Kb)


Сообщение отредактировал 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
Все же, на базе данных это будет намного быстрее, умнее и приятней :D
 
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)
Сам файл читается, но как разобрать его по кускам, чтобы в список вывести только фамилии?

Вот маленький пример.
Прикрепления: dic.zip (2.2 Kb)


Вы не поверите, но я опять в строю – одним лишь взглядом свои мысли подаю!

"Записи Дыма" <> "Лирика Дыма" <> "Помощник дурака"
© Dym
 
YarriДата: Среда, 08 Июля 2009, 13:44 | Сообщение # 24
Новый участник
Группа: Проверенные
Сообщений: 14
Репутация: 0
Награды: 0
Статус: Offline
Никто от помощи не отказывается. Наоборот, благодарен, что расписали как и что.

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

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

Мало ли кому еще из начинающих понадобится подобное решение?
Насчет содержимого файла. В первом посте в скриншоте в правом большом окне он как есть.

Повторюсь, сейчас все работает.

 
toizyДата: Четверг, 09 Июля 2009, 13:04 | Сообщение # 25
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
ага. Зачит, разобрались?

Вообще,можно оставить массивы, если уже не планирууется обращаться к файлу и с памятью нет проблем.


Жизнь оказалась не такой уж и забавной, как поначалу...
 
  • Страница 1 из 1
  • 1
Поиск: