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

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

24.03.2019, 13:27. Показов 1697. Ответов 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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
Ответ Создать тему
Новые блоги и статьи
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru