21 / 19 / 5
Регистрация: 08.09.2011
Сообщений: 365
1

Работа с предыдущей и следующей строкой, после найденной

05.01.2018, 11:47. Показов 1735. Ответов 18
Метки нет (Все метки)

Приветствую всех, возникла такая проблема. Есть файл в котором записаны строки данных. Они разделены на блоки по 2-3-4 строки. Блоки отделены обычной пустой строкой.Я нахожу нужную мне строку , но вывести мне надо надо все строки с блоке. Т.е строки после найденной строки, до пустой и строки до найденной строки до пустой. Может кто подсказать?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 static void Main(string[] args)
        {
             StreamReader f = new StreamReader("C:\\1.tsbbs", Encoding.GetEncoding(1251));
             string s = f.ReadToEnd();
            var l = from w in s.Split('\n') select w;
            foreach (var K in l)
        
            {
                bool swith = K.StartsWith("<i><font");
                if (swith)
                {
 
                    Console.WriteLine(K);
                }
             
                  }
 
 
                Console.ReadKey();
        }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2018, 11:47
Ответы с готовыми решениями:

Выполнение следующей команды только после завершения предыдущей
Здравствуйте. При выполнении команд &quot;start winrar&quot;, &quot;copy&quot;, &quot;del&quot; в bat файле происходит следующее:...

Выбор следующей и предыдущей
pid int(1) UNSIGNED cid int(11) UNSIGNED sort int(11) UNSIGNED Зная только pid и cid, как...

Учет данных предыдущей строки в следующей
Помогите, пожалуйста, кто может. Надо на кнопку в форме посадить процедуру условия. Есть поле...

Реализация кнопки предыдущей и следующей картинки в галерее
Привет, хочу реализовать галерею. Структура бд такова: id | url | owner_id | date. Не подскажите,...

18
33 / 27 / 27
Регистрация: 23.02.2016
Сообщений: 366
05.01.2018, 14:01 2
Цитата Сообщение от салома Посмотреть сообщение
Т.е строки после найденной строки, до пустой и строки до найденной строки до пустой. Может кто подсказать?
надеюсь я не один нечего не понял :/
если еврейский способ то можно считывать все строки в массив , ищем строку в которой 0 или 1 символ , это и будет пустая строка , как нашел переходишь на следующий элемент массива и опять считываешь все до пустой строки
0
21 / 19 / 5
Регистрация: 08.09.2011
Сообщений: 365
05.01.2018, 14:12  [ТС] 3
Цитата Сообщение от Kotyara0live Посмотреть сообщение
если еврейский способ то можно считывать все строки в массив , ищем строку в которой 0 или 1 символ , это и будет пустая строка , как нашел переходишь на следующий элемент массива и опять считываешь все до пустой строки
алгоритм малость другой
объясню проще
вот массив:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
аераер
11111
 
араера
22222
аераер
ыфуаы
 
ыуаыуаыуа
ыуаераерае
3333
ераераера
 
4444
впвкпвкп
допустим я ищу строку 3333. после того как я ее нашел, мне нужно вывести 2 строки которые идут выше, строку 3333 и 1 строку, которая идет ниже. Собственно как найти строку по фильтру я уже написал, а как отсчитать от нее вверх и вниз до пустой строки я не нашел(
0
33 / 27 / 27
Регистрация: 23.02.2016
Сообщений: 366
05.01.2018, 14:30 4
элементы в массиве ?
0
Администратор
Эксперт .NET
15092 / 12160 / 4870
Регистрация: 17.03.2014
Сообщений: 24,628
Записей в блоге: 1
05.01.2018, 14:35 5
салома, прочитай весь файл в массив с помощью File.ReadAllLines и используй цикл for вместо foreach. Тогда у тебя будет индекс текущей строки от которого можно будет отступить.
0
Заблокирован
05.01.2018, 14:54 6
салома, попробуйте так -
C#
1
2
3
4
5
6
7
      foreach(var k in s.Split(new string[] { "\n\n" }, StringSplitOptions.None))
      {
        if (k.IndexOf("<i><font") >=0)
        {
          Console.WriteLine(k);
        }
      }
1
33 / 27 / 27
Регистрация: 23.02.2016
Сообщений: 366
05.01.2018, 15:16 7
просто если это массив то возьми индекс (int) +1 это нижняя , -1 это верхняя
0
Администратор
Эксперт .NET
15092 / 12160 / 4870
Регистрация: 17.03.2014
Сообщений: 24,628
Записей в блоге: 1
05.01.2018, 15:18 8
Kotyara0live, у него не массив.
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 330
05.01.2018, 15:32 9
var l = ... - это не массив получается?
0
Администратор
Эксперт .NET
15092 / 12160 / 4870
Регистрация: 17.03.2014
Сообщений: 24,628
Записей в блоге: 1
05.01.2018, 15:34 10
Fakels, нет. Это IEnumerable<string>
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 330
05.01.2018, 16:36 11
Цитата Сообщение от OwenGlendower Посмотреть сообщение
нет. Это IEnumerable<string>
Какое страшное слово)

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
         
string block = null;  // здесь будет извлеченный блок текста
string[] massive;    // сюда загрузить файл
 
for (int i = 0; i < massive.Length; i++)
{
    bool swith = massive[i].StartsWith("<i><font");
    if (swith) {
        block = GetTextBlock(massive, i);
        break;
    }
}
 
// метод получения блока, отладить от багов :)        
        string GetTextBlock(string[] massive, int find)
        {
            int count = 1, startBlock = -1;
            bool back = true;
            int i = find;
 
            while (i >= 0 && i < massive.Length)
            {
                if (back)
                    i--;
                else
                    i++;
 
                if (massive[i].Trim().Length == 0) {
                    if (startBlock == -1) {
                        startBlock = i + 1;
                        i = find;
                        back = false;
                    }
                    else {
                        count = i - startBlock;
                        break;
                    }
                }
            }
 
            return String.Join("\r\n", massive, startBlock, count);
        }
1
Администратор
Эксперт .NET
15092 / 12160 / 4870
Регистрация: 17.03.2014
Сообщений: 24,628
Записей в блоге: 1
05.01.2018, 16:45 12
Лучший ответ Сообщение было отмечено салома как решение

Решение

Fakels, зачем так сложно?
C#
1
2
3
4
5
6
7
8
9
for (int i = 0; i < massive.Length; i++)
{
    if (massive[i].StartsWith("<i><font"))
    {
        if (i > 0) Console.WriteLine(massive[i-1]);
        if (i > 1) Console.WriteLine(massive[i-2]);
        if (i+1 < massive.Length) Console.WriteLine(massive[i+1]);
    } 
}
1
21 / 19 / 5
Регистрация: 08.09.2011
Сообщений: 365
05.01.2018, 16:49  [ТС] 13
OwenGlendower, спасибо, забрал
0
Администратор
Эксперт .NET
15092 / 12160 / 4870
Регистрация: 17.03.2014
Сообщений: 24,628
Записей в блоге: 1
05.01.2018, 16:51 14
Цитата Сообщение от Fakels Посмотреть сообщение
massive
Хм.
https://en.oxforddictionaries.... on/massive
massive

noun
British
informal

A group of young people from a particular area with a common interest in dance music.
‘the Bristol massive’
Какая связь между массивом и группой молодых людей?
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 330
05.01.2018, 16:58 15
Цитата Сообщение от OwenGlendower Посмотреть сообщение
зачем так сложно?
Что-то я не понял как твоя простота извлечет блок текста из массива на индексе в минус 5 от найденного

Не по теме:

massive - люблю я это слово)

0
Администратор
Эксперт .NET
15092 / 12160 / 4870
Регистрация: 17.03.2014
Сообщений: 24,628
Записей в блоге: 1
05.01.2018, 17:01 16
Fakels, ТСу нужно две строки до текущей и одну после нее. Мой код именно это и делает. Если хочется универсализма, то можно найти предыдущую и следующуие пустые строки с помощью Array.LastIndexOf, Array.IndexOf и работать с индексами в найденном диапазоне.
1
3324 / 2367 / 1147
Регистрация: 14.08.2016
Сообщений: 7,989
05.01.2018, 17:18 17
можно еще вот так
C#
1
2
3
            var txt = File.ReadAllText(@"c:\c#\input.txt", Encoding.Default);
            var result = Regex.Match(txt, @"(?<=^|\r\n \r\n)([\w\r\n]*" + 3333 + @"[\w\r\n]*)(?=\r\n \r\n|$)");
            Console.WriteLine(result);
пример исходя из приведенного ТСом файла
вместо 3333 подставлять что нужно
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 330
05.01.2018, 17:44 18
Цитата Сообщение от OwenGlendower Посмотреть сообщение
можно найти предыдущую и следующуие пустые строки с помощью Array.LastIndexOf, Array.IndexOf
О я про них и не знал)
Т.е. Array.LastIndexOf(array, string.empty, start); вернет индекс пустой строки?
А если в пустой строке закрался пробельчик - то вернет не верный индекс)

Добавлено через 16 минут
Цитата Сообщение от Diamante Посмотреть сообщение
@"(?<=^|\r\n \r\n)([\w\r\n]*" + 3333 + @"[\w\r\n]*)(?=\r\n \r\n|$)");
Ох уж эти выражения без бутылки их не разобрать, а через пару недель можно забыть что конкретно ищет эта регулярка, и придется опять доставать бутылку).
0
3324 / 2367 / 1147
Регистрация: 14.08.2016
Сообщений: 7,989
05.01.2018, 18:01 19
зато в три строки делаеццо то, что хотел ТС,без массивов и прочих енумераблей
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2018, 18:01
Помогаю со студенческими работами здесь

Создать кнопку перехода к следующей/предыдущей форме
Добрый день! Ситуация: Создано 10 форм, в которых есть по 2 кнопки - &quot;назад&quot; и &quot;вперед&quot;. Напишите...

Сравнение строки с предыдущей строкой
Привет всем! Есть список файлов в файле file.txt 01-01.png 01-02.png 01-03.png 01-1-01.png...

Освобождение консоли для выполнения следующей команды без останова предыдущей
Приветствую всех! Собственно сабж. Имеется стенд из четырех серваков. На сиим стенде...

Удалить строки по критериям из предыдущей или следующей строки
Приветствую! Нужен совет, как можно удалить все строки кроме тех, у которых значение...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru