String zamiast bazy danych

0

Witajcie,

Mam taki problem, mam plik z 10000 wartości:

id; login;numer;imie nazwisko;mail
1;Admin;123124;Jan Kowalski;[email protected]
2;AD;133333;Adam Dworak;[email protected]
3;AR;343434;Antoni Ryczak;[email protected]
...
10000;ZZ;4343434;Zenzon Zygiel;[email protected];

chciałbym podając na wejściu mail, uzyskać numer użytkownika
czyli wywołuję getNumer("[email protected]") i otrzymuję 123124
Pomyślałem sobie, że wczytam plik, jako string i potem ten string przeszukam pod kątem danego ciągu (maila) i pobiorę numer. Mam problem, jak się dostać konkretnej linii stringa, jak w ogóle wyciągnąc ze strina, w której linii znajduje się dany mail.
Jak to zrobić najwydajniej? Może nie wczytywać do stringa, tylko jakoś jeszcze inaczej?

Pozdrawiam,

2

napisz klase reprezentujaca Twoje dane (tak zwany model). Nastepnie napisz parsera ktory wczyta caly plik do listy takiego obiektu

List<Database> database;

pozniej mozesz na liscie robic operacje typu find. Wtedy uzywasz tam lamde i porownujesz z czym chcesz i znajdziesz swoj obiekt

0

Ja bym powiedział, że lepiej zrobić Dictionary<int, Model> zamiast List<Model>.

0

Ja właśnie zastanawiałem się czy nie lepiej by to zrobić poprzez StreamReader i ReadLine()

[ https://msdn.microsoft.com/pl-pl/library/system.io.streamreader.readline(v=vs.110).aspx ]

Jeżeli otworzyłbyś strumienń tak mniej więcej tak jak w linku to można by było po prostu przeszukiwać cały plik przez ReadLine (jeżeli każdy wiersz tej twojej bazy jest w nowej linii). Wtedy to jest dość proste. Coś w tym stylu:

//gdzies tam jest otwary strumien 
 
 string line = stream.ReadLine();
 string[] rows = line.Split(';');
 //rows[0] -> id 
 //rows[1] -> login
 //rows[2] -> numer
 //...

 w tym momencie nume jest przechowywany jako string w rows pod indeksem 2.
 

Ale jakbyś chciał dużo bawić się z tą bazą to tak jak fasadin napisał, klasa która będzie to parsowała a jej metody moga być w podobnym schemacie do tego co napisałem Ci wyżej tylko trzeba będzie zrobić sprawdzenie, czy ta konkretna linia zawiera to, czego szukasz.

Pozdr.

1
MaSz napisał(a):

plik z 10000 wartości:

id; login;numer;imie nazwisko;mail
1;Admin;123124;Jan Kowalski;[email protected]
2;AD;133333;Adam Dworak;[email protected]
3;AR;343434;Antoni Ryczak;[email protected]
...
10000;ZZ;4343434;Zenzon Zygiel;[email protected]

Jak to zrobić najwydajniej?

	var dictionary = File.ReadAllLines(path)
		.Select(line => line.Split(';'))
		.Select(sl => new { Id = int.Parse(sl[0]), Email = sl[4] })
		.ToDictionary(key => key.Email, value => value.Id);

	Console.WriteLine(dictionary["[email protected]"]);

:P

0

Dzięki za podpowiedzi ten Dictionary<int, Model> się sprawdził.

0

Tutaj trochę bardziej "na piechotę"

namespace ConsoleSimpleDatabaseApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    public static class Program
    {
        private static List<Record> records = new List<Record>();

        public static void Main(string[] args)
        {
            var lines = new List<string>
                            {
                                "id;login;numer;imie nazwisko;mail",
                                "1;Admin;123124;Jan Kowalski;[email protected]",
                                "2;AD;133333;Adam Dworak;[email protected]",
                                "3;AR;343434;Antoni Ryczak;[email protected]",
                                "10000;ZZ;4343434;Zenzon Zygiel;[email protected];"
                            }; // tutaj mozesz zaczytac zawartosc pliku

            foreach (var line in lines)
            {
                Record record;
                if (Record.TryParse(line, out record))
                {
                    records.Add(record);
                }
            }

            //tutaj wypluwam calosc do na ekran ale mozna pisac do pliku
            Console.WriteLine(Record.Header);
            foreach (var record in (from r in records orderby r.Mail select r))
            {
                Console.WriteLine(record);
            }

            Console.ReadKey();
        }
    }

    public class Record : IComparable<Record>, IEquatable<Record>
    {
        public int Id { get; set; }

        public string Login { get; set; }

        public int Number { get; set; }

        public string Name { get; set; }

        public string Mail { get; set; }

        public static string Header
        {
            get
            {
                return "id;login;numer;imie nazwisko;mail";
            }
        }

        public static bool TryParse(string line, out Record record)
        {
            try
            {
                var array = line.Split(';');
                var id = int.Parse(array[0]);
                var login = array[1];
                var number = int.Parse(array[2]);
                var name = array[3];
                var mail = array[4];
                record = new Record { Id = id, Login = login, Number = number, Name = name, Mail = mail };
                return true;
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }

            record = null;
            return false;
        }

        public int CompareTo(Record other)
        {
            return string.Compare(this.Login, other.Login, StringComparison.Ordinal);
        }

        public bool Equals(Record other)
        {
            return this.Id.Equals(other.Id) || this.Login.Equals(other.Login) || this.Number.Equals(other.Number);
        }

        public override string ToString()
        {
            return string.Format("{0};{1};{2};{3};{4}", this.Id, this.Login, this.Number, this.Name, this.Mail);
        }
    }
}

Pozdrawiam,

mr-owl

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