[C#]StreamRead i przeskok o linię

0

Witam.
Piszę program który ma wczytywać dane z pliku txt. Dane są przedstawione w nim w następujący sposób:

KOLEJKI = 3
NAZWA = KOL1 BUFoR = 100
NAZWA = KOL2 BUFoR = 200
NAZWA = KOL3 BUFoR = 150 

Cały plik wczytałem do programu poprzez ReadToEnd.Split

 try
                {
                    plik = new FileStream("pakiety_input.txt", FileMode.Open, FileAccess.ReadWrite);
                }
                catch (FileNotFoundException)
                {
                    Console.WriteLine("* BŁĄD * Brak pliku pakiety_input.txt");
                    return;
                }
                StreamReader p = new StreamReader(plik);
                string[] odczyt;
                odczyt = p.ReadToEnd().Split();

Niestety próbując wczytać do zmiennych wartości podane w pliku natrafiam na problem:

 
                for (; lp < kolejki; lp++)
                {
                    nazwy[lp] = odczyt[i + 2];
                    bufory[lp] = int.Parse(odczyt[i + 5]);      
                    i++;
                }

Niestety w ten sposób program wychodzi poza zakres tabeli. Jak inaczej zasugerować programowi zeby po wczytaniu jednej serii danych zszedł linijkę nizej do kolejnych wersów?

0

String.Split() bez parametrów podzieli Ci ciąg używając jako separatorów wszystkich białych znaków (white-space), czyli tutaj zarówno 'space' jak i 'enter'. Mógłbyś podać jako parametr znak nowej linii, wtedy po Split miałbyś już oddzielone linie do dalszego przetwarzania. Ale jest gotowa metoda na odczytanie odseparowanych linii z pliku: File.ReadAllLines(). Czyli coś w stylu:

string[] lines;
try
{
	lines = File.ReadAllLines("pakiety_input.txt");
}
catch(IOException)
{
	// FileNotFoundException to nie jedyny możliwy błąd IO
}
for(int i = 1; i < lines.Length; i++)
{
	string line = lines[i];		
	// parsowanie poszczególnych linii
}

Swoją drogą, jeżeli format pliku zależy od Ciebie, to radziłbym go zmienić na coś bardziej standardowego, np: csv, wtedy parsowanie linii jest łatwiejsze i bardziej odporne na błędy (np. przed lub po "=" zabraknie spacji).

0

A może pobawimy się w coś bardziej "dzisiejszego" niż ręczne parsowanie pliku :)?

var obiekty = from Match match in Regex.Matches(string `cała zawartość pliku`, @"NAZWA = (?<nazwa>.+?) BUFoR = (?<bufor>\d+)")
                select new
                {
                    nazwa = match.Groups["nazwa"].Value,
                    bufor = int.Parse(match.Groups["bufor"].Value)
                };

Teraz możesz zrobić foreach(var obiekt in obiekty) i twój obiekt to będzie typ anonimowy z polami string nazwa oraz int bufor.

No chyba, że piszesz w .NET 1.0, to to za bardzo nie wypali ;).

0

No. Ale sądzę, że sugerowanie nauczenia się regexów na takim etapie zaawansowania to trochę zbyt duża stromizna. Do tego trzeba by przerobić ten format na jakiś XML (nie sądzę, by pochodził on "z zewnątrz"), a wtedy też regexy są zbędne. Popieram strategię małych kroczków.

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