Skocz do zawartości

[C#] Wczytywanie danych z plikow .txt


Rekomendowane odpowiedzi

Posiadam nastepujacy plik .txt

Agnieszka Rytka;28;30;198;K;
Franek Wagner;33;32;200;M;
Ada Lada;34;27;157;K;
Jurek Rower;94;90;27;M;

 

Jakie operacje wykonac aby to wczytac?

Chcialbym to oczywiscie jakos uporzadkowac.

I mam pytanie czy najlepiej zeby kazda ta postac bylaby osobna klasa?

 

Bylbym wdzieczny za jakis przyklad, kod wczytywania danych z plikow txt.

Nie pogardze takze linkiem do strony (chociaz szukalem).

 

Pozdrawiam Kamil ;)

Odnośnik do komentarza
Udostępnij na innych stronach

fs = new FileStream("cos.txt", FileMode.Open);

byte[] fileBytes = new byte[fs.length];

fs.Read(fileBytes, 0, (int)fs.Length);

Console.WriteLine(ASCIIEncoding.ASCII.GetString(fileBytes));

 

 

lub

 

StreamReader sr = File.OpenText("cos.txt");

Console.WriteLine( sr.ReadToEnd());

sr.Close();

 

i jest jeszcze kilka innych sposobów. To tylko 2 przykłady jak można to zrobić.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzieki Will. :)

Zaraz cos pokombinuje :P

Ranmus bybym wdzieczny.

Zapomnialem jednak dodac zeby kod uwzglednial sredniki, jako przerwa miedzy danymi.

 

Czyli zeby byla klasa.

A w niej:

Imie nazwisko: Agnieszka Rytka

Zmienna 1: 28

Zmienna 2: 30

Zmienna 3: 198

Plec: K

 

Pzdro ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Może to wyglądać tak, wczytywanie jest analogiczne używasz tylko StreamReader.

Resztę danych i odpowiednie zapisanie tego należy do Ciebie, jak chcesz się nauczyć musisz sam kombinować. ;]

 

 

Możesz zrobić prostą klase:

class dane

{

public string name;

public int wiek;

}

dane klasa=new klasa();

klasa.name="Zenek Stachetnik";

klasa.wiek=234;

//potem

StreamWriter sw = File.CreateText("plik.txt");

char srednik=';';

//reszta danych analogicznie,

//all dane do tablicy i pętla

sw.Write(klasa.name);

sw.Write(srednik);

sw.Write(klasa.wiek);

sw.close();

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

btw. Kamilek. To Twój wymyślony format zapisu danych w pliku czy narzucony przez kogoś innego? Właśnie instaluję Visuala C# Express, bo niedawno miałem instalkę, a dosyć dawno w C# kodziłem, więc z pamięci nie uda mi się napisać poprawnie.

Odnośnik do komentarza
Udostępnij na innych stronach

eee... ale co za problem dodać do tej klasy odpowiednie elementy?

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


namespace dane
{
    class dane
{
public string m_sImieNazw;
public int m_iZmienna1;
public int m_iZmienna2;
public int m_iZmienna3;
public char m_cPlec;

public dane(string s_in,int z1, int z2,int z3,char p)
{
m_sImieNazw=s_in;
m_iZmienna1=z1;
m_iZmienna2=z2;
m_iZmienna3=z3;
m_cPlec=p;
}



}


    class Program
    {
        static void WriteData(ArrayList al,string File)
        {
            char prz = ';';
            StreamWriter sw = new StreamWriter(File);
            foreach (dane d in al)
            {
                sw.Write(d.m_sImieNazw);
                sw.Write(prz);
                sw.Write((char)d.m_iZmienna1);
                sw.Write(prz);
                sw.Write((char)d.m_iZmienna2);
                sw.Write(prz);
                sw.Write((char)d.m_iZmienna3);
                sw.Write(prz);
                sw.Write(d.m_cPlec);
                sw.Write(prz);

            }
            sw.Close();
        }
        static void ReadData(ref ArrayList al, string File)
        {
            
            FileStream sr = new FileStream(File,FileMode.Open);
            //dane d = new dane();
           while(!(sr.Position==sr.Length))
            {
                
                char[] ch=new char[100];
                int i=0;
                char k = new char();
                while (1==1)
                {
                   k=(char) sr.ReadByte();
                   if (k == ';')
                   {
                       break;
                   }
                   ch[i] = k;

                   i++;
                }
                char prz = new char();
                
                int zm1 = new int();
                zm1 = (int)sr.ReadByte();
                             
                 prz = (char)sr.ReadByte();
                int zm2 = new int();
                zm2=(int)sr.ReadByte();
                prz =(char) sr.ReadByte();
                int zm3 = new int();
                zm3=(int)sr.ReadByte();
                prz = (char)sr.ReadByte();
                char znak = new char();
               znak=(char) sr.ReadByte();
               prz = (char)sr.ReadByte();

               string osoba=new string(ch,0,i);
               al.Add(new dane(osoba, zm1, zm2, zm3, znak));

            }
            sr.Close();
        }
        static void Main(string[] args)
        {
            ArrayList nowa = new ArrayList();
            dane jeden=new dane("jan hej",1,2,3,'K');
            dane dwa = new dane("jan bej", 4, 5, 8, 'M');
            nowa.Add(jeden);
            nowa.Add(dwa);
            WriteData(nowa, "dane.txt");

            ArrayList czyt = new ArrayList();
            ReadData(ref czyt, "dane.txt");
            foreach (dane d in czyt)
            {
                Console.WriteLine(d.m_sImieNazw);
                Console.WriteLine(d.m_iZmienna1);
                Console.WriteLine(d.m_iZmienna2);
                Console.WriteLine(d.m_iZmienna3);
                Console.WriteLine(d.m_cPlec);

            }

            Console.Read();
        }
    }
}

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

@Will:

 

Żeś pojechał z tym kodem nie ma co. :D Ogólnie najłatwiejszy sposób odczytu, to plik xmlowy i wciągnięcie go za jednym zamachem do tablicy w DataSet, utworzonej na podstawie pliku zrodlowego.

 

Dam jednak prostszy do zrozumienia na poczatku przyklad. Nie zrobilem jednak sprawdzania czy dane sa poprawn, to juz zadanie dla Ciebie Kamilek.

 

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main( string[] args )
        {
            List<Osoba> osoby   = new List<Osoba>();          //Stworzenie listy obiektow "osoba"
            FileStream fs       = new FileStream( "dane.txt", FileMode.Open ); 
            StreamReader sr     = new StreamReader( fs );          //Wykorzystanie klasy do prostego czytania tekstu

            while ( sr.EndOfStream == false )          //Wykonuj dopoki odczyt nie dojdzie do konca pliku
            {
                string linia = sr.ReadLine();
                string[] dane = linia.Split( ';' );          //Rozbij string na tablice stringow przy pomocy separatora ';'
                string[] personalia = dane[0].Split( ' ' );          // Rozbij imie i nazwisko, glupie

                Osoba osoba = new Osoba();          // Nowy obiekt klasy Osoba

                osoba.Imie = personalia[0];
                osoba.Nazwisko = personalia[1];
                osoba.Zmienna1 = int.Parse( dane[1] );
                osoba.Zmienna2 = int.Parse( dane[2] );
                osoba.Zmienna3 = int.Parse( dane[3] );
                osoba.PlecOsoby = dane[4] == "M" ? Plec.Mezczyzna : Plec.Kobieta;          // Operator trojargumentowy

                osoby.Add( osoba );
            }
        }
    }

    public class Osoba
    {
        public string Imie;
        public string Nazwisko;
        public int Zmienna1;
        public int Zmienna2;
        public int Zmienna3;
        public Plec PlecOsoby;
    }

    public enum Plec          // Enumeracja do okreslenia nowego typu danych - plec, ktory moze miec tylko dwie wartosci.
    {
        Kobieta,
        Mezczyzna
    }
}

Odnośnik do komentarza
Udostępnij na innych stronach

Po angielsku to ja moge sobie opowiadanie przeczytac :P

Ale nie ksiazke o programowaniu w ktorej musze zrozumiec sens wlasnie owego programowania.

Bardzo niewygodnie by mi sie czytalo :/

Chociaz MSDN czytalem co potrzebowalem. Ale i tak mam czas sie podszkolic narazie 3 kl. gimnazjum.

Odnośnik do komentarza
Udostępnij na innych stronach

Angielski i tak musisz znać a im lepiej go poznasz tym łatwiej będziesz znajdywał informacje.

Czy ja wiem? Ja tam raczej wątpię czy masz czas.. Teraz większość czasu pewnie spędzasz na rozrywce a w sumie napisanie prostego programiku trwa dość krótko. Ale aby nauczyć się na prawdę programować zajmie Ci to z 3-4 lata minimum i to ciężkiej pracy. Jako przykład napisze, że wczoraj od 17 do 3 w nocy próbowałem poprawić błąd w moim prostym vfs'ie no i udało się dopiero dziś przed 12 ;) Może czasem szlak trafić...

 

edit: http://www.download25.com/install/free-c-school-e-book.html tu masz dość krótkiego darmowego e-booka na temat c# co prawda w ang ale możesz poćwiczyć.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Ja nic nie polece, bo nie jestem na biezaco z najnowszymi książkami, a "C# i .NET" jest troszkę starą pozycją, mimo że kultową. Ogólnie w grę wchodzą "C# i .NET", "Język C#. Szkoła programowania" i "C# Programowanie". Ta ostatnia najtańsza, ale i najmniej danych zawiera, pierwsza ciężej napisana, ale jak kodzę w C#, to zawszę mam ją pod ręką, bo świetnie opisane niektóre klasy (korzystałem z niej także przy pisaniu kodu w tym temacie), a drugiej książki nie znam.

 

ps. Nie polecam kupowania książek po angielsku w początkowej fazie nauki danego języka programowania.

Odnośnik do komentarza
Udostępnij na innych stronach

Mowilem o nauce Angielskiego. FCE narazie wystarcza mi. :P

Ale no masz racje :)

 

@Ranmus Stokrotne dzieki ;)

"C# i .NET" jest troszkę starą pozycją, mimo że kultową.

Ale bardziej kultowa czy bardziej stara? :D

 

To skusze sie pewnie na to "Język C#. Szkoła programowania"

Mam nadzieje ze dalsza nauka C# sie przyda :D

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Kamilek, poczytaj sobie opinie książek na helion.pl. Chodzi o to, że "C# i .NET" (kultowa, bo dobra i ma tytuł bestsellera oraz utrzymywała się przez dłuższy czas w top 10 książek o programowaniu) była pisana w czasie wydania .NET 2.0 beta, oczywiście dwójka jest opisana i niby nie robi różnicy, ale zawsze jest jakiś niedosyt. A nie wiem czy "Język C#. Szkoła programowania", książka nowsza, skupia się także na 2.0 czy też może ma coś opisane z .NET 3.0 czy nawet 3.5? Jeśli nie, to śmiało możesz kupić "C# i .NET"

 

Pamiętaj, .NET 3.0 i .NET 3.5 różnią się od dwójki głównie nowymi bibliotekami, linq, wcf itd., bo silnik wciąż jest ten sam. Natomiast .NET 1.x już są niekompatybilne i porzucone.

Odnośnik do komentarza
Udostępnij na innych stronach

    class Program
   {
       static void Main(string[] args)
       {
           string[] data = File.ReadAllLines("data.txt");
           List<Persona> output = new List<Persona>();
           char[] delimiters = { ';' };

           foreach (string line in data)
           {
               Persona tmp = new Persona();
               string[] parsedLine = line.Split(delimiters);
               tmp.Name = parsedLine[0];
               int.TryParse(parsedLine[1], out tmp.Age);
               int.TryParse(parsedLine[2], out tmp.PartnerAge);
               int.TryParse(parsedLine[3], out tmp.Height);
               tmp.Sex = parsedLine[4];

               output.Add(tmp);
           }

           foreach (Persona singlePerson in output)
           {
               Console.Write(singlePerson.ToString());
               Console.WriteLine("---------");
           }

           Console.ReadKey();
       }
   }

   public class Persona
   {
       public string Name;
       public int Age;
       public int PartnerAge;
       public int Height;
       public string Sex;

       public Persona(): this("N/A", -1, -1, -1, "N/A") { }
       public Persona(string name, int age, int partnerAge, int height, string sex)
       {
           this.Name = name;
           this.Age = age;
           this.PartnerAge = partnerAge;
           this.Height = height;
           this.Sex = sex;
       }

       public override string ToString()
       {
           StringBuilder sb = new StringBuilder();
           sb.AppendLine("<PERSONA>");
           sb.AppendLine("Name: " + this.Name);
           sb.AppendLine("Age: " + this.Age.ToString());
           sb.AppendLine("Partner Age: " + this.PartnerAge.ToString());
           sb.AppendLine("Height (cm): " + this.Height.ToString());
           sb.AppendLine("Sex (K/M): " + this.Sex.ToString());

           return sb.ToString();
       }
   }

 

Trochę na chama wyciągnąłem z programu, ale wiadomo o co chodzi. Przejrzyj statyczne metody klasy File, one oferują pełen zakres możliwości wczytywania danych. A poza tym metoda Split od stringa jest bardzo dobra jeśli masz separator w danej linijce i chcesz rozbić string na array stringów oddzielanych separatorem.

 

Zawartość pliku data.txt to dokładnie to, co podawałeś. Ten przykład jest dość sztywny, tylko na tę okazję.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 lata później...

kontynuując wczytywanie plików z txt, czy dałoby rade ten kod trochę przerobić tak aby się dało wczytywać dane zmienno przecinkowe, kombinuje na przeróżne sposoby przerobiłem kod tak by były double ale wyświetla wszystkie jako 0.

 

 

moja zawartość pliku to np:

AASW,20111219,34.47,34.47,34.47,34.47,0

AFAZ,20111219,46.58,46.58,46.58,46.58,0

AI3B,20111219,6.91,6.91,6.91,6.91,0

AI3C,20111219,6.94,6.94,6.94,6.94,0

AIFA,20111219,13.62,13.62,13.62,13.62,0

AIFO,20111219,16.78,16.78,16.78,16.78,0

 

natomiast kod:

 class Program
     {
         static void Main(string[] args)
         {
             string[] data = File.ReadAllLines("D://proba.txt");
             List<Notowania> output = new List<Notowania>();
             char[] delimiters = { ',' };

             foreach (string line in data)
             {
                 Notowania tmp = new Notowania();
                 string[] parsedLine = line.Split(delimiters);
                 tmp.Name = parsedLine[0];
                 double.TryParse(parsedLine[1], out tmp.Date);
                 double.TryParse(parsedLine[2], out tmp.Notowanie_open);
                 double.TryParse(parsedLine[3], out tmp.Notowanie_high);
                 double.TryParse(parsedLine[4], out tmp.Notowanie_low);
                 double.TryParse(parsedLine[5], out tmp.Notowanie_close);
                 double.TryParse(parsedLine[6], out tmp.Volume);
                 
                 if (tmp.Notowanie_close != null)
                 {
                     Convert.ToDouble(tmp.Notowanie_close);
                 }


                 output.Add(tmp);
                 
             }

             



             foreach (Notowania singlePerson in output)
             {
                 Console.Write(singlePerson.ToString());
                 Console.WriteLine("---------");
             }

             Console.ReadKey();
         }
     }

     public class Notowania
     {
         public string Name;
         public double Date;
         public double Notowanie_open;
         public double Notowanie_high;
         public double Notowanie_low;
         public double Notowanie_close;
         public double Volume;


         public Notowania() : this("N/A", -1, -1, -1, -1, -1, -1) { }
         public Notowania(string name, double date, double nopen, double nhigh, double nlow, double nclose, double vol)
         {
             this.Name = name;
             this.Date = date;
             this.Notowanie_open = nopen;
             this.Notowanie_high = nhigh;
             this.Notowanie_low = nlow;
             this.Notowanie_close = nclose;
             this.Volume = vol;

         }

         public override string ToString()
         {
             StringBuilder sb = new StringBuilder();
             sb.AppendLine("<PERSONA>");
             sb.AppendLine("Nazwa: " + this.Name);
             sb.AppendLine("Data: " + this.Date.ToString());
             sb.AppendLine("Otwarcie: " + this.Notowanie_open.ToString());
             sb.AppendLine("Najwyższe: " + this.Notowanie_high.ToString());
             sb.AppendLine("Najniższe: " + this.Notowanie_low.ToString());
             sb.AppendLine("Zamknięcie: " + this.Notowanie_close.ToString());

             return sb.ToString();
         }
     }

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...