Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: tiedostosta luku

Sivun loppuun

Elko [20.11.2011 13:08:55]

#

Olen yrittänyt tehdä Visual Basicilla seuraavaa, mutta en saa sitä vain toimimaan. Voisiko joku kertoa miten tuollainen onnistuisi?

Ohjelman pitäisi tehdä seuraavaa:

Ohjelma kysyy koska numerot x, x ja x (x= numero 1-10) on esiintynyt viimeksi? Esimerkiksi numerot 1,5,8.
Ohjelma käy esim. tekstitiedostosta läpi siellä olevat numerot (kierrokset) ja kertoo milloin ne ovat viimeksi esiintyneet.

samip [20.11.2011 13:31:21]

#

Koulutehtävä(?) -> oma koodi esiin niin joku voi auttaa siitä eteenpäin.

Triton [20.11.2011 15:09:19]

#

Elko kirjoitti:

Ohjelma käy esim. tekstitiedostosta läpi siellä olevat numerot (kierrokset) ja kertoo milloin ne ovat viimeksi esiintyneet.

Juurihan itse kerroit ratkaisun. Käyt sen tektitiedoston läpi ja vertailet arvoja haettavaan dataan...

Elko [20.11.2011 16:20:26]

#

Tällaisen koodin pätkän löysin jonka pohjalta ajattelin saada sen toimimaan, mutta en saa tätäkään toimimaan. Käsittääkseni tämän koodin pitäisi lukea tuo testi.txt tiedosto ja tulostaa kaikki siellä oleva MsgBoxiin.

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer, r As String
Open "c:\temp\testi.txt" For Input As #1
        For i = 1 To 5
   Input #1, r
            MsgBox(r)
        Next
Close #1
    End Sub
End Class

Grez [20.11.2011 16:49:41]

#

Tuon pitäisi lukea 5 kertaa tiedostosta pilkkuun tai rivivaihtoon asti ja näyttää luettu msgboxilla. Jos tiedosto on pidempi kuin 5 riviä, niin se ei tietenkään näytä kaikkea. Jos taas tiedosto on liian lyhyt niin se antaa virheilmoituksen.

Mutta ongelma lienee se, että tuolla Subissa oleva koodi on VB6 syntaksilla, kun Subin rakenteesta päätellen koodaat VB.Netillä. Kannattaa etsiä sellaisia esimerkkejä, jotka on VB.Netille.

jalski [20.11.2011 16:58:58]

#

Itse lukisin varmaan StreamReader:illa tiedostosta rivin kerrallaan ja käsittelisin rivin halutulla tavalla.

neau33 [20.11.2011 19:25:27]

#

Moi Elko!

tässä esimerkkiviritelmä VB.NET:lle

'VB.NET esimerkki

'Lomakkeelle:
'2 TextBox kontrollia(TextBox1 & TextBox2)
'1 CheckBox kontrolli (CheckBox1)
'1 Komentopainke (Button1)
'1 OpenFileDialog (OpenFileDialo1)
'1 MenuStrip kontrolli (MenuStrip1)

'Syötä haettavat numerot pilkulla
'erotettuna TextBox1 kontrolliin

Public Class Form1

   Private vrivi() As Integer
   Private positio() As Integer
   Private numerot() As String
   Private tiedostorivit() As String

   Private Sub Form1_Load(sender As System.Object, _
   e As System.EventArgs) Handles MyBase.Load

      OpenFileDialog1.DefaultExt = "*.txt"
      OpenFileDialog1.Filter = "Tekstitiedosto (*.txt) |*.txt"
      OpenFileDialog1.CheckPathExists = True
      OpenFileDialog1.InitialDirectory = _
      Environment.GetFolderPath( _
      Environment.SpecialFolder.MyDocuments)
      OpenFileDialog1.Multiselect = False
      OpenFileDialog1.RestoreDirectory = True
      OpenFileDialog1.FileName = String.Empty
      TextBox2.Multiline = True
      TextBox2.ReadOnly = True

   End Sub

   Private Sub AvaaToolStripMenuItem_Click(sender As System.Object,
   e As System.EventArgs) Handles AvaaToolStripMenuItem.Click

      OpenFileDialog1.FileName = String.Empty
      OpenFileDialog1.ShowDialog()

   End Sub

   Private Sub OpenFileDialog1_FileOk( _
   sender As System.Object, _
   e As System.ComponentModel.CancelEventArgs) _
   Handles OpenFileDialog1.FileOk

      If Not OpenFileDialog1.FileName.ToLower.EndsWith(".txt") Then
         OpenFileDialog1.FileName = String.Empty
      End If

   End Sub

   Private Sub Button1_Click(sender As System.Object, _
   e As System.EventArgs) Handles Button1.Click

      TextBox2.Clear()

      If TextBox1.Text = String.Empty Then
         TextBox1.Focus(): Exit Sub
      End If

      Try
         FileOpen(1, OpenFileDialog1.FileName, _
         OpenMode.Input, OpenAccess.Read)

         Dim temp As String = InputString( _
         1, CType(LOF(1), Integer)).Replace( _
         Chr(13), CType("", Char)): FileClose(1)

         If temp.Trim = String.Empty Then
            MsgBox("Ei käsiteltävää dataa"): Exit Sub
         End If

         If temp.Contains(Chr(10)) Then
            tiedostorivit = temp.Split(Chr(10))
         Else
            ReDim tiedostorivit(0)
            tiedostorivit(0) = temp
         End If

         temp = Nothing
      Catch ex As Exception
         MsgBox(ex.Message) : Exit Sub
      End Try

      If TextBox1.Text.Contains(",") Then
         numerot = TextBox1.Text.Split(",".ToCharArray)
         ReDim vrivi(numerot.GetUpperBound(0))
         ReDim positio(numerot.GetUpperBound(0))
      Else
         ReDim vrivi(0)
         ReDim positio(0)
         ReDim numerot(0)
         numerot(0) = TextBox1.Text
      End If

      TextBox1.Clear()

      For i As Integer = 0 To tiedostorivit.Length - 1

         For j As Integer = 0 To numerot.Length - 1

            If tiedostorivit(i).Contains(numerot(j)) Then

               If CheckBox1.Checked Then

                  If tiedostorivit(i).StartsWith(numerot(j) + " ")  Then
                     vrivi(j) = i + 1
                     positio(j) = 1
                  Énd If

                  If tiedostorivit(i).Contains(" " + numerot(j) + " ") Then
                     vrivi(j) = i + 1
                     positio(j) = tiedostorivit(i) _
                     .LastIndexOf(" " + numerot(j) + " ") + 2
                  End If

                  If tiedostorivit(i).EndsWith(" " + numerot(j)) Then
                     vrivi(j) = i + 1
                     positio(j) = tiedostorivit(i). _
                     LastIndexOf(numerot(j)) + 1
                  End If

               Else
                  vrivi(j) = i + 1
                  positio(j) = tiedostorivit(i). _
                  Length - numerot(j).Length + 1
               End If

            End If

         Next j

      Next i

      For i As Integer = 0 To numerot.GetUpperBound(0)

         If vrivi(i) > 0 Then

            Dim selite1 As String = String.Empty
            Dim selite2 As String = String.Empty

            If CheckBox1.Checked Then
               selite1 = "luku "
            Else
               selite1 = "numero "
            End If

            If numerot(i).Length > 1 Then
               selite2 = "  (merkit " + positio(i).ToString _
               + "-" + _
               (positio(i) + numerot(i).Length - 1).ToString + ")"
            Else
               selite2 = "  (" + (positio(i)).ToString + ". merkki)"
            End If
            TextBox2.Text += selite1 + numerot(i).ToString + _
            " esiintyi viimeksi rivillä " & (vrivi(i)).ToString + _
            selite2 + Environment.NewLine + Environment.NewLine

         End If

      Next i

      '(NÄYTÄ MYÖS HAKUNUMEROT)...
      If TextBox2.TextLength > 0 Then

         Dim näytä As String = "Hakunarvot: "
         Dim määrä As Integer = numerot.GetUpperBound(0)

         Select Case määrä
            Case 0
               näytä += numerot(0) + "  "
            Case 1
               näytä += numerot(0) + " ja " + numerot(1) + "  "
            Case Is > 1
               For i As Integer = 0 To määrä

                  If i > 0 And i < määrä Then
                     näytä += ", "
                  ElseIf i = määrä Then
                     näytä += " ja "
                  End If
                  näytä += numerot(i)
               Next i
               näytä += "  "
         End Select

         TextBox2.Text = näytä + vbCrLf + TextBox2.Text

      End If
      '...

      '(KAIKKI SAMALLE RIVILLE)
      TextBox2.Text = TextBox2.Text.Replace( _
      vbCrLf.ToCharArray, " ".ToCharArray)

      '(TÄMÄ RIVI TÄHÄN KOHTAAN)
      Erase numerot, tiedostorivit

   End Sub

   Private Sub TextBox1_TextChanged(sender As System.Object, _
   e As System.EventArgs) Handles TextBox1.TextChanged

      TextBox1.Text = VainSallitut(TextBox1.Text, False)
      TextBox1.SelectionStart = TextBox1.Text.Length

   End Sub

   Private Sub TextBox1_Leave(sender As System.Object, _
   e As System.EventArgs) Handles TextBox1.Leave

      TextBox1.Text = VainSallitut(TextBox1.Text, True)

   End Sub

   Private Sub TextBox1_MouseUp(sender As System.Object, _
   e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp

      TextBox1.Text = VainSallitut(TextBox1.Text, False)
      TextBox1.SelectionStart = TextBox1.Text.Length

   End Sub

   Private Sub TextBox2_Enter(sender As System.Object, _
   e As System.EventArgs) Handles TextBox2.Enter

      Button1.Focus()

   End Sub

   Function  VainSallitut(teksti As String, poista As Boolean) As String

      If teksti = "," Then
         teksti = ""
      End If

      teksti = teksti.Replace( _
      ",,".ToCharArray, ",".ToCharArray)

      For i As Integer = 0 To teksti.Length - 1
         If Not "1234567890,".Contains(teksti.Substring(i, 1)) Then
            teksti = teksti.Replace(teksti.Substring( _
            i, 1).ToCharArray, "".ToCharArray )
         End If
      Next i

      If poista And teksti.Length > 1 Then

         If teksti.Substring(teksti.Length - 1, 1) = "," Then
            teksti = teksti.Substring(0, teksti.Length - 1)
         End If

      End If

      Return teksti

   End Function

End Class

vastaava VB6 viritelmä

Elko [21.11.2011 14:50:52]

#

Missä muodossa numerot pitää olla tekstitiedostossa? En saanut ainakaan vielä toimimaan ohjelmaa. Mitä noihin muihin tulee (TextBox2, CheckBox ja Button1)?

neau33 [21.11.2011 15:33:57]

#

Moi taas Elko!

ASCII muodossa elikä tee tekstitiedosto esim. notepad ohjelmalla, ja tallenna se työpöydälle nimellä tiedosto.txt.

TextBox1 kontrolliin kirjoitetaan haettavat numerot. Jos haetaan useita eri numeroita niin numerot on erotettava pilkulla (esim 1,21,1001,jne.)

TextBox2 kontrollin tekstiksi ilmestyy valitsemiesi numeroiden viimeisin sijainti tekstitiedostossa (rivinumero/sijainti rivillä).

CheckBox'lla valitaan hakuperuste (etsitäänkö tekstistä valittuja numeroita myös numerosarjojen sisältä esim. sarja 10 löyttyy luvun 2101 sisältä vai tuleeko etsittävien numeroiden olla 'kokonaisia' 10 = väliyönti10välilyönti).

Button1 kontrollilla laukaistaan haku.

halutessasi voit impata täältä koko VB.NET esimerkkiprojektin.

Elko [21.11.2011 20:48:51]

#

Tämä ohjelma toimi, kiitos! Nyt pitäs vielä vaan keksiä miten sen saa sellaiseksi että kaikki numerot jotka siihen syötetään olisi ilmestyttävä samalla rivillä ennenkuin se kertoo tuloksen.

Elko [22.11.2011 12:58:48]

#

Kopioin .net koodin Microsoft Visual Basic 2010 Epress:iin ja käyynistin ohjelman, mutta tuli tällainen: A first chance exception of type 'System.NullReferenceException' occurred in GetLastNumberPosition.exe

Oon ihan uuno näitten kanssa :(

neau33 [22.11.2011 19:55:34]

#

Moi taas Elko!

Sori, oli mun moka elikä katso jälleen edellisen esimerkin Button1_Click tapahtumakoodiin tekemääni muutosta: '(TÄMÄ RIVI TÄHÄN KOHTAAN).

Elko [23.11.2011 06:39:24]

#

Moi!

Nyt tuli tällainen:

Error 1 'TextReplace' is not a member of 'System.Windows.Forms.TextBox'.

neau33 [23.11.2011 07:43:09]

#

Moi taas Elko!

näköjään hukkasin editoidessa pisteen Text ja Replace välistä

'(KAIKKI SAMALLE RIVILLE)
textBox2.Text = textBox2.Text.Replace( _
vbCrLf.ToCharArray, " ".ToCharArray)

-Nea-

Elko [23.11.2011 09:35:16]

#

Nyt se toimii:) Vain yksi ihmetyksen aihe: Kun kokeilin jotain numeroyhdistelmää niin se sanoi että se esiintyy rivillä 11 vaikka työpyödälläni olevassa tiedosto.txt tiedostossa ei ole edes rivejä kuin 6.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta