Stop a pokračovat txt soubor   otázka

VB.NET

Ahoj.

Chtěl bych se zeptat... mám třeba v txt souboru

Lukáš

Pukáš

Vojta

Karel

**Další**

Míč

Pálka

Kopačky

no a tady je otázka:

Šlo by udělat to, že by se ty jmena nacetli treba do listboxu a zastavilo by se to u **Další** a dál by to nepokracovalo.

A ještě aby se mi načetli ty věci ALE DO listboxu2 od toho **Další**

Tohle mě vrtá hlavou a nemohu na to přijít

Předem moc děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na formuláři mám tlačítko Button, 2× ListBox a komponentu OpenFileDialog (tu můžete přeskočit, viz komentáře).

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Otevře OpenFileDialog a nechá uživatele vybrat soubor.
    ' Pokud nechcete zobrazovat OpenFileDialog, smažte následující řádek a "End If" dole před "End Sub" - tedy tuto vnější podmínku.
    ' Budete pak muset nahradit OpenFileDialog1.FileName nějakou jinou proměnnou s názvem souboru a nebo přímo textovým řetězcem (což byste neměl).
    If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
      ' Tato proměnná značí, jestli přidávat do prvního (True) nebo do druhého (False) ListBoxu, tedy jestli už jsme narazili na řádek "**Další**".
      Dim další As Boolean = False
      ' Projedeme všechny řádky v souboru a přidáváme.
      For Each řádek In System.IO.File.ReadAllLines(OpenFileDialog1.FileName)
        If řádek = "**Další**" Then ' Buď jsme narazili na řádek "**Další**" a nic nepřidáme, ale přepneme…
          další = Not další ' Tohle přepíná mezi True a False, když uvedete další 2×, bude to ListBox2, ListBox1 a pak zase ListBox2, kam se přidává.
        ElseIf další Then ' …nebo na jiný řádek a podle toho přidáme.
          ListBox2.Items.Add(řádek)
        Else
          ListBox1.Items.Add(řádek)
        End If
      Next
    End If
  End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tady je kousek kódu

If IO.File.Exists(zjistit) Then  'Pokud zjisti ze soubor existuje tak nacte soubor
            log(cas2 & "Program obnoven") 'To je nepodstatne :)
            Dim soubor2 As New IO.StreamReader(zjistit) 'V zjistit je cesta k txt souboru
            soubor2.ReadLine()                   'Tohle to musí takhle být na začátku
            Label3.Text = soubor2.ReadLine       '¨Proto to chci , aby se to neopakovalo
            soubor2.ReadLine()
            Label4.Text = soubor2.ReadLine
            soubor2.ReadLine()
            soubor2.ReadLine()

            While Not soubor2.EndOfStream 'A tady se to bude opakovat až dokonce
                Dim jmeno As String = soubor2.ReadLine
                Dim trida As String = soubor2.ReadLine
                Dim prichod As String = soubor2.ReadLine
                Dim odchod As String = soubor2.ReadLine
                Dim duvod As String = soubor2.ReadLine
                Dim a As String = soubor2.ReadLine
                Dim polozka As New ListViewItem

                polozka.Text = jmeno
                polozka.SubItems.Add(trida)
                polozka.SubItems.Add(prichod)
                polozka.SubItems.Add(odchod)
                polozka.SubItems.Add(duvod)
                ListView2.Items.Add(polozka)

                TreeView1.Enabled = True
                Button1.Enabled = True

                Button3.Enabled = True



            End While

            soubor2.Close()

No a nevím, kam to vsunout :D

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Má data vypadají takto:

# Tento řádek je považovaný za prázdný podle formátu souboru.
lbl3
# Tento řádek je považovaný za prázdný podle formátu souboru.
lbl4
# Tento řádek je považovaný za prázdný podle formátu souboru.
# Tento řádek je považovaný za prázdný podle formátu souboru.
# Tento řádek je považovaný za prázdný (nebo tu musí být **Řádek**) podle formátu souboru.
Jméno1
Třída1
Příchod1
Odchod1
Důvod1
A1
# Tento řádek je považovaný za prázdný (nebo tu musí být **Řádek**) podle formátu souboru.
Jméno2
Třída2
Příchod2
Odchod2
Důvod2
A2
**Další**
Jméno3
Třída3
Příchod3
Odchod3
Důvod3
A3
# Tento řádek je považovaný za prázdný (nebo tu musí být **Řádek**) podle formátu souboru.
Jméno4
Třída4
Příchod4
Odchod4
Důvod4
A4
**Další**
Jméno5
Třída5
Příchod5
Odchod5
Důvod5
A5
# Tento řádek je považovaný za prázdný (nebo tu musí být **Řádek**) podle formátu souboru.
Jméno6
Třída6
Příchod6
Odchod6
Důvod6
A6

A kód jsem upravil takto:

Public Class Form1

  ' Třída držící vlastnosti jednoho záznamu jako celek.
  Private Class Záznam
    Public Property Jméno As String
    Public Property Třída As String
    Public Property Příchod As String
    Public Property Odchod As String
    Public Property Důvod As String
    Public Property A As String
    ' Konstruktor pro načtění záznamu z StreamReaderu.
    Public Sub New(streamReader As IO.StreamReader)
      Me.Jméno = streamReader.ReadLine()
      Me.Třída = streamReader.ReadLine()
      Me.Příchod = streamReader.ReadLine()
      Me.Odchod = streamReader.ReadLine()
      Me.Důvod = streamReader.ReadLine()
      Me.A = streamReader.ReadLine()
    End Sub
    ' Konstruktor pro vytvoření záznamu z hodnot parametrů.
    Public Sub New(jméno As String, třída As String, příchod As String, odchod As String, důvod As String, a As String)
      Me.Jméno = jméno
      Me.Třída = třída
      Me.Příchod = příchod
      Me.Odchod = odchod
      Me.Důvod = důvod
      Me.A = a
    End Sub
    ' Toto zajistí, že se v ListBoxu nezobrazí jméno typu (tato třída), ale náš vlastní text.
    Public Overrides Function ToString() As String
      Return Me.Jméno
    End Function
  End Class

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim filePath = "C:\Users\Tomáš\Downloads\Data.txt"
    If IO.File.Exists(filePath) Then
      ' Logování zde.
      Using streamReader As New IO.StreamReader(filePath)
        ' Přečtení hlavičky:
        streamReader.ReadLine() ' Zahodit prázdný řádek.
        Label3.Text = streamReader.ReadLine()
        streamReader.ReadLine() ' Zahodit prázdný řádek.
        Label4.Text = streamReader.ReadLine()
        streamReader.ReadLine() ' Zahodit prázdný řádek.
        streamReader.ReadLine() ' Zahodit prázdný řádek.
        ' Přečtení těla:
        Dim switch = False
        While Not streamReader.EndOfStream
          ' Tady je buď literál "**Další**" a nebo prázdný řádek (!), nemůže tady být další nebo hned data záznamu,
          ' protože by to zbytečně komplikovalo načítání záznamu. Neuvedl jste přesně, jak vypadají Vaše data, tak
          ' předpokládám, že je to možné.
          Dim line = streamReader.ReadLine()
          If line = "**Další**" Then
            switch = Not switch
            'ElseIf String.IsNullOrWhiteSpace(line) Then
            '  ' Řádek je prázdný, neměníme ListBox a načítáme dál.
            'Else
            '  Throw New Exception("Soubor není ve správném formátu! Očekáván literál **Další** nebo prázdný řádek.")
          End If
          ' Předchozí řádek je vždy buď další a nebo prázdný (technicky může být buď **Další** nebo cokoliv) a následují data.
          ' Pokud chcete vynutit, aby bylo "**Další**" nebo prázdný řádek, odkomentujte druhou podmínku.
          Dim záznam = New Záznam(streamReader)
          If switch Then
            ListBox2.Items.Add(záznam)
          Else
            ListBox1.Items.Add(záznam)
          End If
          ' Tady si můžete individuálně nastavit TreeView, Buttony apod., pokud jejich stavy závisí na této konkrétní položce.
        End While
        ' Tady si můžete individuálně nastavit TreeView, Buttony apod., pokud jejich stavy nezávisí na položkách.
        ' A nebo tady můžete projíždět ListBoxy a rozhodovat se pohle nich. Položku z ListBoxu musíte přetypovat na typ Záznam.
        streamReader.Close()
      End Using
    End If
  End Sub

End Class

Vydáváte se nebezpečnou cestou, definovat si vlastní formát souboru. Pokud zvážíte použití XML, určitě to ničemu neuškodí. Takto musíme mít relativně složité parsovací mechanismy na vlastní formát souboru a buď striktně vyžadovat přesný formát a nebo udělat odpouštěcí parser, což je ještě složitější. Minimálně dejte souboru nějakou obskurní příponu, ne TXT jako já, abyste odrazil alespoň ty úplně nejvíc neznalé badatele, kteří by se rozhodli editovat soubor mimo Vaší aplikaci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, že jste si dal práci mi to napsat, jenže...

Ano, vím že se vydávám špatnou cestou, ale jsem začátečník

Teď s pravdou ven.

Ten listbox byl příklad, ale teď napíšu vše a popíšu co přesně potřebuji.

Jak jsem psal... mám tenhle kód

If IO.File.Exists(zjistit) Then
            log(cas2 & "Program obnoven")
            Dim soubor2 As New IO.StreamReader(zjistit)
            soubor2.ReadLine() 'Tady přečte jen ty hvězdičky
            Label3.Text = soubor2.ReadLine 'jmeno recepcni
            soubor2.ReadLine() 'Tady přečte jen A
            Label4.Text = soubor2.ReadLine 'jmeno recepcni
            soubor2.ReadLine()'Tady přečte jen ty hvězdičky
            soubor2.ReadLine()

            While Not soubor2.EndOfStream
                Dim jmeno As String = soubor2.ReadLine
                Dim trida As String = soubor2.ReadLine
                Dim prichod As String = soubor2.ReadLine
                Dim odchod As String = soubor2.ReadLine
                Dim duvod As String = soubor2.ReadLine
                Dim a As String = soubor2.ReadLine 'To jsou ty rovnítka
                Dim polozka As New ListViewItem

                polozka.Text = jmeno
                polozka.SubItems.Add(trida)
                polozka.SubItems.Add(prichod)
                polozka.SubItems.Add(odchod)
                polozka.SubItems.Add(duvod)
                ListView2.Items.Add(polozka)

                TreeView1.Enabled = True
                Button1.Enabled = True

                Button3.Enabled = True



            End While

            soubor2.Close()
        Else
            Form2.Button2.Enabled = False
            Form2.ShowDialog()

        End If

A tuhle databázi txt

************RECEPCE************
Jmeno recepci
A
Jmeno recepci
************RECEPCE************

Příjmení
 HT1
13:13:25
 --- 
Důvod
=========================================
Příjmení 
 HT1
13:13:28
 --- 
Důvod
=========================================
Příjmení
 HT1
13:13:32
 --- 
Důvod
=========================================

************Návštěva**********

Příjmení
13:15:32
 ---
Důvod
=========================================
Příjmení
13:15:32
 ---
Důvod

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A mám Listview1 http://prntscr.com/1mwv48 a listview2 http://prntscr.com/1mwv67

na listview1 jen ten kód, který je nahoře, to funguje, ale teď potřebuji, aby se po ****Návštěva***** se zapisoval do listview2

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Absolutně nechápu, jak mají nakonec vypadat Vaše datové objekty. Pojďme to projít tak, aby se s tím dalo něco dělat: Jste nucen pracovat s nějakou už existující množinou dat (jako uvádíte v příkladě) a pokud ano, musí ta množina dat mít tenhle formát? Pokud ano, pomůžu Vám to parsovat, pokud ne, navrhuji formát dat změnit. V obou případech budu potřebovat podrobnější popis, co se vlastně děje. Jestli to chápu dobře, ten textový soubor obsahuje několik objektů prvního typu (Příjmení, Jméno, Třída, Příchod, Odchod, Důvod) a několik objektů druhého typu (Příjmení, Jméno, Příchod, Odchod, Důvod). A vy máte hlavičku s informacemi o recepci, pak první sadu dat typu prvního objektu a pak druhou sadu dat typu druhého objektu. Mám pravdu? Dejte vědět, jestli už máte nějaká existující data a, jestli je možné změnit typ datového souboru. Pokud ano, tak to napíšeme jinak, nejlépe pomocí XML a s nějakými třídami, které budou data reprezentovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nebude lepší si o tom popovídat po skypu či ICQ? To je na dlouho, aspoň se přiučím, moc prosím

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Napište sem svůj e-mail a já Vás budu kontaktovat. Berte ale na vědomí, že mám omezené časové možnosti, takže nemůžu nabídnout víc, než základní analýzu po tom, co mi přesně popíšete zadání a pomůžu Vám implementovat řešení, ke kterému dojdeme.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

[email protected] ale lepší by bylo komunikovat přes skype

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem to udělal pomocí pole, ti co nevědí, jak to udělat tak sem dám příklad

V txt databázy mám

Z	BLA	HT1	10:00:00	---	ASDASD
Z	BA	HT1	10:00:00	---	ASDASD
Z	BL	HT1	10:00:00	---	ASDASD
N	BL	10:00:00	---	ASDASD

a v kódu je

While Not soubor2.EndOfStream

Dim clovek(5) As String 'Max počet polí

Dim radek = soubor2.ReadLine

clovek = Split(radek, vbTab) 'Rozdělí tabulátorem

If clovek(0) = "Z" Then 'Pokud na začátku je písmeno Z, tak

Dim jmeno As String = clovek(1)

Dim trida As String = clovek(2)

Dim prichod As String = clovek(3)

Dim odchod As String = clovek(4)

Dim duvod As String = clovek(5)

Dim polozka As New ListViewItem

polozka.Text = jmeno

polozka.SubItems.Add(trida)

polozka.SubItems.Add(prichod)

polozka.SubItems.Add(odchod)

polozka.SubItems.Add(duvod)

ListView2.Items.Add(polozka)

ElseIf clovek(0) = "N" Then 'Ale pokud je na začátku písmeno N, tak

Dim host_jmeno = clovek(1)

Dim host_prichod As String = clovek(2)

Dim host_odchod As String = clovek(3)

Dim host_duvod As String = clovek(4)

Dim polozka As New ListViewItem

polozka.Text = host_jmeno

polozka.SubItems.Add(host_prichod)

polozka.SubItems.Add(host_odchod)

polozka.SubItems.Add(host_duvod)

ListView1.Items.Add(polozka)

End If

End While

soubor2.Close()

nahlásit spamnahlásit spam 0 odpovědětodpovědět
While Not soubor2.EndOfStream

Dim clovek(5) As String 'Max počet polí

Dim radek = soubor2.ReadLine

clovek = Split(radek, vbTab) 'Rozdělí tabulátorem

If clovek(0) = "Z" Then 'Pokud na začátku je písmeno Z, tak

Dim jmeno As String = clovek(1)

Dim trida As String = clovek(2)

Dim prichod As String = clovek(3)

Dim odchod As String = clovek(4)

Dim duvod As String = clovek(5)

Dim polozka As New ListViewItem

polozka.Text = jmeno

polozka.SubItems.Add(trida)

polozka.SubItems.Add(prichod)

polozka.SubItems.Add(odchod)

polozka.SubItems.Add(duvod)

ListView2.Items.Add(polozka)

ElseIf clovek(0) = "N" Then 'Ale pokud je na začátku písmeno N, tak

Dim host_jmeno = clovek(1)

Dim host_prichod As String = clovek(2)

Dim host_odchod As String = clovek(3)

Dim host_duvod As String = clovek(4)

Dim polozka As New ListViewItem

polozka.Text = host_jmeno

polozka.SubItems.Add(host_prichod)

polozka.SubItems.Add(host_odchod)

polozka.SubItems.Add(host_duvod)

ListView1.Items.Add(polozka)

End If

End While

soubor2.Close()
nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback