Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Есть строка в текстовом файле с разделителем в виде символа "|" , пример
Code
Данные 1 | Данные 2 | Данные 3 | Данные 4 | Данные 5 | Данные 6 | Данные 7
И собственно вопрос как извлечь из этой строки например Данные 3 ? Если я правильно понимаю то для этих целей надо использовать StrParse , но в справке как то не очень понятно дан пример ( или я его не понял )
Сообщение отредактировано Snow_Irbis - Вс, 24 Октября 2010, 13:58
жаль что не поняли, все очень просто. заполнить поля в диалоге команды сложно чтоли... 1)искомая строка 2)разделитель (символ или набор символов, строка) 3)имя массива куда сложатся распарсенные элементы 4)имя переменной, куда сложится число распарсенных эл-тов (обьем массива, удобно для последующего использования в цикле для разбора массива в кач-ве предела цикла)
Code
setvar "[String]" "Данные 1 | Данные 2 | Данные 3 | Данные 4" StrParse "[String]" "|" "[Data]" "[x]"
Переменная массива [Data1] будет содержать Данные 1, [Data3] будет содержать Данные 3 и т.д...
Добавлено (24 Октябрь 2010, 14:28) --------------------------------------------- например чтобы распарсить многострочный файл на отдельные строки, читаем его в переменную [String] с помощью FileToVar, затем используем в кач-ве разделителя перевод строки [#13], символ новой строки [#10] или оба сразу, поэкспериментируйте как будет лучше вам:
Добавлено (24 Октябрь 2010, 14:52) --------------------------------------------- DEMBEL, что то я видимо опять не до понял , есть код который выбирает из строки данные четко :
Quote (DEMBEL)
Code
setvar "[String]" "Данные 1 | Данные 2 | Данные 3 | Данные 4" StrParse "[String]" "|" "[Data]" "[x]"
По аналогии я сделал такое , убрав только присвоение переменной [String] , так как у меня строку считывает в переменную [dates]
вроде все верно. а фрагмент файла можно увидеть? попробуйте проверить в дебагере что лежит в переменных и есть ли они, ищите ошибку. Или вставьте алертбоксы:
Сергей, для начала я просто хочу вывести результат парсинга по средством переменной на страницу проекта , сейчас вывожу так ставлю переменную в надпись/текст
Quote (Сергей)
и что не работает?
Нет , можешь сам проверить и если что подсказать что я не так делаю , код пару постами выше а файл для теста 1 постом выше
сейчас вывожу так ставлю переменную в надпись/текст
непонятно по какому принципу? просто TEST все 390 штук?
Добавлено (24 Октябрь 2010, 20:35) ---------------------------------------------
Quote (Snow_Irbis)
что я не так делаю
незнаю, но DEMBEL в #4 код правильный привел, а у тебя будет в переменой только последняя строка чтоб у тебя заработал, надо добавить еще одну строку, вместо Delay "500"
Quote
SetVar "[strResult]" "[strResult][Data1][#13]"
Сообщение отредактировано Сергей - Вс, 24 Октября 2010, 20:40
непонятно по какому принципу? просто TEST все 390 штук?
В строке есть данные они разделены разделителем "|" , строк может быть неограниченное количество , и нужно делать выборку из строки согласно разделителю "|" , в представленном Дембелем первом варианте когда значение переменной задается с помощью setvar , все работает , но если делать выборку из строки , а в качестве данных использовать переменную из команды FileRead то уже все идет не так как надо , и вывод информации возможен если поставить только переменную [Data1] , в этой переменной будет то же самое что и в переменной [dates] полученной с помощью команды FileRead ( смотреть скриншот пару постами выше ) , хотя по идее в переменной [Data1] должна быть информация из строки которая идет до первого символа разделителя если я не ошибаюсь
Добавлено (24 Октябрь 2010, 20:43) ---------------------------------------------
Quote (Сергей)
незнаю, но DEMBEL в #4 код правильный привел, а у тебя будет в переменой только последняя строка чтоб у тебя заработал, надо добавить еще одну строку
Code
SetVar "[strResult]" "[strResult][Data1][#13]"
А зачем присваивать значение переменной [strResult] ? Да и что это за переменная такая и почему она стоит в данных для присвоения самой же себе ?
результат [Data] это не строка, а массив, сечешь? Надо обращатся как к масиву, т.е. [Data11], [Data12], [Data13]....[Data126]
Добавлено (24 Октябрь 2010, 20:47) --------------------------------------------- Пока ты толком не объяснишь конечный результат, тебе будут приводить разные способы, но ни один может не подойти... На пальцах объясни, что хочешь, тут запости (демо пример строкой), чего ты хочешь добится. Я лично не пойму
Добавлено (24 Октябрь 2010, 20:51) --------------------------------------------- имей ввиду, что если парсить весь файл, то получается 15 массивов (по количеству строк)
Сообщение отредактировано Сергей - Вс, 24 Октября 2010, 20:51
вместо [Data] поставит например [Data3] то появится переменная [Data31] , то в этой переменной [Data31] будет выводиться те же данные что и выводились в переменной [Data1] когда в строке StrParse переменная стояла [Data] , а все остальные переменные кроме [Data1] , пустые !
Пока ты толком не объяснишь конечный результат, тебе будут приводить разные способы, но ни один может не подойти... На пальцах объясни, что хочешь, тут запости (демо пример строкой), чего ты хочешь добится. Я лично не пойму
По моему я объяснил что я хочу и тест файл выложил ( по крайней мере Дембель понял что требуется ) , хотя если не понятно объясню еще раз что я хочу сделать . Есть файл я его выкладывал выше , в нем есть строки разделенные разделителем "|" ( кавычек естественно нет ) , мне надо считывать определенные данные с строки
Quote (Сергей)
имей ввиду, что если парсить весь файл, то получается 15 массивов (по количеству строк)
Опять не понимаю , я ведь считал одну строку , одну строку я распарсиваю в ней 26 массивчиков , следующую строку я буду распарсивать по окончанию распарсивания этой строки так как там идет оно по циклу , или я не так понимаю ?
Сергей, если я там укажу определенную строку то толку от цикла ? Мне надо распарсить все строки , с начала одну потом вторую , и так все , да и в любом случае даже так оно все равно выводит в переменную [Data1] информацию из всего файла , а других переменных нет
это массив, а не элемент, как ты не можешь понять! Ты знаешь что такое массив?
Добавлено (24 Октябрь 2010, 22:38) --------------------------------------------- если тебе надо получить елемент, то надо обращатся к n-элементу в n-массиве ([Data33])
Добавлено (24 Октябрь 2010, 22:40) --------------------------------------------- в объекте в надпись/текст поставь эту переменую массива [Data33] и все увидешь
это массив, а не элемент, как ты не можешь понять! Ты знаешь что такое массив?
Ну почему тогда если делать так как показал Дембель
Code
setvar "[String]" "Данные 1 | Данные 2 | Данные 3 | Данные 4" StrParse "[String]" "|" "[Data]" "[x]"
В переменной [Data3] будут данные Данные 3 , то есть из строки выбирает данные в 3-й ячейке ( и появляется по переменной на каждую ячейку ) , а вот если вставить переменную считанной строки сразу вместо [String] , а строку setvar "[String]" "Данные 1 | Данные 2 | Данные 3 | Данные 4" убрать ( что по сути то же самое ) то в переменной [Data3] ничего не будет ( и так же не будет переменных по количеству ячеек как в прочем и переменной [Data3] ) ?
ПИ Ячейками называю пространство между разделителями строки
Добавлено (24 Октябрь 2010, 22:49) ---------------------------------------------
Quote (Сергей)
если тебе надо получить елемент, то надо обращатся к n-элементу в n-массиве ([Data33])
почему нельзя делать так как я пытаюсь сделать сейчас , ведь мои действия аналогичны с рабочим кодом где присваивается значение переменной , с тем различием что вместо присвоения значения переменной я подставляю значение переменной в которой считана строка ? Это ведь тоже самое !
Quote (Сергей)
в объекте в надпись/текст поставь эту переменую массива [Data33] и все увидешь
Переменной [Data33] вовсе не будет ! Будет много переменных [Data([i]+1)] . Проверь сам , по мимо этого в дебагере будет видно появление все новых переменных и их число будет соответствовать количеству строк в файле который парситься , а имя их будет соответствовать [Data([i]+1)] , например :
[Data31] - если парситься строка 3 [Data301] - если парситься строка 30 [Data331] - если парситься строка 33
Сообщение отредактировано Snow_Irbis - Вс, 24 Октября 2010, 22:57
Нб преобразовывает твой делиметр |(хотя так оно и есть) в новую строку, а значит этот символ | невидит
Добавлено (24 Октябрь 2010, 23:15) --------------------------------------------- Пробуй тоже самое, но уже вместо | ставь [#13]
Добавлено (24 Октябрь 2010, 23:17) --------------------------------------------- Надо было сразу написать, что в дебагере после парсера идет не массив, а строка, я то в дебагер заглядываю, когда ошибка или данные искажены, а в своем примере я строку загонял в листбокс, вот и не заметил
Добавлено (24 Октябрь 2010, 23:19) --------------------------------------------- ну что теперь заработало
Нб преобразовывает твой делиметр |(хотя так оно и есть) в новую строку, а значит этот символ | невидит
]Пробуй тоже самое, но уже вместо | ставь [#13]
да вот именно в этом и собака зарыта С таким кодом все как надо , при парсинге образовываеться 26 переменных [Data1]-[Data26] ( по количеству ячеек в строке )
Добавлено (24 Октябрь 2010, 23:21) ---------------------------------------------
Quote (Сергей)
Надо было сразу написать, что в дебагере после парсера идет не массив, а строка, я то в дебагер заглядываю, когда ошибка или данные искажены, а в своем примере я строку загонял в листбокс, вот и не заметил
Всякое бывает , главное что проблема решена
Quote (Сергей)
ну что теперь заработало
Да , спасибо
Сообщение отредактировано Snow_Irbis - Вс, 24 Октября 2010, 23:22
и самое смешное, я на эти грабли дважды наступал, давно было забыл, вот и втретий раз, и сразу ведь не вспомнил...старею... кстати, если будешь сохранять, НЬ вроде тоже не дает так | сохранить, то используй асси код [#124] возможно поможет
и самое смешное, я на эти грабли дважды наступал, давно было забыл, вот и втретий раз, и сразу ведь не вспомнил...старею... кстати, если будешь сохранять, НЬ вроде тоже не дает так | сохранить, то используй асси код [#124] возможно поможет
ОК , спасибо за подсказку
Добавлено (24 Октябрь 2010, 23:43) ---------------------------------------------
Quote (DEMBEL)
ну капец мозголомы...
НУ зачем же так Более красиво звучит искатели истинны
Добавлено (24 Октябрь 2010, 23:45) --------------------------------------------- DEMBEL, скоро наверное надо тему открыть по вот таким нюансам, а то на память уже не понадеятся
Сообщение отредактировано Сергей - Вс, 24 Октября 2010, 23:46
постоянно читать файл по строкам, делать файловую операцию каждый раз это может быть долго. В случае большого кол-ва данных вместо FileLen/FileRead используй FileLen/FileToVar. Один раз прочитать и парсить построчно, потом каждую строку отдельно, так быстрее будет.
Добавлено (24 Октябрь 2010, 23:50) ---------------------------------------------
Quote (Сергей)
скоро наверное надо тему открыть
да, надо faq делать уже... собрал бы кто-нибудь подобные тонкости, про знак ! в переменной (сам с ним тупил сегодня полчаса, пока не поставил), про спецсимволы... Как задавать вопросы