Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925

Поиск по тексту подобие таблицы

06.07.2022, 13:04. Показов 2749. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем дня.
Есть отчёт в виде строки формата *.sup, его преобразую через
C#
1
            string s = System.IO.File.ReadAllText(str_fileNeame, Encoding.Default);
с последующей записью в word файл.
В данном отчёте отчёте результаты представлены в виде вот таких таблиц

Сводная таблица нагрузок
======================================== ======================================== ==
N опоры тип Сечение Расч. FX FY FZ DX DY DZ
(узел) опоры -------(силы, кН)-------- --(смещения,мм)--
======================================== ======================================== ==
(вставляя сюда всё равно сдвинулось)

Как задать поиск по тексту заголовка такой таблицы?
В голове только такой подход.
Паттерн ======(перенос)
любой символ(перенос)
любой символ(перенос)
=======(перенос)

Может есть что-то другое, какой то другой подход?

Буду признателен за помощь.
Миниатюры
Поиск по тексту подобие таблицы  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.07.2022, 13:04
Ответы с готовыми решениями:

Поиск по тексту
Нужно организовать поиск в richTextBox с помощью кнопки "Найти далее". Чтобы находило первое вхождение, потом по нажатию на кнопку второе...

Поиск по тексту
Привет всем Пишу парсер на c#. Сам новичок В общем, нужно выполнить поиск по исходному коду страницы и найти ссылки оканчивающиеся на,...

Поиск по тексту
Здраствуйте. Хотелось бы поинтересоваться, можно ли канибуть програмно организоать поиск отдельных слов в тексте. И по возможности если...

25
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
06.07.2022, 14:27
Лучший ответ Сообщение было отмечено proft как решение

Решение

Цитата Сообщение от proft Посмотреть сообщение
Может есть что-то другое, какой то другой подход?
Всё что после заголовка парсить по пробелам в объекты, ну а дальше как обычно обрабатывать.

Добавлено через 5 минут
Сначала разберём на подстроки
C#
1
List<string> list = line.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).ToList();
где line - очередная строка в файле.
Далее массив подстрок надо преобразовать в объект, тут Вам виднее, где что и как.
1
 Аватар для roach1967
984 / 464 / 234
Регистрация: 27.06.2014
Сообщений: 1,035
06.07.2022, 14:41
proft, можно, действительно, искать по строкам с большим количеством символов "=". Заголовки столбцов и сами данные можно определить по соотношению пробелов и слов - в обычном тексте их количество может отличаться на +-1..2. В таблице пробелов много больше слов...
1
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
06.07.2022, 15:36  [ТС]
Спасибо. Да я так и делал.
C#
1
string[] parts = s.Split('\n');
.
У вас в список запись выполняется , вроде так?!

Добавлено через 32 секунды
Ага. Скорее всего

Добавлено через 24 секунды
roach1967, ага скорее всего.

Добавлено через 1 минуту
Цитата Сообщение от Uswer Посмотреть сообщение
Всё что после заголовка парсить по пробелам в объекты, ну а дальше как обычно обрабатывать.
Спасибо. Да я вроде примерно так и делал.
C#
1
string[] parts = s.Split('\n');
Цитата Сообщение от roach1967 Посмотреть сообщение
proft, можно, действительно, искать по строкам с большим количеством символов "=". Заголовки столбцов и сами данные можно определить по соотношению пробелов и слов - в обычном тексте их количество может отличаться на +-1..2. В таблице пробелов много больше слов...
Спасибо.
Ага. Скорее всего
0
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
07.07.2022, 16:07  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
List<string> list = line.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).T oList();
Можете подсказать?
Извлёк из файла sup данные
C#
1
string s = System.IO.File.ReadAllText(str_fileNeame, Encoding.Default);
Пытаюсь каждую строку поместить в массив/список.
C#
1
string[] parts = s.Split('\n');
и так пробовал
C#
1
List<string> list = line.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries).ToList();
Пытался
C#
1
[CSHARP]string[] parts = s.Split('\r');
[/CSHARP]
В итоге, если выводить с консоль добавляется пустая строка между выводимыми строками.

Откуда эта пустая строка появляется и как от неё избавиться?
Миниатюры
Поиск по тексту подобие таблицы   Поиск по тексту подобие таблицы  
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
07.07.2022, 22:18
proft, скинь фрагмент этого файла, но обязательно с заголовком и несколькими разношёрстными строками.

Добавлено через 15 минут
Похоже, что парсить придётся не совсем стандартным образом, но алгоритм прослеживается.
1
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
08.07.2022, 14:31  [ТС]
Uswer, Спасибо за отклик!
Вроде получилось.
C#
1
List<string> list = s.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).ToList();
Uswer, как пропарсить уже получившийся список таким образом, чтобы проверять по условию
строка =============
следующая символы любые
следующая символы любые
строка ==============

Рассмотреть в качестве цикла, где ii элемент списка и по условию
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
            for (int ii = 0; ii < list.Count; ii++)
            {
                if (Regex.IsMatch(parts[ii], @"(==*==)", RegexOptions.IgnoreCase))
                {
                    if (Regex.IsMatch(parts[ii + 1], @"[a-zA-Z0-9]", RegexOptions.IgnoreCase))
                    {
                        if (Regex.IsMatch(parts[ii + 2], @"[a-zA-Z0-9]", RegexOptions.IgnoreCase))
                        {
                            if (Regex.IsMatch(parts[ii + 3], @"(==*==)", RegexOptions.IgnoreCase))
                            {
 
 
                                Console.WriteLine(parts[ii]);
                                Console.WriteLine(parts[ii + 1]);
                                Console.WriteLine(parts[ii + 2]);
                                Console.WriteLine(parts[ii + 3]);
 
                            }
 
                        }
 
                    }
                        
                }
               // Console.WriteLine(list[ii]); 
 
            }
Но не выдаёт нужное сочетание.
Где то в этой строке косяк
C#
1
                    if (Regex.IsMatch(parts[ii + 1], @"[a-zA-Z0-9]", RegexOptions.IgnoreCase))
ДА и целом подход корявый, как мне кажется, через
C#
1
if
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
08.07.2022, 14:43
proft, вот Вы упрямый человек! Я же просил "скинь фрагмент этого файла" наверное не просто так. Я хотел показать примерный подход к парсингу, но для этого мне нужно чётко представлять структуру исходных данных. Если Вы опасаетесь какой-то утечки информации, то скиньте мне в личку. И весь файл мне не нужен, нужны только заголовок и несколько строк с разным содержанием (т.е. разными Режимами).
0
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
09.07.2022, 09:12  [ТС]
Uswer, ок. Скину сегодня)
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4359 / 3429 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
09.07.2022, 11:35
proft, а почему не использовать IO.File.ReadAllLines и получать сразу массив всех строк, и с ним уже работать(делать разбор на подстроки и т.д ) вместо IO.File.ReadAllText
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
09.07.2022, 14:56
Yury Komar, так и будет - немного терпения.
0
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
09.07.2022, 21:00  [ТС]
Сам файл

Добавлено через 55 секунд
оп, сек...в архив засуну
0
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
09.07.2022, 21:01  [ТС]
файл
Вложения
Тип файла: 7z PJB002.7z (29.7 Кб, 14 просмотров)
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
10.07.2022, 02:17
Лучший ответ Сообщение было отмечено proft как решение

Решение

Так, а теперь давайте чётко сформулируем задачу, а то я не совсем понимаю. Вам нужно находить начало и конец заголовков таблиц? Допустим нашли, дальше что?

Добавлено через 1 час 22 минуты
Просто нахожу начало и конец заголовков, на форме кнопка LoadButton, listBox1 и openFileDialog1.
Кликните здесь для просмотра всего текста
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.ComponentModel;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
 
namespace propApp
{
    public enum Rubric
    {
        HeaderBegin,
        HeaderEnd,
        OtherText
    }
 
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
 
        private void LoadButton_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                listBox1.Items.Clear();
 
                Rubric r = Rubric.OtherText; //маркер типа текста (начала и конца заголовка или просто текста)
                int i = 0; //счётчик строк
                const int maxDistance = 2;//максимальное удаление конца заголовка от начала в строках
                int distance = 0; //текущее удаление конца заголовка от начала в строках
                string beginStr = ""; //инфа о начале заголовка
 
                StreamReader f = new StreamReader(openFileDialog1.FileName);
                while (!f.EndOfStream)
                {
                    i++;
                    string s = f.ReadLine();
                    if (MarkerPresent(s)) //если строка содержит признаки начала или конца заголовка
                    {
                        if (r == Rubric.HeaderBegin &&
                            distance <= maxDistance) //если ранее было обнаружено начало заголовка
                        {
                            r = Rubric.HeaderEnd; //помечаем как конец заголовка
                            listBox1.Items.Add(beginStr);
                            listBox1.Items.Add("конец заголовка - строка:" + i);
                        }
                        else
                        {
                            r = Rubric.HeaderBegin; //помечаем как начало заголовка
                            beginStr="начало заголовка - строка:" + i;
                            distance = 0; //сбрасываем отсчёт удаления конца заголовка
                        }
                    }
                    else
                    {
                        distance++;
                    }
                    // что-нибудь делаем с прочитанной строкой s
                }
                f.Close();
                listBox1.Items.Add("Done");
            }
        }
 
        private bool MarkerPresent(string s)
        {
            return Regex.IsMatch(s, @"(==*==)", RegexOptions.IgnoreCase);
        }
    }
}
0
126 / 94 / 34
Регистрация: 24.06.2022
Сообщений: 253
10.07.2022, 09:09
Цитата Сообщение от proft Посмотреть сообщение
Есть отчёт в виде строки формата *.sup
а что такое .sup ?
дайте описание формата.
Цитата Сообщение от proft Посмотреть сообщение
Как задать поиск по тексту заголовка такой таблицы?
что это значит ?
какой таблицы ?
в файле который представили 200 таблиц насчитал и бросил.
их там может 500.
о какой таблице речь ?

Цитата Сообщение от proft Посмотреть сообщение
с последующей записью в word файл.

Не по теме:

тут создание нехилого ПО намечается. слежу за темой )

0
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
13.07.2022, 11:38  [ТС]
Uswer, спасибо. Буду разбираться в коде.
0
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
04.08.2022, 12:46  [ТС]
Uswer, доброго времени суток. Подскажите, каким образом найденные строки, (там 4 строки) отдельно записать и в последующем использовать в качестве паттерна. Спасибо.
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
04.08.2022, 17:35
Цитата Сообщение от proft Посмотреть сообщение
каким образом найденные строки, (там 4 строки) отдельно записать и в последующем использовать
Имеете ввиду как запомнить заголовки таблиц?
Если ДА, то нужно понимание как Вы работаете с данными. Мне видится, что при чтении файла следует определять тип считываемой таблицы и преобразовывать всё в объекты DataTable, ну или ещё какие нибудь объекты. Например, можно создать такой класс (схематический код):
Code
1
2
3
4
5
public class WriteTable
{
    string[] Header = new string[]();
    List<string> Data = new List<string>;
}
Здесь Header это набор строк "шапки" таблицы в результирующем файле, а Data это набор строк данных в таблице. Однако лучше всего хранить не строковые данные, а наборы объектов, ведь Вы как-то данные анализируете и, возможно, изменяете.
0
321 / 289 / 104
Регистрация: 12.04.2011
Сообщений: 925
04.08.2022, 17:44  [ТС]
Да. Заголовок таблиц, это же по сути 4 строки.
0
126 / 94 / 34
Регистрация: 24.06.2022
Сообщений: 253
05.08.2022, 04:45
Цитата Сообщение от proft Посмотреть сообщение
Заголовок таблиц, это же по сути 4 строки
proft, по моему скромному мнению,
шапки таблиц парсить не нужно. нужно извлекать данные, содержимое таблиц.
Записи в таблице (где-то это одна строка, где-то несколько) опишите в виде классов.
Столбец таблицы это свойство в классе.
Цитата Сообщение от proft Посмотреть сообщение
найденные строки, (там 4 строки) отдельно записать и в последующем использовать в качестве паттерна
Что-то сложное придумываете, когда собрали данные обращайтесь к свойствам, не нужны никакие паттерны.

Добавлено через ...
Чтобы вытащить данные для одной таблицы, думаю нужно так:

Найти название таблицы, название это вот ">>> Оценка нагрузок на опоры трубоп ...."
Дальше найти верхнюю границу таблицы "=======" ,
Если нашли, то что внутри шапки не трогаем, продолжаем поиск.
Ищем нижнюю границу шапки таблицы.
В случае успеха, переходим к содержимому и парсим содержимое.
Парсим и если встретилась нижняя граница таблицы,
значит таблица успешно опознана и данные извлечены.

То есть получается автомат
с четырьмя состояниями

Title - состояние название таблицы
Header - состояние шапка
Content - состояние содержимое таблицы
End - состояние конец таблицы

... Нет, с пятью
Пятое состояние Error - состояние ошибки.
К нему возможен переход из любого другого состояния.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2022, 04:45
Помогаю со студенческими работами здесь

Поиск по тексту
Задача поискать в большом тексте определённое слова или отравок текста. практически во всех языках есть фенкцим которые могут указать...

поиск по тексту
Привет всем. У меня такая задач. Нужно было разобрать файл, обработать его(вытащить из него нужное) и записать в др файл(с этими задачами ...

Поиск по тексту
Привет, помогите нубу, пожалуйста) Надо выполнить поиск по тексту но что бы он проходил по такому алгоритму: Я ввожу 2 фразы :начало и...

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

Поиск по тексту
Вопрос как организовать поиск по тексту. предположим текст в документе разделён на строки Я могу искать подстраку в строке. Но...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru