Obsługa plików regularnych i wyświetlanie danych

0

Witam,
Mam taki kod:
public partial class Form1 : Form
{
public string text;
public string explode(string wejdz)
{
StringBuilder sBuilder = new StringBuilder();
int id = 1;
foreach (string subStr in Regex.Split(text, @" |, |,||"))
{
sBuilder.AppendFormat("{1}\n", id++, subStr);
return String.Format("{0}", sBuilder) ;

        }
    }
    public Form1()
    {
        InitializeComponent();
    }

private void button3_Click(object sender, EventArgs e)
{
FileInfo theSourceFile = new FileInfo ( @"C:\Documents and Settings\Łukasz\Pulpit\C#\WindowsApplication1\WindowsApplication1\bin\Debug\test.txt");
StreamReader reader = theSourceFile.OpenText();
do
{
text = reader.ReadLine();
//MessageBox.Show(text);
comboBox1.Items.Add(explode(text).ToString());
MessageBox.Show(explode(text).ToString());
}
while (text != null);
}

Jeśli daje zwykłego MessageBox.Show(text) to pokazuje mi zawartość pliku (chociaż dziwnie - bo bez polskich znaków....:( )

Plik ma postać :
To|jest|skomplikowany|program|łóąćźż

Chce teraz uzyskać w MessageBoxie tekst bez "|" i wypełnić ComboBoxa wynikami...
Problem w tym że kompilator zwraca mi błąd: "Error 1 'WindowsApplication1.Form1.explode(string)': not all code paths return a value"

Wie ktoś może o co chodzi - co mam źle z tą klasą??:) i ew. czemu nie program nie widzi polskich znaków (plik utworzyłem w notatniku windowsowym - zwykły txt)??

Z góry dzięki za pomoc i cierpliwość ;)

0
public string explode(string wejdz)
        {
            StringBuilder sBuilder = new StringBuilder();
            int id = 1;
            foreach (string subStr in Regex.Split(text, @" |, |,|\|"))
            {
                sBuilder.AppendFormat("{1}\n", id++, subStr);
                return String.Format("{0}", sBuilder) ;
                 
            }
        }

Dwa bledy, z czego o jednym powiedzial Ci kompilator:

  1. metoda zakonczy sie ZAWSZE po pierwszej iteracji (return w srodku petli)
  2. Blad kompilatora: jezeli metoda cos zwraca to musi to zwracac w kazdym mozliwym wypadku - u Ciebie metoda zwroci cokolwiek tylko po pomyslnym wejsciu w foreach.

pozdrawiam
johny

0

czyli jakbyś to zrobił?? (sorki że Cie męcze, ale dopiero zaczynam z C#)

0

zrobiłem coś takiego:
public string explode(string wejdz)
{
StringBuilder sBuilder = new StringBuilder();
int id = 1;
foreach (string subStr in Regex.Split(text, @" |, |,||"))
{
sBuilder.AppendFormat("{1}\n", id++, subStr);
// return String.Format("{0}", sBuilder);

        }
        if (String.Format("{0}", sBuilder) != "")
        {
            return String.Format("{0}", sBuilder);
        }
        else
        {
            return String.Format("u");
        }
    }

Teraz kompilator nie zwraca błędu i funkcja wykonuje się poprawnie - tzn pokazuje zawartość pliku (dalej bez polskich znaków :/) ale po poprawnym wyświetleniu zawartości pliku zwraca błąd:
Wartość nie może być zerowa.
Nazwa parametru: input

Co teraz jest źle??:/

0

Troszke sie pogubilem w tym co napisales.

Ja osobiscie zrobilbym tak, ze kazda wartosc jest w nowej linii, nastepnie TextReader i odczytujesz po linii. Bezproblemowe i bez kombinacji.

pozdrawiam
johny

0

chodziło mi o 2 kod teraz ;)
po poprawce program pokazuje ładnie text, bez "|" w MessageBoxie - ale jak klikne "ok" to się wywala i pisze :
Wartość nie może być zerowa.
Nazwa parametru: input

Mógłbyś podać swój kod - taki jak Ty byś to zrobił??:)

0

Oto przyklad dla dwoch roznych plikow:

Plik1.txt //twoj preferowany

To|jest|skomplikowany|program|łóąćźż

Plik2.txt //moj preferowany

To
jest
skomplikowany
program
łóąćźż

Przyklad

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

namespace Test
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			Console.WriteLine("Plik1.txt:");
			TextReader vReader = new StreamReader("plik1.txt", System.Text.Encoding.GetEncoding("windows-1250"));
			String vLine = "";
			while((vLine = vReader.ReadLine())!=null)
			{
				Regex vReg = new Regex("([^|]*)|");
				MatchCollection vMatches = vReg.Matches(vLine);
				foreach(Match vMatch in vMatches)
					if(vMatch.Groups[0].Value != "")
				   Console.WriteLine(vMatch.Groups[0].Value);
			}
			vReader.Close();


			Console.WriteLine("Plik2.txt:");
			vReader = new StreamReader("plik2.txt", System.Text.Encoding.GetEncoding("windows-1250"));
			vLine = "";
			while((vLine = vReader.ReadLine())!=null)
			{
			  Console.WriteLine(vLine);
			}
			vReader.Close();
			Console.Read();
		}
	}
}

Jak widac w drugim wypadku odczytywanie jest czysta przyjemnoscia :) Pierwszy sposob oczywiscie tez sie, jesli wolisz z jakiegos powodu.

Pliki zapisywane w notepad++ (zwykly notepad tez ma kodowanie windows-1250 o ile pamietam).

pozdrawiam
johny

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