Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

Отображение в таблице используя разделитель "

24.03.2019, 13:27. Показов 1722. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добра друзья
Подскажите как правильно отобразить этот текст в StringGrid1 строки разные и немного криво разносит...

"Ткань мебельная "Романтика" снежная сказка 401" "нет" "03.06.2019"
"Ткань мебельная "Amadeus combi" 04" "по звонку"
"Ткань мебельная "Benelux sol" 03" "+" "вывод из складской программы"
"Ткань мебельная "Bellini" 12" "+"
"Ткань мебельная "Francheska classic" 04" "по звонку" "03.05.2019"


на фото во вложении искомый результат в таблице StringGrid
Миниатюры
Отображение в таблице используя разделитель "  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2019, 13:27
Ответы с готовыми решениями:

Получение подстрок строки, используя разделитель
предположим у меня есть текст такого вида string a="asdf;asdfa;120"; c разделителем ; и вот я хочу разделить одну строку на три...

Разбить строку на подстроки, используя разделитель
Здравствуйте! Требуется программа которая будет получать список емейлов и паролей из файла в одном виде (емейл;пароль) и сохранять в файл...

Разбить строку используя указанный разделитель
Программа ждет ввода строки неограниченной длины. Затем программа ждет ввода символа. После чего она должна разбить первую строку в...

18
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
24.03.2019, 14:34
Samrisbe, текст в такой подаче даже с минимальной ручной обработкой машинному анализу не подлежит, как мне кажется; поскольку строки спекаются в подобный винегрет...
Ткань мебельная "Романтика" снежная сказка 401нет03.06.2019
Ткань мебельная "Benelux sol" 03+вывод из складской программы

из которого вытащить требуемую информацию невозможно, на мой взгляд. Нужно менять подходы.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
24.03.2019, 14:43  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
машинному анализу не подлежит
если-б у меня был выбор...
Я сейчас пробую просто разделить опираясь на кавычки
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
24.03.2019, 17:16
Так кавычки сами по себе уже элемент структуры String. Я не большой спец по т.н. "регулярке", может быть с её помощью... .Упоминая <менять подходы> и имел ввиду оценить способ получения изначального текста; без этого судить о применимости тех или иных методов не рационально.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
24.03.2019, 17:25
Цитата Сообщение от nick42 Посмотреть сообщение
текст в такой подаче даже с минимальной ручной обработкой машинному анализу не подлежит, как мне кажется;
С чего бы? Регэксп влет разбирает:

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
#include <memory>
 
#include "RegExpr.hpp"
#include <System.IOUtils.hpp>
 
 
void __fastcall TForm1::Button7Click(TObject *Sender)
{
    std::auto_ptr<TRegExpr> re(new TRegExpr);
    re->ModifierM = true;
    re->Expression = L"\\\"[^\\\"]+\\\"([^\\\"]+)\\\"\\s+([^\\\"]+)\\\"\\s+\\\"([^\\\"]+)\\\"\\s+(\\\"[^\\\"\\n]*\\\")*\\s*$";
 
    re->Compile();
    std::auto_ptr<TStringList> lst(new TStringList);
    String s = TFile::ReadAllText(ExtractFilePath(ParamStr(0)) + "t.txt", TEncoding::Unicode);
    int row = 1;
    if (re->Exec(s))
    do
    {
        StringGrid1->Cells[0][row] = IntToStr(row);
        for(int i = 1; i < 5; i++)
        {
            StringGrid1->Cells[i][row] = re->Match[i];
        }
        row += 1;
 
    } while (re->ExecNext());
}
(файл сохранен в кодировке Unicode, если что, не UTF8, тестировалось на XE4), вот результат:
Миниатюры
Отображение в таблице используя разделитель "  
3
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
24.03.2019, 19:30  [ТС]
Нельзя просто считывать в StringGrid1 относительно разделителя " ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
24.03.2019, 19:35
Нет, нельзя. То есть, совсем нельзя в Дельфи/Билдере, хотя тот же Лазарус это делает из коробки, если кавычки правильно расположены.
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
24.03.2019, 19:38  [ТС]
Или может на стадии считывания с Excelя разносить в StringGrid1 ?
где-то здесь:
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
Variant app, books, book, sheet;
    int MaxR, MaxC, BeginR, BeginC;
    BeginR = 3, BeginC = 1;
    app = CreateOleObject("Excel.Application");
    books = app.OlePropertyGet("Workbooks");
    books.OleFunction("Open", WideString(OpenDialog1->FileName));
    book = books.OlePropertyGet("item", 1);
    sheet = book.OlePropertyGet("WorkSheets", 1);
    MaxR = sheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
    MaxC = sheet.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
    String s_grd = "";
    //Перебираю строки Excel
    for(int i = BeginR; i <= MaxR; i++)
      {
      for(int j = BeginC; j <= MaxC; j++)
        {
        String s = sheet.OlePropertyGet("Cells").OlePropertyGet("Item", i, j).OlePropertyGet("Value");
        if(s.Trim().Length() == 0)
          {
          s_grd += "";
          }
          else
            {
         // s_grd += String().sprintf("\"%s\" ", s);
            s_grd += String().sprintf(L"\"%s\" ", s);
            }
         }
         // добавляю строчку в Стринглист
         word->Append(s_grd);
         s_grd = "";
      }
    // закрываю Excel
    app.OleProcedure("Quit");
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
24.03.2019, 19:40
Лучше бы ты показал, как XLS-файл выглядит.
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
24.03.2019, 19:44  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
тестировалось на XE4
у меня 2010 билдер
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
24.03.2019, 19:46
В 2010-ом уже есть все те же библиотеки, если что. А RegExpr.pas - вообще можно подключать, начиная с BCB6.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
24.03.2019, 19:47  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Лучше бы ты показал, как XLS-файл выглядит.
на фото скрин Excel
Миниатюры
Отображение в таблице используя разделитель "  
0
65 / 31 / 18
Регистрация: 16.03.2019
Сообщений: 84
25.03.2019, 06:37
Насколько я понял, проблемы только с первым столбцом XLS-файла, в том, что в каждой ячейке есть часть строки, которую нужно игнорировать, затем часть, которая должна пойти в 1-й столбец (то что в кавычках), затем оставшаяся часть - во 2-й столбец.
Тогда, наверно, наиболее рационально разобрать строки при чтении из XLS файла, в цикле столбцов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
String s = ....
if(j == BeginC)
{// первый столбец
  String s1;
  String s2;
  ... Здесь разбираем "s" одним из способов
  s_grd += String().sprintf(L"\"%s\" ", s1);
  s_grd += String().sprintf(L"\"%s\" ", s2);
}
else
{//остальные столбцы
.....
  s_grd += String().sprintf(L"\"%s\" ", s);
}
Можно просто перебрать символы строки, считая кавычки - то, что до первых кавычек - игнорируем,
после первых - складываем в s1, после вторых - складываем в s2. Если количество кавычек получилось не равное 2-м - отметить эту ячейку, выдать сообщение об ошибке или что-то другое сделать.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
25.03.2019, 08:26  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
В 2010-ом уже есть все те же библиотеки, если что. А RegExpr.pas
Этот вариант тоже попробую установить, почитал про RegExpr.pas из Вашей ссылки штука полезная на будущее

Добавлено через 1 минуту
Цитата Сообщение от Ctty Посмотреть сообщение
Можно просто перебрать символы строки, считая кавычки
кавычки не удобный разделитель...
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
25.03.2019, 20:54  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
файл сохранен в кодировке Unicode, если что, не UTF8, тестировалось на XE4
вот на эту строчку ошибку выдает:
C++
1
    String s = TFile::ReadAllText(ExtractFilePath(ParamStr(0)) + "ostatki//word.txt", TEncoding::Unicode);
ошибка:
C++
1
2
3
4
5
6
[BCC32 Error] Unit20.cpp(116): E2090 Qualifier 'TFile' is not a class or namespace name
  Full parser context
    Unit20.cpp(39): parsing: void _fastcall TForm20::SpeedButton5Click(TObject *)
[BCC32 Error] Unit20.cpp(116): E2141 Declaration syntax error
  Full parser context
    Unit20.cpp(39): parsing: void _fastcall TForm20::SpeedButton5Click(TObject *)
Добавлено через 1 минуту
из StringListа на прямую в String s нельзя передать или через файл можно Юникод задать тексту, немного не догоняю...

Добавлено через 2 минуты
еще не подключается:
C++
1
#include <System.IOUtils.hpp>
ошибка:
C++
1
[BCC32 Error] Unit20.cpp(9): E2209 Unable to open include file 'System.IOUtils.hpp'
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
25.03.2019, 21:06
У тебя какая-то очень странная версия. Посмотрел свой старый проект с 2010 Билдера - нормально все подключалось. Вот тут тоже было про эту жесть, попробуй использовать просто IOUtils.hpp.
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
25.03.2019, 22:22  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
нормально все подключалось. Вот тут тоже было про эту жесть, попробуй использовать просто IOUtils.hpp
Спасибо что не поленился ! Все отладил, один момент еще спать не дает, с ручным выставлением юникода в файле тхт, только остался может есть способ при сохранении StringLista как-то задать юникод?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
25.03.2019, 23:15
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Цитата Сообщение от Samrisbe Посмотреть сообщение
при сохранении StringLista как-то задать юникод?
Вот так:
C++
1
    lst->SaveToFile(fname, TEncoding::Unicode);
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
26.03.2019, 08:20  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Вот так:
Спасибо огромное, вопрос мой решен очень достойно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.03.2019, 08:20
Помогаю со студенческими работами здесь

Разделить массив, используя подмассив как разделитель
Есть массив Byte или List&lt;Byte&gt; . Мне нужно разделить этот массив на два, используя как разделитель мою последовательнойсть байт, а именно...

Разделить строку на подстроки, используя символ-разделитель
есть вот такой текст 123:456;789;321 нужно чтобы в едит1 было 123, в едит2 456, в 3 - 789, в 4 - 321 помогите мне

Разбить строку на слова, используя разделитель - заглавную букву
Доброго времени суток. Есть строки вида: TheQuickBrownFoxJumpsOverTheLazyDog. Как преобразовать такие строки к виду: The Quick Brown...

Как разбить строку символов используя один разделитель.
Как разбить строку символов используя один разделитель. Например: Dim strTest As string Dim strTest_1 As string Dim strTest_2 As...

Как разбить строку символов используя один разделитель
Как разбить строку символов используя один разделитель. Например: Dim strTest As string Dim strTest_1 As string Dim strTest_2 As...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru