Как обработать этот текст блок за блоком?

Я хочу обрабатывать данные по блокам отдельно

Вот текст:

[Глобальный]
asd
dsa
akl
ASd

[Тест2]
bnmnb
hkhjk
Цуци
Цуци
Цитци

[Тест3]
5675
46546< br/> 464
564
56456
45645654
4565464

[другое]
sdfsd
dsf
sdf
dsfs

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

private void textprocessing(string filename)
{
    using (StreamReader sr1 = new StreamReader(filename))
    {
        string linetemp = "";
        bool found = false;
        int index = 0;

        while ((linetemp=sr1.ReadLine())!=null)
        {
            if (found==true)
            {
                MessageBox.Show(linetemp);
                break;   
            }

            if (linetemp.Contains("["))
            {
                found = true;
            }
            else
            {
                found = false;
            }                                                             
        }                                    
    }          
}

person Laszlo BOZSAR    schedule 02.08.2017    source источник
comment
это файл .ini? stackoverflow.com/questions/217902/reading-writing-an -ini-файл   -  person Slai    schedule 02.08.2017


Ответы (2)


Вы можете использовать string.Split() для разделения строк на основе "[", а затем разделить их на основе новых строк. Затем вы проверяете наличие "]"

void Main()
{
    string txt = @"[Global]
asd
dsa
akl
ASd

[Test2]
bnmnb
hkhjk
tzutzi
Tzutzi
Tzitzi

[Test3]
5675
46546
464
564
56456
45645654
4565464

[other]
sdfsd
dsf
sdf
dsfs";

    string[] split = txt.Split('[');
    foreach(var s in split)
    {
        var subsplits = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
        Console.WriteLine(subsplits[0]);
        foreach(var ss in subsplits)
        {
            if(!ss.Contains("]"))
                Console.WriteLine(ss);
        }
    }
}

Это выводит

asd
dsa
akl
ASd


bnmnb
hkhjk
tzutzi
Tzutzi
Tzitzi


5675
46546
464
564
56456
45645654
4565464


sdfsd
dsf
sdf
dsfs

Вы можете добавить дополнительную проверку, чтобы проверить, является ли это пустой строкой, и игнорировать ее.

person Stuart    schedule 02.08.2017
comment
Это хорошее решение, но я хочу решить его с помощью цикла и без встроенной функции, такой как разделение, вы можете мне помочь? - person Laszlo BOZSAR; 02.08.2017

Вот один подход:

private void ReadFile()
{
    //load all  lines
    var lines = File.ReadAllLines(@"c:\temp\file.txt").ToList().;
    //remove empty lines
    lines = lines.Where(l => l.Trim().Length > 0).ToList();
    //mark indexes where sections start
    var sectionIndexes = lines
        .Where(l => l.StartsWith("[") && l.EndsWith("]"))
        .Select(l => lines.IndexOf(l)).ToList();

    //now make list of tuples. Each tuple contains start of section (Item1) and last line of section (Item2)
    var sections = Enumerable.Zip(sectionIndexes, sectionIndexes.Skip(1), (a, b) => new Tuple<int, int>(a, b-1)).ToList();

    //for each tuple (each section)
    foreach (var item in sections)
    {
        //process section name (line with raound brackets
        ProcessSection(lines[item.Item1], lines.Where(l => lines.IndexOf(l) > item.Item1 && lines.IndexOf(l) <= item.Item2));
    }
}

private void ProcessSection(string sectionName, IEnumerable<string> lines)
{
    Console.WriteLine("this is section {0} with following lines: {1}", sectionName, string.Join(", ", lines.ToArray()));
}

вывод метода ProcessSection будет:

this is section [Global] with following lines: asd, dsa, akl, ASd
this is section [Test2] with following lines: bnmnb, hkhjk, tzutzi, Tzutzi, Tzitzi
this is section [Test3] with following lines: 5675, 46546, 464, 564, 56456, 45645654, 4565464

Это довольно быстрое и грязное решение, но его будет достаточно, если файл, который вы читаете, небольшой.

Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.

person Nino    schedule 02.08.2017