none
Como buscar um nome num arquivo .txt RRS feed

  • Pergunta

  • Olá amigos, estou me batendo para buscar um nome num arquivo .txt e coloca-lo num DataGridView.

    O processo de colocar no DataGridView eu já resolvi, o problema que estou encontrando é que os nomes sempre variam seu Len. (número de caracteres)

    Então pergunto, qual o macete utilizado para resolver isso?

    Vejam:

    criei a variável iComp que vai receber o número de caracteres do nome que será colocado no TBoxRecebeNome.text

    nome = TBoxRecebeNome.Text

    iComp = Len(nome)

    Estou me batendo na hora de chamar este nome do arquivo .txt

    If iComp < 10 Then
           iComp = lista(lista.Count - 1).Substring(0, 1)
           nome = lista(lista.Count - 1).Substring(1, iComp)
    End If

    If iComp >= 10 Then
           iComp = lista(lista.Count - 1).Substring(0, 2)
           nomeTenista = lista(lista.Count - 1).Substring(2, iComp)
    End If

    DataGridView1.Rows.Add(num.ToString().PadLeft(3, "0"c), nome)

    Não está dando certo!!!!

    quarta-feira, 13 de outubro de 2021 04:02

Todas as Respostas

  • Durval Teixeira,

       Por favor, você poderia explicar um pouco melhor, está difícil de enteder... exemplos:

       - Pq você separa o tamanho em "> 10" e "< 10"?
       - A variável "lista" é um array que contém o texto que você quer?
       - Você sabe a posição inicial do text? será sempre esta posição ou muda de posição?


    ===========================================
    Lendo e escrevendo em arquivo Textos

    http://www.macoratti.net/vbn_txt.htm
    ===========================================
    VB.NET - Strings : um novo enfoque.

    http://www.macoratti.net/vbn_str.htm
    ===========================================
    VB.NET Substring Examples

    https://thedeveloperblog.com/substring-vbnet
    ===========================================

    []'s,
    Fabio I.
    quarta-feira, 13 de outubro de 2021 12:46
  • Olá Fabio. Por isso minha pergunta é se existe um outro método de pegar dados num arquivo txt, talvez eu esteja usando um método complicado e exista um outro método que não provoca o erro que estou encontrando.

    If iComp < 10 Then
           iComp = lista(lista.Count - 1).Substring(0, 1)
           nome = lista(lista.Count - 1).Substring(1, iComp)
    End If

    If iComp >= 10 Then
           iComp = lista(lista.Count - 1).Substring(0, 2)
           nomeTenista = lista(lista.Count - 1).Substring(2, iComp)
    End If

    Porque maior ou menor que 10?

    Se o Len for menor que 10, ele recebe um valor entre 1 e 9, terá apenas um dígito, por isso a variável iComp é chamada assim:

     iComp = lista(lista.Count - 1).Substring(0, 1)

    Se for maior, recebe um valor entre 10 e 99, terá 2 dígitos. A rotina inteira é essa:

    Imports System.Collections.Generic
    Imports System.Text
    Imports System
    Imports System.IO.File
    Imports System.IO
    Public Class Form1

        Dim lista As New List(Of String)
        Dim nomeTenista As String
        Dim iComp As Integer
        Private Arquivo As String = "C:\Usuario\Home\coluna2.txt"

        Function EscondeTudo()

            'insere nomes
            LbTxInserirNomes.ForeColor = Color.Black
            TBoxRecebeNome.Visible = False
            LbTxInsiraNome.Visible = False
            BtnInsere.Visible = False

            'deleta nomes
            LBTxDeletarNomes.ForeColor = Color.Black
            LbTxDeleteNome.Visible = False
            TBoxDeletaNome.Visible = False
            BtnDeleta.Visible = False

            Return True

        End Function


        Function MostraArquivo()

            Dim num As Integer

            'configura o DataGirdView1
            '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

            DataGridView1.Columns.Clear()

            DataGridView1.Visible = True

            DataGridView1.Size = New Size(370, 1000)

            DataGridView1.Location = New Point(1000, 40)

            'DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize 'determina o tamanho do cabeçalho de forma automática

            'adiciona as colunas
            '**************************************************************************************
            For x = 0 To 1
                DataGridView1.Columns.Add("Col " & x, "Coluna " & x) 'adicionar as colunas
            Next
            '**************************************************************************************
            For v = 0 To 1 'centraliza os dados nas colunas
                DataGridView1.Columns(v).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter 'colunas do cabeçalho
                DataGridView1.Columns(v).DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft 'culunas dos dados nas linhas
            Next
            '**************************************************************************************
            'define a largura das colunas
            DataGridView1.Columns(0).Width = 45 'número sequencial do arquivo
            DataGridView1.Columns(1).Width = 325 'nome do tenista

            '**************************************************************************************
            DataGridView1.Columns(0).HeaderText = "Nº"
            DataGridView1.Columns(1).HeaderText = "Nomes dos Tenistas"

            '**************************************************************************************

            DataGridView1.Columns(1).DefaultCellStyle.ForeColor = Color.Navy

            DataGridView1.RowsDefaultCellStyle.BackColor = Color.Lavender
            DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Beige

            'define a cor do cabeçalho
            Dim style1 As DataGridViewCellStyle = DataGridView1.ColumnHeadersDefaultCellStyle
            style1.BackColor = Color.Aqua
            style1.ForeColor = Color.Black
            style1.Font = New Font(DataGridView1.Font, FontStyle.Bold)
            DataGridView1.DefaultCellStyle.SelectionForeColor = Color.White 'torna branca a cor da fonte quando selecionada
            DataGridView1.DefaultCellStyle.SelectionBackColor = Color.Black 'torna preta a cor da célula quando selecionada
            DataGridView1.DefaultCellStyle.Font = New Font("Arial Black", 12) 'usa a fonte Arial Black no tamanho 9
            DataGridView1.RowHeadersVisible = False 'retira a primeira coluna da grade

            DataGridView1.EnableHeadersVisualStyles = False

            DataGridView1.DefaultCellStyle.ForeColor = Color.Blue 'torna azul a cor dos dados e geral

            'rotina que abre o Arquivo e coloca-o no DataGridView1

            Using sr As StreamReader = File.OpenText(Arquivo)

                Do While sr.Peek() >= 0

                    If lista.Contains(" ") Then
                        lista.Remove(" ")
                    End If

                    num += 1

                    lista.Add(sr.ReadLine)

                    If iComp < 10 Then
                        iComp = lista(lista.Count - 1).Substring(0, 1)
                        nomeTenista = lista(lista.Count - 1).Substring(1, iComp)
                    End If

                    If iComp >= 10 Then
                        iComp = lista(lista.Count - 1).Substring(0, 2)
                        nomeTenista = lista(lista.Count - 1).Substring(2, iComp)
                    End If

                    DataGridView1.Rows.Add(num.ToString().PadLeft(3, "0"c), nomeTenista)

                Loop

            End Using

            Return True

        End Function

        'label do menu
        Private Sub Label1_Click(sender As Object, e As EventArgs) Handles LbTxInserirNomes.Click

            EscondeTudo()

            If LbTxInserirNomes.ForeColor = Color.Black Then
                LbTxInserirNomes.ForeColor = Color.Red
                LbTxInsiraNome.Visible = True
                TBoxRecebeNome.Text = ""
                TBoxRecebeNome.Visible = True
                TBoxRecebeNome.Focus()
                BtnInsere.Visible = True
                Exit Sub
            End If

            LbTxInserirNomes.ForeColor = Color.Red

        End Sub

        'label do menu
        Private Sub Label2_Click(sender As Object, e As EventArgs) Handles LBTxDeletarNomes.Click

            EscondeTudo()

            If LBTxDeletarNomes.ForeColor = Color.Black Then
                LBTxDeletarNomes.ForeColor = Color.Red
                LbTxDeleteNome.Visible = True
                TBoxDeletaNome.Visible = True
                TBoxDeletaNome.Text = ""
                TBoxDeletaNome.Focus()
                BtnDeleta.Visible = True
                Exit Sub
            End If

            LBTxDeletarNomes.ForeColor = Color.Red

        End Sub

        'autocompleta os nomes que constam no arquivo facilitando a sua deleção
        Private Sub TextBox_Enter(sender As Object, e As EventArgs) Handles TBoxDeletaNome.Enter

            Dim MySource As New AutoCompleteStringCollection()

            Using sr As StreamReader = File.OpenText(Arquivo)  'Percorre o arquivo para carregar a lista para o AutoComplete
                Do While sr.Peek() >= 0
                    lista.Add(sr.ReadLine)
                Loop
            End Using

            MySource.AddRange(lista.ToArray)

            TBoxDeletaNome.AutoCompleteCustomSource = MySource
            TBoxDeletaNome.AutoCompleteMode = AutoCompleteMode.Suggest
            TBoxDeletaNome.AutoCompleteSource = AutoCompleteSource.CustomSource

        End Sub

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

            'Menu
            PBoxMenu1.Size = New Size(207, 814)
            PBoxMenu1.Location = New Point(10, 12)
            LbTxInserirNomes.Size = New Size(104, 16)
            LbTxInserirNomes.Location = New Point(33, 73)
            LBTxDeletarNomes.Size = New Size(112, 16)
            LBTxDeletarNomes.Location = New Point(33, 110)
            LbMsgInserido.Location = New Point(376, 140)

            'Inserir Nomes
            LbTxInsiraNome.Size = New Size(215, 16)
            LbTxInsiraNome.Location = New Point(225, 73)
            TBoxRecebeNome.Size = New Size(287, 23)
            TBoxRecebeNome.Location = New Point(426, 70)
            BtnInsere.Location = New Point(719, 70)
            LbMsgInserido.Location = New Point(376, 175)

            'Deletar Nomes
            LbTxDeleteNome.Size = New Size(104, 16)
            LbTxDeleteNome.Location = New Point(219, 73)
            TBoxDeletaNome.Size = New Size(287, 23)
            TBoxDeletaNome.Location = New Point(433, 71)
            BtnDeleta.Location = New Point(725, 71)
            LbMsgTenista.Location = New Point(376, 140)
            LbVarNomeTenista.Location = New Point(460, 140) 'serve para inserido e deletado
            LbMsgDelSucess.Location = New Point(376, 175)

        End Sub

        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

            LbMsgInserido.Visible = False 'esconde: Tenista Inserido com sucesso!!!
            LbMsgTenista.Visible = False 'esconde: Tenista Deletado com sucesso!!!
            LbVarNomeTenista.Visible = False 'esconde o nome do tenista
            LbMsgDelSucess.Visible = False 'esconde: Deletado com Sucesso!!!

        End Sub

        'deleta o nome de um tenista que consta no arquivo coluna2
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles BtnDeleta.Click

            Dim nomeTenista As String

            Dim cont As Integer

            If TBoxDeletaNome.Text = "" Then
                MsgBox("Insira o nome do Tenista a Excluir!!!")
                TBoxDeletaNome.Focus()
                Exit Sub
            End If

            nomeTenista = TBoxDeletaNome.Text
            LbVarNomeTenista.Text = nomeTenista

            Using sr As StreamReader = File.OpenText(Arquivo)
                Do While sr.Peek() >= 0
                    lista.Add(sr.ReadLine) 'carrega a lista atual
                Loop
            End Using

            If lista.Contains(nomeTenista) Or lista.Contains("") Then
                While lista.Contains(nomeTenista) Or lista.Contains("")
                    lista.Remove(nomeTenista) 'se o arquivo contiver nomeTenista, remove-o
                    lista.Remove("") 'se o arquivo contiver espaços em branco, remove-os
                End While
                File.Delete(Arquivo)

                cont += 1

                Using sw As FileStream = File.Create(Arquivo)
                End Using

                For i = 0 To lista.Count - 1
                    Using sw As StreamWriter = File.AppendText(Arquivo)
                        sw.WriteLine(lista(i))
                    End Using
                Next

            End If

            If cont = 0 Then
                MsgBox("O tenista " & nomeTenista & " não consta no arquivo!!!")
                TBoxDeletaNome.Clear()
                TBoxDeletaNome.Focus()
                Exit Sub
            End If

            MostraArquivo()

            DataGridView1.Visible = True

            LbMsgTenista.Visible = True 'mostra a palavra: "Tenista"

            LbVarNomeTenista.Visible = True 'mostra o nome do tenista que foi deletado

            LbMsgDelSucess.Visible = True 'mostra: Deletado com Sucesso!!!

            TBoxDeletaNome.Clear()
            TBoxDeletaNome.Focus()

            Timer1.Interval = 3000 'intervalo de 3 segundos
            Timer1.Start() 'dispara o timer

        End Sub

        'insere o nome de um novo tenista no arquivo coluna2
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BtnInsere.Click

            If TBoxRecebeNome.Text = "" Then
                MsgBox("Insira o nome de um novo Tenista!!!")
                TBoxRecebeNome.Focus()
                Exit Sub
            End If

            nomeTenista = TBoxRecebeNome.Text

            iComp = Len(nomeTenista)

            LbVarNomeTenista.Text = nomeTenista

            Using sr As StreamReader = File.OpenText(Arquivo)
                Do While sr.Peek() >= 0
                    lista.Add(sr.ReadLine) 'carrega a lista atual 
                    lista.Remove("")
                Loop
            End Using

            If lista.Contains(nomeTenista) Then

                While lista.Contains(nomeTenista)
                    MsgBox("O nome:  " & nomeTenista & " já consta no arquivo!!!")
                    TBoxRecebeNome.Clear()
                    TBoxRecebeNome.Focus()
                    Exit Sub
                End While

                Using sw As FileStream = File.Create(Arquivo)
                End Using

                For i = 0 To lista.Count - 1
                    Using sw As StreamWriter = File.AppendText(Arquivo)
                        sw.WriteLine(lista(i))
                        lista.Remove("")
                    End Using
                Next

            End If

            File.AppendAllText(Arquivo, iComp & nomeTenista + vbCrLf) 'insere o nome do tenista na última linha do arquivo culuna2.txt

            DataGridView1.Visible = True

            MostraArquivo()

            TBoxRecebeNome.Clear()
            TBoxRecebeNome.Focus()

            LbMsgTenista.Visible = True 'mostra a palavra: "Tenista"

            LbVarNomeTenista.Visible = True 'mostra o nome do tenista que foi deletado

            LbMsgInserido.Visible = True 'mostra "Inserido com Sucesso!!!"

            Timer1.Interval = 3000 'intervalo de 3 segundos
            Timer1.Start() 'dispara o timer

        End Sub

    End Class

    quarta-feira, 13 de outubro de 2021 21:05
  • Durval,

        Eu recriei aqui seu formulário e apresentou isto (abra a imagem em uma nova guia):


        Eu não encontrei um erro, mas ele não consegue identificar que já existe o nome dentro do arquivo texto:

    5teste
    5teste
    5teste

       O que exatamente o formulário tem que fazer, qual é a finalidade do formulário?

    []'s,
    Fabio I.

    • Editado Fabio I sexta-feira, 15 de outubro de 2021 12:54
    sexta-feira, 15 de outubro de 2021 12:44