Imports System Imports System.IO Module Csv_rutinok #Region "Változók" 'Saját típus (Strutkúra) Public Structure TanulóTípus Dim Sorszám As Integer Dim Osztály As String Dim Név As String Dim Született As Date Dim Átlag As Single Dim Neme As String End Structure 'Osztály statisztika típus Public Structure OsztályStatisztikaTípus Dim Osztály As String Dim OsztályLétszám As Integer Dim OsztályÁtlag As Single Dim FérfiakSzáma As Integer Dim NőkSzáma As Integer End Structure 'Tömbök Public Tanulók() As TanulóTípus Public IndexNév() As TanulóTípus Public OsztályStatisztika() As OsztályStatisztikaTípus 'Fájlok Public NévsorFájl As String = ProjektÚtvonal() & "\nevsor.csv" Public StatisztikaFájl As String = ProjektÚtvonal() & "\statisztika.csv" #End Region #Region "Fájl útvonalak" Function FájlÚtvonal(ByVal FájlNév As String) As String FájlÚtvonal = AlkalmazásÚtvonal() & "\" & FájlNév End Function Function ProjektÚtvonal() As String 'A Projekt útvonala Dim MappaTömb() As String MappaTömb = Split(AlkalmazásÚtvonal(), "\") ReDim Preserve MappaTömb(UBound(MappaTömb) - 2) ProjektÚtvonal = Join(MappaTömb, "\") End Function Function AlkalmazásÚtvonal() As String 'Az az útvonal, ahonnan az alkalmazás indul AlkalmazásÚtvonal = Application.StartupPath End Function #End Region #Region "Beolvasás tömbbe, Írás szövegdobozba, Statisztika Írás fájlba" 'A Tanulók tömbbe beolvassa a nevsor.csv fájlt Sub NévsorBeolvas(ByVal Fájl As String) Dim fs As FileStream Dim sr As StreamReader Dim Tanuló As TanulóTípus Dim i As Integer = 0 Dim Sor As String Dim SorTömb() As String Dim Szeparátor As String = ";" Erase Tanulók 'Fájl megnyitása olvasásra fs = New FileStream(Fájl, FileMode.Open, FileAccess.Read) sr = New StreamReader(fs, Text.Encoding.Default) 'Beolvasás soronként While sr.Peek() > -1 i = i + 1 Sor = sr.ReadLine() If i > 1 Then 'A második sortól kezdve 'Egy sor beolvasás 'Az oszlopok beolvasása a Tanuló strukúrába SorTömb = Split(Sor, Szeparátor) Tanuló.Sorszám = i - 1 Tanuló.Osztály = SorTömb(0) Tanuló.Név = SorTömb(1) Tanuló.Született = CDate(SorTömb(2)) Tanuló.Átlag = CSng(SorTömb(3)) Tanuló.Neme = SorTömb(4) 'A Tanuló tárolása a Tanulók tömbbe ReDim Preserve Tanulók(i - 2) Tanulók(i - 2) = Tanuló End If End While sr.Close() End Sub 'A szövegdobozba kiírja a névsort a Tanulók tömbből Sub SzövegdobozNévsor(ByVal RTB As RichTextBox) Dim Tanuló As TanulóTípus Dim Szeparátor As String = vbTab RTB.Text = "Osztály" & Szeparátor & "Név" & Szeparátor & "Született" & Szeparátor & "Átlag" & Szeparátor & "Neme" & vbNewLine For Each Tanuló In Tanulók RTB.Text &= Tanuló.Osztály & Szeparátor & Tanuló.Név & Szeparátor & Tanuló.Született & Szeparátor & Tanuló.Átlag & Szeparátor & Tanuló.Neme & vbNewLine Next End Sub 'A szövegdobozba kiírja a névsort a Tanulók tömbből Sub SzövegdobozStatisztika(ByVal RTB As RichTextBox) Dim Statisztika As OsztályStatisztikaTípus Dim Szeparátor As String = vbTab RTB.Text = "Osztály" & Szeparátor & "OsztályLétszám" & Szeparátor & "OsztályÁtlag" & Szeparátor & "NőkSzáma" & Szeparátor & "FérfiakSzáma" & vbNewLine For Each Statisztika In OsztályStatisztika RTB.Text &= Statisztika.Osztály & Szeparátor & Statisztika.OsztályLétszám & Szeparátor & Statisztika.OsztályÁtlag & Szeparátor & Statisztika.NőkSzáma & Szeparátor & Statisztika.FérfiakSzáma & vbNewLine Next End Sub 'A statisztika mentése szövegdobozból a statisztika.csv-be Sub StatisztikaMent(ByVal RTB As RichTextBox, ByVal Fájl As String) Dim fs As FileStream Dim sw As StreamWriter 'Fájl megnyitása írásra (FileStrime: fájl folyam) fs = New FileStream(Fájl, FileMode.Create, FileAccess.Write) sw = New StreamWriter(fs, Text.Encoding.Default) 'Szöveg kiírása Egyelőre csak a memóriába sw.Write(RTB.Text) 'Fájl tartalmának kiírása a memóriából(puffer kiürítése) sw.Flush() 'Fájl zárása (hogy a többi program is hozzáférjen) Ez kötelező, mert nyitva marad! sw.Close() End Sub 'A combo box feltöltése nevekkel (Névsor miatt az IndexNév-ből Sub BeolvasListába(ByRef lista As ComboBox) Dim Tanuló As TanulóTípus 'Tanuló nevének tárolása a listában For Each Tanuló In Tanulók lista.Items.Add(Tanuló.Név) Next End Sub #End Region #Region "Rendezés, Indexelés, Bináris keresés" Sub Rendezés(ByRef Tömb() As TanulóTípus, ByVal Szempont As Integer) 'Szempont: 1:Osztály,Név, 2: Születés, 3: Neme, Név, 4: Átlag, 5: Sorszám Dim i, j, t As Integer Dim Tanuló, TanulóMit, TanulóMivel As TanulóTípus Dim mit, mivel As String For i = LBound(Tömb) To UBound(Tömb) For j = i + 1 To UBound(Tömb) 'A legnagyobb megkeresése: A végére a t-ben lesz, hogy melyik indexű a legkisebb. TanulóMit = Tömb(t) TanulóMivel = Tömb(j) Select Case Szempont Case 1 '1:Osztály,Név mit = TanulóMit.Osztály & TanulóMit.Név mivel = TanulóMivel.Osztály & TanulóMivel.Név Case 2 '2: Születés mit = TanulóMit.Született mivel = TanulóMivel.Született Case 3 '3: Neme, Név mit = TanulóMit.Neme & TanulóMit.Név mivel = TanulóMivel.Neme & TanulóMivel.Név Case 4 '4: Átlag mit = TanulóMit.Átlag mivel = TanulóMivel.Átlag Case 5 mit = TanulóMit.Sorszám mivel = TanulóMivel.Sorszám Case 6 '6: Név mit = TanulóMit.Név mivel = TanulóMivel.Név End Select If mit > mivel Then t = j End If Next Tanuló = Tömb(t) Tömb(t) = Tömb(i) Tömb(i) = Tanuló Next End Sub Sub IndexelNév() 'A Tanulók tömböt áttesszük az IndexNév-be és rendezzük Név szerint Dim Tanuló As TanulóTípus Dim i As Integer Erase IndexNév For Each Tanuló In Tanulók ReDim Preserve IndexNév(i) IndexNév(i) = Tanuló i = i + 1 Next Rendezés(IndexNév, 6) End Sub 'A Tömb-ben megkeresi a KeresettNév értéket és visszadja az indexét Function Keresés(ByVal Tömb() As TanulóTípus, ByVal KeresettNév As String) As Integer 'Vissza: -1 ha nincs meg, egyébként az index Dim tól, ig, k As Integer Dim Megvan As Boolean Megvan = False tól = LBound(Tömb) ig = UBound(Tömb) Keresés = -1 Do While Not Megvan And tól <= ig k = tól + Int((ig - tól) / 2) If KeresettNév = Tömb(k).Név Then Megvan = True Keresés = k ElseIf KeresettNév < Tömb(k).Név Then ig = k - 1 ElseIf KeresettNév > Tömb(k).Név Then tól = k + 1 End If Loop End Function #End Region #Region "Statisztika készítés" 'Végigmegy az összes tanulón és meghívja a StatisztikaKészít rutint Sub Statisztika() Dim Tanuló As TanulóTípus Erase OsztályStatisztika For Each Tanuló In Tanulók StatisztikaKészít(Tanuló) Next End Sub 'Az OsztályStatisztika tömbbe kiszámolja a statisztikát Sub StatisztikaKészít(ByVal Tanuló As TanulóTípus) Dim Statisztika As OsztályStatisztikaTípus Dim i As Integer = 0 If IsArray(OsztályStatisztika) Then 'Nem üres az OsztályStatisztika tömb For i = LBound(OsztályStatisztika) To UBound(OsztályStatisztika) Statisztika = OsztályStatisztika(i) If Statisztika.Osztály = Tanuló.Osztály Then 'Van ilyen osztály StatisztikaTárol(Statisztika, Tanuló, False, i) 'Kilépés a rutinból Exit Sub End If Next 'Még nem volt ilyen osztály a statistzika tömbben StatisztikaTárol(Statisztika, Tanuló, True, i) Else 'Még nincs Osztály az OsztályStatisztika tömbben, készít egyet. StatisztikaTárol(Statisztika, Tanuló, True, i) End If End Sub 'Tárolja a statisztikát Sub StatisztikaTárol(ByVal Statisztika As OsztályStatisztikaTípus, ByVal Tanuló As TanulóTípus, ByVal Új As Boolean, ByVal i As Integer) 'Új: True: még üres tömb, vagy még nem volt ilyen osztály 'i: Az Osztálystatisztika tömb melyik elemében kell tárolni a statisztikát If Új Then 'Még üres a tömb, vagy még nem volt ilyen osztály Statisztika.Osztály = Tanuló.Osztály Statisztika.OsztályLétszám = 1 Statisztika.OsztályÁtlag = Tanuló.Átlag If Tanuló.Neme = "Férfi" Then Statisztika.FérfiakSzáma = 1 Else Statisztika.NőkSzáma = 1 End If 'Az OsztályStatisztika tömböt bővíteni kell ReDim Preserve OsztályStatisztika(i) Else Statisztika.Osztály = Tanuló.Osztály Statisztika.OsztályLétszám = Statisztika.OsztályLétszám + 1 Statisztika.OsztályÁtlag = (Statisztika.OsztályÁtlag * (Statisztika.OsztályLétszám - 1) + Tanuló.Átlag) / Statisztika.OsztályLétszám If Tanuló.Neme = "Férfi" Then Statisztika.FérfiakSzáma = Statisztika.FérfiakSzáma + 1 Else Statisztika.NőkSzáma = Statisztika.NőkSzáma + 1 End If End If OsztályStatisztika(i) = Statisztika End Sub #End Region End Module