C# Wczytywanie tekstu z pliku od stringa do stringa

0

Witam,
Chcę żeby z wczytywało mi tekst z pliku pomiędzy "START" a "END" problem w tym że do tych stringów są jeszcze dodane inne teksty np. "START 29" , "END 29" i w tym momencie porównanie na niewiele się zdaje, dodatkowo nie wiem jak zrobić żeby po jakimś znaku w tym stringu reszta została przypisana do innej zmiennej.


            int counter = 0;
            string lines;

            StreamReader file =
            new StreamReader(pathLoadFile);

            while ((lines = file.ReadLine()) == "START")
                counter++;

            for (int i = 0; i < counter; i++)
            {


                using (StreamReader sr = new StreamReader(pathLoadFile))
                {

                    var linesTabName = File.ReadLines(pathLoadFile)
                    .TakeWhile(nameLine => nameLine != "START")
                    .TakeWhile(nameLine => nameLine != "END")
                    .Skip(1);

                    foreach (var item in nameLine)
                    {
                        RichTextBox1.Text += nameLine + Environment.NewLine;

                    }

0
var start = "START";
var testString = "AAA AA START ASD START 23 END 23 END ASDF";
            
var textAfterStart = testString.Substring(testString.IndexOf(start) +start.Length);
var result = textAfterStart.Substring(0, textAfterStart.LastIndexOf("END"));

Output: " ASD START 23 END 23 "

Co do drugiej części pytania, pokaż jakiś przykład stringa i co ma trafić do zmiennej

0

Chcę mniej więcej zrobić coś takiego:

title

0

Coś takiego? (bazowałem na screenie)

http://rextester.com/GXHDU19565

Co do zabawy z tymi zmiennymi, próbowałem szukać jak odwoływać się do zmiennej podając jej nazwę jako string, ale jest chyba łatwiejszy sposób: słownik

https://www.dotnetperls.com/dictionary

//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Dictionary<string, string> dictionary = new Dictionary<string, string>();
            
            string[] texts = new string[9];
            
            texts[0] = "START line: zmienna1";
            texts[1] = "_______________wartosc____________";
            texts[2] = "END";
            
            texts[3] = "START line: zmienna2";
            texts[4] = "____________________wartosc2____________";
            texts[5] = "END";
            
            texts[6] = "START line: zmienna3";
            texts[7] = " ";
            texts[8] = "END";
            
            
            string variableName="";
            bool readingValue = false;
            
            foreach (var text in texts)
            {
                if (text.Contains("START line: "))
                {
                    variableName = text.Split(new string[] {": "}, StringSplitOptions.None)[1];
                    readingValue = true;
                }
                else if (readingValue && !string.IsNullOrEmpty(text))
                {
                    dictionary.Add(variableName, text);
                    readingValue = false;
                }
            }
            
            foreach (var c in dictionary)
            {
                Console.WriteLine(c);
            }
        }
    }
}

Output:

[zmienna1, _______________wartosc____________]
[zmienna2, ____________________wartosc2____________]
[zmienna3,  ] /// sama spacja, bo tak wprowadziłem
0

Up tak nie można bo tekst niżej może zawierać ""START line: ", nie wykrywasz też END line. Jeśli format danych nie jest jakiś specyficzny i nie pozwala się łatwo odczytać jakimś sprytnym sposobem. Zrób to najzwyczajniej w świecie iterując literka po literce i szukając wzorca lub analogicznie korzystają z gotowych metod np. dla stringów. Problemu nawiasowania ( \\start key to (, \\end key to ) ) nie rozwiążesz inaczej.

1

Ale ten format i tak jest jakiś dziwny. Przecież mogę mieć do wczytania np.

START line: test
blablabla...
START line: test
END line: test
// START line: test2
blablabla....
// START line: test2
//END line: test2
blablabal....
//END line: test2
//END line: test2
END line: test

I teraz skąd wiadomo co jest co ?
Tutaj głównym problemem jest format przechowywanych danych. Te dane trzeba w pliku w inny - jednoznacznie określony - sposób przechowywać.
Dam przykład:

Format pliku binarnego:

[HEADER] 	  Unikalny nagłówek pliku { 4 bajty }
[VERSION]     Wersja pliku			  { 4 bajty }
[FILE_SIZE]   Rozmar całego pliku     { 4 bajty }
[ROW]         Wpis                    { zmienna }

Budowa wpisu:
[ROW] = 
[NAME_SIZE]   Długość nazwy    	      { 1 bajt  }
[DATA_SIZE]   Długość danych          { 4 bajty }
[ROW_NAME]    Nazwa                   { znaki ASCII }
[ROW_DATA]    Dane					  { znaki ASCII }


Ponadto zakładamy, że każda wartość liczbowa w pliku przechowywana jest jako little-endian.

W tym momencie budowanie pliku i odczytywanie jest bardzo proste.
Ja bym to po prosu inaczej zapisywał.

Pozdr.

0

Okej popróbowałem z tym co mi napisaliście i prawie się udało zrobić.
title
Problem w tym że w ostatniej zakładce tworzy mi richtextboxa z funkcji która jest podana i pakuje do niego wszystko a powinno zostać rozdzielone.


            RichTextBox richTextBox = new RichTextBox();
             
            StreamReader file = new StreamReader(pathLoadFile);

            Dictionary<string, string> dictionary = new Dictionary<string, string>();

            string[] lines = File.ReadAllLines(pathLoadFile);

            string variableName = "";
            bool readingValue = false;

            foreach (var text in lines)
            {
                if (text.Contains("START line: "))
                {
                    variableName = text.Split(new string[] { ": " }, StringSplitOptions.None)[1];
                    CreateBoxForm(tabControl, richTextBox, variableName);
                    readingValue = true;

                }
                else
                {
                    for (int j = 0; j < tabControl.TabCount; j++)
                    {
                        if (variableName == tabNames[j])
                        {

                            richTextBox.Text += text + Environment.NewLine;
                            readingValue = false;

                        }
                    }

                }
            }
}


        private void CreateBoxForm(TabControl tabControl, RichTextBox richTextBox, string tabName)
        {
            int i = 0;

            TabPage tabPage = new TabPage();

            tabPage.Text = tabName;

            tabNames[i] = tabName;

            i++;

            tabControl.Controls.Add(tabPage);
            tabControl.SelectTab(tabControl.TabCount - 1);
            tabPage.Controls.Add(scintilla);

            richTextBox.Parent = tabControl.SelectedTab;
            richTextBox.Dock = DockStyle.Fill;
        }
0
	public class Program
	{
		const string StartEntryMarker = "// START line: ";
		const string EndEntryMarker = "// END line: {0}\r\n";

		class TabModel
		{
			public string Title { get; private set; }
			public string Contents { get; private set; }

			public TabModel(string entryContentsWithoutStartLine)
			{
				var title = entryContentsWithoutStartLine.Split('\r')[0];
				Title = title.Trim();
				var contentsWithEndEntryMarker = entryContentsWithoutStartLine.Substring(title.Length + 2); // +2 for \r\n at the end of title
				var indexOfEntryEndMarker = contentsWithEndEntryMarker.IndexOf(string.Format(EndEntryMarker, Title));
				if (indexOfEntryEndMarker < 0)
					throw new ArgumentException("Missing end marker or mismatched title for entry " + entryContentsWithoutStartLine);

				Contents = contentsWithEndEntryMarker.Substring(0, indexOfEntryEndMarker);
			}
		}

		static void Main(string[] args)
		{
			var data = @"// START line: title 1
			contents 1
			// END line: title 1

			// START line: title 2
			contents 2
			// END line: title 2

			// START line: zmienna3

			// END line: zmienna3
			".Replace("\t", "");


			var tabs = data.Split(new string[] { StartEntryMarker }, StringSplitOptions.None).Skip(1).Select(r => new TabModel(r)).ToList();
		}
	}

W zmiennej tabs będziesz mieć tablicę z modelami definiującymi tytuły i treść zakładek.
Proponuję Ci na przyszłość oszczędzić sobie czasu i zapoznać się z obsługą debugera, prędzej czy później i tak będziesz musiał się tego nauczyć. Na 4p znajduje się artykuł tego dotyczący.

Tak przy okazji Twoja struktura jest słaba. Powolna w parsowaniu, redundantna, podatna na błędy i różnice w oznaczeniach końca linii na różnych systemach operacyjnych. Moim zdaniem lepiej będzie użyć jakiegokolwiek standardowego formatu, np. JSON albo XML. Do tego drugiego masz bardzo miły interfejs (XElement) w .net.

1 użytkowników online, w tym zalogowanych: 0, gości: 1