Tietyn kohdan hakeminen tekstitiedostosta

Olen tässä miettiny ohjelmaa joka hakisi arvoja tekstitiedostosta.
Ongelmia on kasautunut eteen aika roimasti.

Ehkä tärkein kysymys olis, että miten tekstitiedostosta voisi hakea vaikka teityn kohdan (esim. siinä olevan otsikon perusteella)?

Meinasin että ohjelma lukisi siitä kohdasta tietyn pätkän rivejä ja lisäisi ne esimerkiksi comboboxiin.
Streamreaderiin en ole löytänyt muita ohjeita kuin sen että se lukee koko tekstitiedoston läpi kunnes on tyhjä rivi.
Jos streamreaderille sais määritellä vaikka tiettyjä ehtoja, että se alkaisi lisäämään tietoja listboxiin vasta sitten kun ehdot täyttyvät.

Tai sit toisinpäin että streamwriter alkais kirjottamaan arvoja vasta sitten kun se on törmännyt tiettyyn otsikkoon.

Kielenä on C# mut tämä varmasti onnistuu melkein samoin lähes kaikilla yleisimmillä kielillä.
8732
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

Luet rivin kerrallaan esim. ifstream:iä käyttäen ja testaat aina ollaanko oikeassa kohtaa tiedostoa. Sitten luet ja käsittelet sitä seuraavat rivit.

Äänestä
  • En löytäny tolla sanalla itse c#-koodia msdn:stä mut sensijaan löysin vinkkejä oikeaan suuntaan. Kiitän.

    Äänestä

-En tunne sharpia,mutta allaolevasta osoitteesta löytyi ehkä jotakin.
Tuon while-silmukan sisällä voi tsekata onko aktuellissa rivissä jotkin
mielenkiintoista.Jos on niin siitä saa sen talteen(ReadLine).



http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=132

Read() -- Reads data from an input stream.
ReadLine() -- Reads a line of characters from the current stream and returns the data as a string.
ReadToEnd() -- Reads all characters to the end of the TextReader and returns them as one string.
**************************************************************************************************

public class Readtextfile
{
public static int Main(string[] args)
{
StreamReader re = File.OpenText("Collin.txt");
string input = null;
while ((input = re.ReadLine()) != null)
{
Console.WriteLine(input);
}
re.close;
return 0;
}
}

Äänestä
  • mut siinä on sellainen huono puoli, että se lukee kaikki tiedot.
    Mietin sit, että jos tekis siihen rivilaskurin. Kun streamreader käy rivejä läpi niin kun se löytää teityn rivin otsikon (esim perunat) niin se tulostaa johonkin string muuttujaan sen laskurinumeron. Kun streamreader jatkaa eteenpäin niin seuraavassa ehdossa seuraavaan otsikkoon (esim porkkanat). Ottaa siitä uudestaan laskurinarvon mutta vähentää siitä yhden pois ettei seuraava otsikko tule mukaan lukuun.

    Jos sitten esim tossa sun koodissa oleva "string input" olis esim taulukko niin streamreader lukis arvot tolta laslkurin minimi arvon ja maksimiarvon väliltä.

    Mutta mietin, että pakkohan c#:ssa on olla joku älykkäämpikin tapa etsiä jonkun tietyn välin tiedot. En vaan ole vielä löytäny sitä.

    Äänestä

  • Juuba kirjoitti:

    mut siinä on sellainen huono puoli, että se lukee kaikki tiedot.
    Mietin sit, että jos tekis siihen rivilaskurin. Kun streamreader käy rivejä läpi niin kun se löytää teityn rivin otsikon (esim perunat) niin se tulostaa johonkin string muuttujaan sen laskurinumeron. Kun streamreader jatkaa eteenpäin niin seuraavassa ehdossa seuraavaan otsikkoon (esim porkkanat). Ottaa siitä uudestaan laskurinarvon mutta vähentää siitä yhden pois ettei seuraava otsikko tule mukaan lukuun.

    Jos sitten esim tossa sun koodissa oleva "string input" olis esim taulukko niin streamreader lukis arvot tolta laslkurin minimi arvon ja maksimiarvon väliltä.

    Mutta mietin, että pakkohan c#:ssa on olla joku älykkäämpikin tapa etsiä jonkun tietyn välin tiedot. En vaan ole vielä löytäny sitä.

    että sen laskurin muuttujan pitääkin olla int että taulukko älyäis sen.

    Äänestä

  • Juuba kirjoitti:

    että sen laskurin muuttujan pitääkin olla int että taulukko älyäis sen.

    -Tässä ei ole välttämättä kaikki lausekkeet oikeilla paikoillaan näkyvyyden
    kannalta katsoen,ja on sitten sekaisin C#:a ja C :ssaa,kun en osaa sharpia.
    -Tällä periaatteella(!!) homman saa kuitenkin toimimaan.
    -Koodi lukee "string hakusanan" jälkeiset 2 riviä taulukkoon target.
    -Minulla koodi toimii C Builderissa,sinne sovellettuna.


    public class Readtextfile
    {
    public static int Main(string[] args)
    {
    //************************************************
    //Mihinkähän allaolevat...
    int rivit=0;
    string *input2=new string[60];
    string *target=new string[60];
    string hakusana="[PORKKANA]";
    //************************************************
    //************************************************
    StreamReader re = File.OpenText("Collin.txt");
    string input = null;
       while ((input = re.ReadLine()) != null)
    {

        input2[rivit]=input;//Luetaan rivi taulukkoon
        rivit ;

        }
    re.close;
    //Rivit luettu taulukkoon input2
    //************************************************
    //************************************************

    //Suoritetaan haku ja tulostetaan halutut 2 riviä
    int i=0;
    int hakusanalaskuri=0;

    for(i=0;i

    Äänestä

  • Builder kirjoitti:

    -Tässä ei ole välttämättä kaikki lausekkeet oikeilla paikoillaan näkyvyyden
    kannalta katsoen,ja on sitten sekaisin C#:a ja C :ssaa,kun en osaa sharpia.
    -Tällä periaatteella(!!) homman saa kuitenkin toimimaan.
    -Koodi lukee "string hakusanan" jälkeiset 2 riviä taulukkoon target.
    -Minulla koodi toimii C Builderissa,sinne sovellettuna.


    public class Readtextfile
    {
    public static int Main(string[] args)
    {
    //************************************************
    //Mihinkähän allaolevat...
    int rivit=0;
    string *input2=new string[60];
    string *target=new string[60];
    string hakusana="[PORKKANA]";
    //************************************************
    //************************************************
    StreamReader re = File.OpenText("Collin.txt");
    string input = null;
       while ((input = re.ReadLine()) != null)
    {

        input2[rivit]=input;//Luetaan rivi taulukkoon
        rivit ;

        }
    re.close;
    //Rivit luettu taulukkoon input2
    //************************************************
    //************************************************

    //Suoritetaan haku ja tulostetaan halutut 2 riviä
    int i=0;
    int hakusanalaskuri=0;

    for(i=0;i

    Tein itse tällaisen version c#:lla.
    Tämä rakentaa ekalla streamreaderilla ensin dynaamisen taulukon koon ja sit toisella streamreaderilla lukee tekstitiedoston tiedot taulukkoon riveille samassa muodossa kuin ne tekstitiedostossa ovat. Tulostetaan koko paketti listboxiin ja siin samalla etsitään perunoiden ja porkkanoiden rivit ja niiden välinen alue on sit perunat rivi 1 rivi ja porkkanat rivi - 1 rivi.

    Listataan ne tiedot vielä uudestaan erikseen.
    Olen kehitellyt ohjelmaa vielä paljon pidemmälle eteenpäin ja nykyisessä ohjelmassa voi vaihtaa tietyn otsikon toiseen tai poistaa tietyn lohkon (esim perunat ja sen tiedot) välistä. Kun tämä on tehty niin sitä seuraava lohko siirtyy sen tilalle.


    private void Form1_Load(object sender, System.EventArgs e)
    {

    string []tiedostorivit = null;
    string Otsikko1 = "Perunat";
    string Otsikko2 = "Porkkanat";
             
             
             
    using (StreamReader sr = File.OpenText(path))
    {
       string rivi = "";

       while ((rivi = sr.ReadLine()) != null)
       {
                   
          rivit ;
                   

       }
       tiedostorivit = new String[rivit];
                
       rivit = 0;
       sr.Close();
    }
    using (StreamReader sr2 = File.OpenText(path))
    {
       i = 0;
       string rivi = "";

       while ((rivi = sr2.ReadLine()) != null)
       {
          tiedostorivit[i] = rivi;
          i ;
       }
       sr2.Close();
    }
    int alkurivi = 0;
    int loppurivi = 0;

    for(i = 0;i

    Äänestä

  • Juuba kirjoitti:

    Tein itse tällaisen version c#:lla.
    Tämä rakentaa ekalla streamreaderilla ensin dynaamisen taulukon koon ja sit toisella streamreaderilla lukee tekstitiedoston tiedot taulukkoon riveille samassa muodossa kuin ne tekstitiedostossa ovat. Tulostetaan koko paketti listboxiin ja siin samalla etsitään perunoiden ja porkkanoiden rivit ja niiden välinen alue on sit perunat rivi 1 rivi ja porkkanat rivi - 1 rivi.

    Listataan ne tiedot vielä uudestaan erikseen.
    Olen kehitellyt ohjelmaa vielä paljon pidemmälle eteenpäin ja nykyisessä ohjelmassa voi vaihtaa tietyn otsikon toiseen tai poistaa tietyn lohkon (esim perunat ja sen tiedot) välistä. Kun tämä on tehty niin sitä seuraava lohko siirtyy sen tilalle.


    private void Form1_Load(object sender, System.EventArgs e)
    {

    string []tiedostorivit = null;
    string Otsikko1 = "Perunat";
    string Otsikko2 = "Porkkanat";
             
             
             
    using (StreamReader sr = File.OpenText(path))
    {
       string rivi = "";

       while ((rivi = sr.ReadLine()) != null)
       {
                   
          rivit ;
                   

       }
       tiedostorivit = new String[rivit];
                
       rivit = 0;
       sr.Close();
    }
    using (StreamReader sr2 = File.OpenText(path))
    {
       i = 0;
       string rivi = "";

       while ((rivi = sr2.ReadLine()) != null)
       {
          tiedostorivit[i] = rivi;
          i ;
       }
       sr2.Close();
    }
    int alkurivi = 0;
    int loppurivi = 0;

    for(i = 0;i

    -Hyvä kun ratkesi!

    tiedostorivit = new String[rivit];
    **********************************
    Tuo tilanvaraus pitää vielä deletoida,kun sitä ei
    enää tarvita.

    MUUTA
    *****
    Olen tehnyt pikkuohjelman joka lukee tekstitiedostosta

    sanoja.
    Tiedostoon voi sitten kirjoittaa rivejä ohjelman ulkopuo-
    leltakin.

    Esimerkki fileestä:

    [Porkkanat]^2 euroa/kg^
    [Uudet perunat]^4 euroa/kg^
    [Sipulit]^3 euroa/kg^

    tai:

    [Porkkanat]^ ^
    Laatu A^2 euroa/kg^
    [Uudet perunat]^ ^
    Laatu B^4 euroa/kg^
    [Sipulit]^ ^
    Laatu C^3 euroa/kg^


    Rivit luetaan 2-ulotteiseen dynaamiseen taulukkoon,
    taulukko[rivit_fileessa][sarakkeet]
    kukin sarake antaa hattumerkkien välissä olevan stringin,
    jossa voi olla myös välilyöntejä.Kaikki haut plus muut
    toimenpiteet voidaan suorittaa sitten taulukkoa hyväksi-
    käyttäen.Esimerkkifailissa on vain 2 "sanaa"/rivi,mutta
    niitä saa sinne halutun määrän................

    Äänestä

Kommentoi aloitusta


Juuba kirjoitti:

Olen tässä miettiny ohjelmaa joka hakisi arvoja tekstitiedostosta.
Ongelmia on kasautunut eteen aika roimasti.

Ehkä tärkein kysymys olis, että miten tekstitiedostosta voisi hakea vaikka teityn kohdan (esim. siinä olevan otsikon perusteella)?

Meinasin että ohjelma lukisi siitä kohdasta tietyn pätkän rivejä ja lisäisi ne esimerkiksi comboboxiin.
Streamreaderiin en ole löytänyt muita ohjeita kuin sen että se lukee koko tekstitiedoston läpi kunnes on tyhjä rivi.
Jos streamreaderille sais määritellä vaikka tiettyjä ehtoja, että se alkaisi lisäämään tietoja listboxiin vasta sitten kun ehdot täyttyvät.

Tai sit toisinpäin että streamwriter alkais kirjottamaan arvoja vasta sitten kun se on törmännyt tiettyyn otsikkoon.

Kielenä on C# mut tämä varmasti onnistuu melkein samoin lähes kaikilla yleisimmillä kielillä.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu