Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Почемучка)
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
1

Выборка строк с TStringList

30.06.2016, 12:37. Показов 2244. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Вопрос простой, да и сам знаю ответ - но может кто посоветует альтернативное решение и более практичное.
Есть множество строк в Memo с определенной структурой .
Хочу вытянуть пару Combobox ов и сделать выборку из текста с последующим его выводом в Memo
Самое просто решение регулярки.
Пример строк
Кликните здесь для просмотра всего текста
Код
#Постоянное слово:  имя1
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово:  имя2
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово:  имя3
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово:  имя4
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово:  имя5
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово:  имя6
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,720p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка
#Постоянное слово под номером 2: ,360p_
ссылка

Вот и хочу сделать в комбобокс вывести все #Постоянное слово: имя#
А в другой комбобокс вывести 360/720/1080/480
и при выборе в комбобоксе загружалась бы определенная структура
К примеру первый комбобокс - Имя2 и второй комбобокс - 480p
в Итоге в Memo
Кликните здесь для просмотра всего текста

Код
#Постоянное слово:  имя2
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка
#Постоянное слово под номером 2: ,480p_
ссылка


Может кто подскажет решение практичное и красивое?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2016, 12:37
Ответы с готовыми решениями:

Случайное перемещение строк в TStringList
Как в TStringList перетасовать строки случайным образом?

Splash screen, удаление строк в TStringList
При старте программы вылазит SplashScreen, проверяет файлы на существование. Пути к файлам...

Альтернатива TStringList (проблемы с загрузкой большого кол-ва строк)
Доброго времени суток. Столкнулся с такой проблемой: есть конвертер координат из системы в систему,...

E2034 Cannot convert 'TStringList' to 'TStringList *'
Всем привет! Пытаюсь сделать так чтобы можно было выбрать неограниченное количество файлов, но...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
30.06.2016, 12:49 2
Перечитал 2 раза - ничего не понял. "постоянное слово", "постоянное слово", "постоянное слово", "ссылка", "ссылка", "ссылка" ... Смысл поста за этим теряется. Ты бы хоть заменил все эти "постоянное слово" и "ссылка" на что-то нормальное: яблоки, бананы, кукурузу, и тогда написал бы, что есть, и что нужно получить...
1
Почемучка)
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
30.06.2016, 13:19  [ТС] 3
Вот пример файла
Хочу в комбобокс получить слово (название) что после #EXTGRP: и во второй комбобокс 4 или 5 символа ( качество ) после #EXTINF:-1,
это просто .
Но хочу и сделать выборку если выбираю Игра престолов. Сезон 6 (BaibaKo) и качество 720p что бы получилось :
Код
#EXTGRP: Игра престолов. Сезон 6 (BaibaKo)
#EXTINF:-1,720p_Game.of.Thrones.s06e01.mp4
ссылка на видео 
#EXTINF:-1,720p_Game.of.Thrones.s06e02.mp4
ссылка на видео 
#EXTINF:-1,720p_Game.of.Thrones.s06e03.mp4
ссылка на видео 
#EXTINF:-1,720p_Game.of.Thrones.s06e04.mp4
ссылка на видео
Вложения
Тип файла: txt Игра престолов. Сезон 6.txt (11.3 Кб, 6 просмотров)
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.06.2016, 13:53 4
Элементарнейше решается регулярными выражениями
Код
^#EXTINF:-1,(\d{3})p_Game.of.Thrones.s0(\d)e(\d{2}).mp4$
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
30.06.2016, 13:57 5
Цитата Сообщение от Maluda Посмотреть сообщение
Элементарнейше решается регулярными выражениями
Топикстартер, вроде как, это и сам знает:
Цитата Сообщение от Ddv122 Посмотреть сообщение
Самое просто решение регулярки
0
Почемучка)
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
30.06.2016, 14:15  [ТС] 6
Maluda, заполнение Combobox я сделал при формировании плейлиста. Имена ( переводы) и качества
Выборка осталось - я то понимаю как её сделать, но это получится громоздким решением с использованием и регулярок и поиском по тексту с установкой "границ" . Вот и стало интересно - как можно сделать и компактно и красиво
Это то одна беда - но вот и качества у разных озвучек разные бывают , рамки особо не установить (480/360/720/1080)
одна озвучка может макс в 360/480 быть ... а другая и 720/480/360
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
30.06.2016, 14:34 7
Лучший ответ Сообщение было отмечено Ddv122 как решение

Решение

Ddv122, я бы сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// тут заполняю комбобокс названиями фильмов + сами ссылки идут в Objects
void __fastcall TForm1::btnPrepare(TObject *Sender)
{
    String title;
    std::auto_ptr<TStringList>lst(new TStringList);
 
    for (int i = 0; i < Memo4->Lines->Count; i++)
    {
        if (StartsWith(Memo4->Lines->Strings[i], "#EXTGRP:"))
        {
            title = Memo4->Lines->Strings[i].Delete(1, 8);
            i += 1;
            lst->Clear();
            while (i < Memo4->Lines->Count && !StartsWith(Memo4->Lines->Strings[i], "#EXTGRP:"))
            {
                String st = Memo4->Lines->Strings[i];
                lst->Add(Memo4->Lines->Strings[i]);
                i += 1;
            }
 
            ComboBox4->Items->AddObject(title, new TStringStream(lst->Text, TEncoding::Unicode, true));
            i -= 1;
        }
    }
}
 
// а тут уже по выбранным в комбобоксах названию и качеству выбираю из Objects нужные ссылки:
void __fastcall TForm1::btnFind(TObject *Sender)
{
    std::auto_ptr<TRegExpr>re(new TRegExpr);
    re->Expression =
        String().sprintf(L"#EXTINF:-1,%sp.[^\\r]*?\\r\\n[^\\r]*?\\r\\n",
        ComboBox5->Text);
 
    re->ModifierM = true;
    re->Compile();
 
    if (re->Exec(dynamic_cast<TStringStream*>
        (ComboBox4->Items->Objects[ComboBox4->ItemIndex])->DataString))
        do
        {
            Memo5->Lines->Add(re->Match[0]);
        }
        while (re->ExecNext());
}
(XE2, юникодный проект, только что проверял, работает прекрасно. Единственное - нужно освобождать объекты из ComboBox-а, пройди циклом и просто вызови delete для каждого из Objects)
1
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.06.2016, 14:53 8
Лучший ответ Сообщение было отмечено Ddv122 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <memory>
#include <boost/regex.hpp>
 
bool MatchesExtInfo(const UnicodeString &sText, TTreeView *ATree, TTreeNode *ACompanyNode) {
    if (!ACompanyNode)
        return false;
 
    boost::wregex e(L"^#EXTINF:-1,(\\d+)p_[^\\d]*[sS](\\d{2})[eE](\\d{2})[^\\d]*.mp4$");
    boost::wsmatch what;
 
    std::wstring wstr = sText.c_str();
    if (boost::regex_match(wstr, what, e)) {
        if (what.size() == 4) {
 
            TTreeNode *AEpisodeNode = ATree->Items->AddChild(ACompanyNode, UnicodeString().sprintf(L"Season=%s,Episode=%s,Quality=%s",
                std::wstring(what[2]).c_str(), std::wstring(what[3]).c_str(), std::wstring(what[1]).c_str()));
 
            return true;
        }
    }
    return false;
}
 
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender) {
    std::auto_ptr<TStringList>AStringList(new TStringList());
    AStringList->LoadFromFile("c:\\...\\Игра престолов. Сезон 6.txt");
    AStringList->NameValueSeparator = L':';
 
    TTreeNode *ACompanyNode = 0;
 
    for (int i = 0; i < AStringList->Count; i++) {
        if (AStringList->Names[i] == L"#EXTGRP") {
            ACompanyNode = TreeView1->Items->AddChild(0, AStringList->ValueFromIndex[i]);
        }
        else if (AStringList->Names[i] == L"#EXTINF") {
            if (!MatchesExtInfo(AStringList->Strings[i], TreeView1, ACompanyNode)) {
                throw Exception("Something wrong with parsing!");
            }
        }
    }
}
Миниатюры
Выборка строк с TStringList  
1
Почемучка)
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
30.06.2016, 15:12  [ТС] 9
Спасибо за подсказки : я понял ваши идеи.
У меня к сожалению BCB6 .
Не StartsWith не boost нету .
Пора наверное менять эту древность . Но проекты как то крупные по размеру на XE получается.

Всем спасибо за помощь
0
30.06.2016, 15:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2016, 15:12
Помогаю со студенческими работами здесь

Добавление строк в TStringList и нахождение количества одинаковых строк
Задача такова: 1) Добавить несколько строк с текстом 2) Определить кол-во одинак.строк (при чем...

Выборка задолженностей по таблице (выборка строк с пустыми ячейкам даты оплаты) для отчета
Имеется таблица учета продаж, в ней нужно сделать выборку по дате оплаты для ежемесячного отчета....

Сравнение строк в нескольких TStringList
Помогите осуществить задачу. Есть массив листов userSL . Нужно сравнить строки всех стринглистов и...

Как разбить TStringList на части по 15 строк?
Как разбить TStringList на части по 15 строк? Вот так вот вроде пашет но оно показывает только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru