Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# rivin haku tekstitiedostosta

Sivun loppuun

nitsi [22.04.2012 23:28:25]

#

Mul on tiedosto johon on tallennettu riveittäin tietoa, jokaisen rivin alkuun on laitettu

DateTime.Now.ToString("dd.MM.yyyy");

ja tarkoituksena olisi nyt kalenteristä hakia

string valittuPvm =
dtKalenteri.Value.ToShortDateString();"

Ongelmana on, että saan luettua vain yhden rivin Readlinellä, ja readtoend ei lue mitään. apuja kaivattais.

private void historia_Load(object sender, EventArgs e)
        {
            try
            {
                StreamReader lukija = new StreamReader(new FileStream(@"SyötetytRuuat.txt", FileMode.Open));
                String luettavatRivit;

                // lisätään tietoa arraylistiin rivikerralla
                while ((luettavatRivit = lukija.ReadToEnd()) != null)
                {
                    rivit.Add(luettavatRivit);
                }
                lukija.Close();
                tiedot = 1;
                //tulostetaan rivin tiedot annetuille kentille!
                näytettäväRivi(tiedot);
            }
            catch (Exception)
            {
                MessageBox.Show("Tiedostoa ei voitu lukea");
            }
        }
private void btnHae_Click(object sender, EventArgs e)
        {
            string valittuPvm = dtKalenteri.Value.ToShortDateString();
            lstHistoria.Items.Clear();
            näytettäväRivi(tiedot);
        }

        public void näytettäväRivi(int rivinumero)
        {
            if ((rivinumero >= 0) && (rivinumero < rivit.Count))
            {
                // haetaan tiedot arraylististä
                String rivi = (String)rivit[rivinumero];
                // tabilla eroteltu tiedot
                string[] osat = rivi.Split('\t');
                lstHistoria.Text = osat[1];
            }
        }

Eli jos kalenteristi valittuna 19.4.2012, niin pitäs tulostaa kaikki rivit mis toi esiintyy ja näyttää ne listboxilla, mut en saa toimiin :(

19.4.2012 Tietoa 123
19.4.2012 Lisää 234

Tiedän että tämä koodi on "huono", eikä toimi alkuunkaan, mutta hiuksia repiessäni 6h sitten poistin paremmat versiot. mutta tästä saa idean mitä olin tekemässä.

PS. Onko mahdollista ajaa form1:ltä, form2:lla olevan koodin? sielä olis form2:sessa nappi, mitä pitäs painaa nopsaa hetikun ohjelman avaa, jotta tietoa latautuu muille formeille ohjelmas. Tällä hetkellä pitää aina käydä form2:ssa painamassa nappia ennenkuin ohjelma toimii kunnolla.

Lisäys:

private void btnHae_Click_1(object sender, EventArgs e)
        {
            string valittuPvm = dtKalenteri.Value.ToShortDateString();

            StreamReader lueRuokaHistoria = new StreamReader("SyötetytRuuat.txt");
            String woord;
            int laskuri = 0;

            woord = lueRuokaHistoria.ReadLine();
            while (woord != null)
            {
                lstHistoria.Items.Add(woord);

                for (int i = 0; i < woord.Length - 1; i++)
                {
                    woord.Substring(0, i).Equals(valittuPvm);
                    {
                        laskuri++;
                    }
                }
                woord = lueRuokaHistoria.ReadLine();
            }
            lueRuokaHistoria.Close();
            txtTesti.Text = "" + laskuri;
        }

Ei toimi ei :(

Grez [23.04.2012 06:54:19]

#

Toi eka toimii parilla korjauksella

private void historia_Load(object sender, EventArgs e)
{
    try
    {
        StreamReader lukija = new StreamReader(new FileStream(@"C:\V\Softaprojektit\Putka\nitsiruoka\SyötetytRuuat.txt", FileMode.Open));

        string[] riviv = {"\r\n"};
        string kaikkiRivit = lukija.ReadToEnd();
        rivit.Items.AddRange(kaikkiRivit.Split(riviv, StringSplitOptions.RemoveEmptyEntries));
        lukija.Close();
    }
    catch (Exception)
    {
        MessageBox.Show("Tiedostoa ei voitu lukea");
        return;
    }
    tiedot = 1;
    //tulostetaan rivin tiedot annetuille kentille!
    näytettäväRivi(tiedot);
}
private void btnHae_Click(object sender, EventArgs e)
{
    string valittuPvm = dtKalenteri.Value.ToShortDateString();
    rivit.Items.Clear();
    näytettäväRivi(tiedot);
}

public void näytettäväRivi(int rivinumero)
{
    if ((rivinumero >= 0) && (rivinumero < rivit.Items.Count))
    {
        // haetaan tiedot arraylististä
        String rivi = (String)rivit.Items[rivinumero];
        // tabilla eroteltu tiedot
        string[] osat = rivi.Split('\t');
        rivit.Text = osat[1];
    }
}

nitsi kirjoitti:

//...
                for (int i = 0; i < woord.Length - 1; i++)
                {
                    woord.Substring(0, i).Equals(valittuPvm);
                    {
                        laskuri++;
                    }
                }
//...

Ei toimi ei :(

Mitäköhän yrität tuossa tehdä. Käyt luetun rivin pituuden verran läpi loopissa ja lasket laskuri -muuttujaan luettujen sanojen yhteispituuden. Sitten jostain syystä teet tuollaisen Equals-vertailun, muttet käytä tulosta mihinkään.

Jos nyt oletan, että tuon laskurin olisi tarkoitus laskea, montako riviä vastaa valittua päivää, niin minulla ainakin tämä toimii ihan mainiosti:

private void button1_Click(object sender, EventArgs e)
{
    string valittuPvm = dtKalenteri.Value.ToShortDateString();

    StreamReader lueRuokaHistoria = new StreamReader(@"C:\V\Softaprojektit\Putka\nitsiruoka\SyötetytRuuat.txt");
    int laskuri = 0;

    while (!lueRuokaHistoria.EndOfStream)
    {
        string woord = lueRuokaHistoria.ReadLine();
        lstHistoria.Items.Add(woord);

        if (woord.StartsWith(valittuPvm))
        {
            laskuri++;
        }
    }
    lueRuokaHistoria.Close();
    txtTesti.Text = laskuri.ToString();
}

nitsi kirjoitti:

PS. Onko mahdollista ajaa form1:ltä, form2:lla olevan koodin? sielä olis form2:sessa nappi, mitä pitäs painaa nopsaa hetikun ohjelman avaa, jotta tietoa latautuu muille formeille ohjelmas. Tällä hetkellä pitää aina käydä form2:ssa painamassa nappia ennenkuin ohjelma toimii kunnolla.

Toki toisesta luokasta voi käyttää toisen luokan metodeita, jos ne ovat julkisia. Jos toisen formin metodi muuttaa formilla olevaa tavaraa, niin käytä Invokea.

nitsi [23.04.2012 17:13:48]

#

Siis koko homman tarkoitushan siis oli, lukea toi tekstitiedoston sisältö listboxiin ekana. Sen jälkeen valitaan datetimepickeristä joku päivämäärä ja painetaan nappia, sen pitäs osata sit näyttää VAIN ne tiedot listboxissa joissa esintyy toi kyseinen päivämäärä jolla haetaan, eli tarkoitus on hakea liikuntasuorituksia tiedostosta päivämäärän mukaan.

Grez [23.04.2012 18:24:27]

#

No eikös toi jälkimmäinen koodipätkäni toimi jotakuinkin silleen jos siirrät tuon rivin 11 pari riviä alemmas (eli if-lauseen aaltosulkujen sisään).

Vai mitä tarkoitat?

nitsi [23.04.2012 18:40:33]

#

no niin sen pitäs varmaan toimii mut ei se toimi, en tiiä missä vika.

Grez [23.04.2012 18:43:38]

#

Oikea hakemisto tiedostolle? Missä vaiheessa tulee virhe. Lisää ekalle riville breakline (F9) ja sitten kun suoritus pysähtyy voit Step Over (F10) komennolla mennä rivi kerrallaan eteenpäin ja katsoa mitä tapahtuu (muuttujan arvo tulee näkyviin kun menet hiirellä sen päälle).

nitsi [23.04.2012 18:46:15]

#

No joo, löysin vian...
string valittuPvm = dtKalenteri.Value.ToShortDateString();
= 23.4.2012
kun taas
pvm = DateTime.Now.ToString("dd.MM.yyyy");
= 23.04.2012

Huomaat varmaan missä oli vikaa...
Manuaalisesti ku poistaa tiedostosta ylimääräsen nollan niin toimii just niinku pitää. Nyt sit koittaa keksiä mites tää ongelma korjataan koodiin.

Grez [23.04.2012 18:47:46]

#

No mitä jos laitat ToShortDateString() tilalle ToString("dd.MM.yyyy")

Tai ToString("dd.MM.yyyy") tilalle ToShortDateString()

Ensimmäinen vaihtoehto on järkevämpi, koska se ei riipu koneesi paikallisasetuksista.

nitsi [23.04.2012 18:50:32]

#

Jeps... :D
tullu rapiat 60h koodailtua viimetorstaista lähtien, ei taho enää aivot toimia :D
Joo, kaikki toimii nyt, kiitos


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta