Jump to content
kanixe

Ler partes da linha num ficheiro txt

Recommended Posts

kanixe

Boas, ando aqui a experimentar ler um txt, já tenho aqui a função para ler linhas, lineIn = oRead.ReadLine(), mas o que queria mesmo era ler partes dal inha, do género:

linha:

2 3 6 2 5 7

ler por exemplo só o 6.

Cumps

Share this post


Link to post
Share on other sites
bioshock

Os meus ficheiros txt são sempre delimitados por ";".

Ora, se tiveres um ficheiro com o seguinte conteúdo: Porto;Maia;4470; - para apanhares os dados correctamente, podes utilizar este código:

If File.Exists(pathTxt) Then
           Using ler As New StreamReader(pathTxt)
                While Not ler.EndOfStream
                    Dim Linha As String() = ler.ReadLine().Split(";"c)
                    Msgbox(Linha(0)) ' Porto
                    Msgbox(Linha(1)) ' Maia
                    Msgbox(Linha(2)) ' 4470
                End While
            End Using
        End If

Share this post


Link to post
Share on other sites
kanixe

Os meus ficheiros txt são sempre delimitados por ";".

Ora, se tiveres um ficheiro com o seguinte conteúdo: Porto;Maia;4470; - para apanhares os dados correctamente, podes utilizar este código:

If File.Exists(pathTxt) Then
           Using ler As New StreamReader(pathTxt)
                While Not ler.EndOfStream
                    Dim Linha As String() = ler.ReadLine().Split(";"c)
                    Msgbox(Linha(0)) ' Porto
                    Msgbox(Linha(1)) ' Maia
                    Msgbox(Linha(2)) ' 4470
                End While
            End Using
        End If

não posso utilizar onde tens ; o espaço?

Já agora, também resolvia o problema com uma função que parta a string lida na linha. Sabes alguma função para isso?

cumps

Share this post


Link to post
Share on other sites
bioshock

Com o espaço é complicado, isto porque podes ter no distrito: Viana do Castelo. Mas se apenas tiveres espaços em específicos casos (ex: aeiou sapo ptnet) em principio funcionará.

Terás (não testado) de alterar o ";" para:

space(1)

Relativamente à ultima questão, queres dar um enter na linha?

vbNewLine

Share this post


Link to post
Share on other sites
kanixe

Com o espaço é complicado, isto porque podes ter no distrito: Viana do Castelo. Mas se apenas tiveres espaços em específicos casos (ex: aeiou sapo ptnet) em principio funcionará.

Terás (não testado) de alterar o ";" para:

space(1)

Relativamente à ultima questão, queres dar um enter na linha?

vbNewLine

não. entao é assim. na string de cada linha, as primeiras words são coordenadas, por isso nao têm espaços entre a informação, e é só isso que eu quero ler. portanto, é possível por exemplo, ter a string da linha, e ver apenas as primeiras duas palavras? há alguma função de strigs para isso? É que depois é fácil.

cumps e muito obrigado pel ajuda! a ver se despacho isto!

Share this post


Link to post
Share on other sites
bioshock

O que tu queres está no exemplo que em cima te coloquei. Btw, dá-nos um exemplo da tua string.

Share this post


Link to post
Share on other sites
kanixe

Ok, vou explicar do inicio:

tenho dados na forma:

-83715 -99803 28-08-1995 4,86 4 1,4 1,85 4,134220928

-83715 -99803 28-08-1995 4,86 4 3,1 3,55 9,339304368

-83715 -99803 28-08-1995 4,86 4 4,45 4,9 22,43445486

-83715 -99803 28-08-1995 4,86 4 5,95 6,4 52,34864756

-83715 -99803 28-08-1995 4,86 4 7,3 7,57 125,802556

em que as primeiras colunas são, respectivamente, X,Y.

ora, o que eu quero é que o utilizador de um x e um y e eu de a informação que está à frente das coordenadas.

        Dim oFile As System.IO.File
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

        ''''''ler
        Dim lineIn As String

        Dim oRead As System.IO.StreamReader
        oRead = oFile.OpenText(intext)

        While oRead.Peek <> -1
            lineIn = oRead.ReadLine()

            'POR CÓDIGO QUE IREI DIZER

        End While

        oRead.Close()

basicamente estou a ler as linhas. portanto, fico com um vector linha. orasó me interessa mesmo saber asduas coordenadas. depois d as saber, é colocar tudo numa matriz com indices respectivos às coordenadas cujos elementos são a stringtoda. assim dpeois basta imprimir a entrada que quero.

nota que, ocmo tinhas dito, não vão existir nas coordenadas espaços entre a informação. das duas uma, ou leio do as words do txt, ou leio linhas, que é o código que te dei, e agora trabalho com essa string.

há alguma função para strings que me dê words que tao separadas por espaços? assim era só ler as primeiras duas..... e tava feito.

tb posso fazer um ciclo a ler caracteres, como se le caracteres?

cumps e obrigado pela ajuda

Share this post


Link to post
Share on other sites
Andrepereira9

ora, o que eu quero é que o utilizador de um x e um y e eu de a informação que está à frente das coordenadas.

If File.Exists(pathTxt) Then
Using ler As New StreamReader(pathTxt)
   While Not ler.EndOfStream
      Dim Linha As String() = ler.ReadLine().Split(" "c) ' Divide a linha pelos espaços
      If Linha(0) = "-83715" And Linha(3) = "-99803" Then ' Compara se as coordenadas da linha, são iguais as que o utilizador indica. Se forem:
         MsgBox(Linha(6)) ' Apresenta 28-08-1995
         MsgBox(Linha(9)) ' Apresenta 4,86
         MsgBox(Linha(12)) ' Apresenta  4
         MsgBox(Linha(15)) ' Apresenta 1,4
         MsgBox(Linha(18)) ' Apresenta  1,85
         MsgBox(Linha(21)) ' Apresenta 4,134220928 e assim sucessivamente para as 5 linhas, pois as coordenas são as mesmas
      End If
   End While
End Using
End If

Como os teus dados só tem espaços a separar a informação, e não informação com espaços, o que fiz foi:

ler linha a linha (código fornecido pelo Bioshock)

Dividir a linha pelos espaços.

Como entre cada dado, tens 3 espaços, então o '-83715', fica logo na posição '0' do array. Depois ando 3 posições para a frente, para avançar as posições do array que continham os espaços.

Compara as coordenadas da linha com as introduzidas pelo utilizador. Se coincidirem, apresento os valores dessa linha. Andando sempre de 3 em 3 posições, para saltar os espaços.

Foi isto que entendi que pretendias fazer


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
kanixe

If File.Exists(pathTxt) Then
Using ler As New StreamReader(pathTxt)
   While Not ler.EndOfStream
      Dim Linha As String() = ler.ReadLine().Split(" "c) ' Divide a linha pelos espaços
      If Linha(0) = "-83715" And Linha(3) = "-99803" Then ' Compara se as coordenadas da linha, são iguais as que o utilizador indica. Se forem:
         MsgBox(Linha(6)) ' Apresenta 28-08-1995
         MsgBox(Linha(9)) ' Apresenta 4,86
         MsgBox(Linha(12)) ' Apresenta  4
         MsgBox(Linha(15)) ' Apresenta 1,4
         MsgBox(Linha(18)) ' Apresenta  1,85
         MsgBox(Linha(21)) ' Apresenta 4,134220928 e assim sucessivamente para as 5 linhas, pois as coordenas são as mesmas
      End If
   End While
End Using
End If

Como os teus dados só tem espaços a separar a informação, e não informação com espaços, o que fiz foi:

ler linha a linha (código fornecido pelo Bioshock)

Dividir a linha pelos espaços.

Como entre cada dado, tens 3 espaços, então o '-83715', fica logo na posição '0' do array. Depois ando 3 posições para a frente, para avançar as posições do array que continham os espaços.

Compara as coordenadas da linha com as introduzidas pelo utilizador. Se coincidirem, apresento os valores dessa linha. Andando sempre de 3 em 3 posições, para saltar os espaços.

Foi isto que entendi que pretendias fazer

Boas, obrigado pela resposta. Só uma pergunta, achas que consegues pegar naquele código que eu fiz no post anterior e modifica-lo com o que deste? (isto é, ja tenho uma string com a linha, agora é uma questão de extrair as coordenadas da string)É que não entendo bem esse código, e tenho intenções de guardar tudo numa matriz cujos elementos i j sejam as coordenadas e receba astring, pois quero, depois, conseguir pedir informação sobre intervalos de coordenadas.

If File.Exists(pathTxt) Then
Using ler As New StreamReader(pathTxt)
   While Not ler.EndOfStream
      Dim Linha As String() = ler.ReadLine().Split(" "c) ' Divide a linha pelos espaços
      If Linha(0) = "-83715" And Linha(3) = "-99803" Then ' Compara se as coordenadas da linha, são iguais as que o utilizador indica. Se forem:
         MsgBox(Linha(6)) ' Apresenta 28-08-1995
         MsgBox(Linha(9)) ' Apresenta 4,86
         MsgBox(Linha(12)) ' Apresenta  4
         MsgBox(Linha(15)) ' Apresenta 1,4
         MsgBox(Linha(18)) ' Apresenta  1,85
         MsgBox(Linha(21)) ' Apresenta 4,134220928 e assim sucessivamente para as 5 linhas, pois as coordenas são as mesmas
      End If
   End While
End Using
End If

Podes explicar-me as variáveis e especialmente o que se está a fazer em  Dim Linha As String() = ler.ReadLine().Split(" "c) ?

Desculpa mas sou completamente novo nisto.

cumps

Share this post


Link to post
Share on other sites
bioshock

Já experimentaste, para além de olhar para o código, "brincar" um pouco com o mesmo?

Se queres apanhar também as coordenadas, apenas tens de colocar:

MsgBox(Linha(0))

Vai alterando os valores para veres até que ponto o código funciona. :P

Relativamente à ultima questão, que eu saiba existe um espaço na tua string, espaço eu que te falei no post anterior, onde disse:

space(1)

Ele optou por colocar:

" "c

Onde c é o proximo character.

Share this post


Link to post
Share on other sites
Andrepereira9

Utilizando o teu código, basta acrescentar a divisão da linha

Dim oFile As System.IO.File
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

        ''''''ler
        Dim lineIn As String

        Dim oRead As System.IO.StreamReader
        oRead = oFile.OpenText(intext)

        While oRead.Peek <> -1
            lineIn = oRead.ReadLine()

            Dim linha As String() = lineIn.Split(" "c)

            If linha(0) = "-83715" And linha(3) = "-99803" Then ' Compara se as coordenadas da linha, são iguais as que o utilizador indica. Se forem:
MsgBox(linha(0)) ' Apresenta a coordenada X
MsgBox(linha(3)) ' Apresenta a coordenada Y. Se quiseres guardar numa variavel, é só pores nome_variavel = linha(3). Declarara, a variavel fora do evento, caso queiras usar noutra operação
                MsgBox(linha(6)) ' Apresenta 28-08-1995
                MsgBox(linha(9)) ' Apresenta 4,86
                MsgBox(linha(12)) ' Apresenta  4
                MsgBox(linha(15)) ' Apresenta 1,4
                MsgBox(linha(18)) ' Apresenta  1,85
                MsgBox(linha(21)) ' Apresenta 4,134220928 e assim sucessivamente para as 5 linhas, pois as coordenas são as mesmas
            End If

        End While

        oRead.Close()


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
kanixe

Utilizando o teu código, basta acrescentar a divisão da linha

Dim oFile As System.IO.File
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

        ''''''ler
        Dim lineIn As String

        Dim oRead As System.IO.StreamReader
        oRead = oFile.OpenText(intext)

        While oRead.Peek <> -1
            lineIn = oRead.ReadLine()

            Dim linha As String() = lineIn.Split(" "c)

            If linha(0) = "-83715" And linha(3) = "-99803" Then ' Compara se as coordenadas da linha, são iguais as que o utilizador indica. Se forem:
MsgBox(linha(0)) ' Apresenta a coordenada X
MsgBox(linha(3)) ' Apresenta a coordenada Y. Se quiseres guardar numa variavel, é só pores nome_variavel = linha(3). Declarara, a variavel fora do evento, caso queiras usar noutra operação
                MsgBox(linha(6)) ' Apresenta 28-08-1995
                MsgBox(linha(9)) ' Apresenta 4,86
                MsgBox(linha(12)) ' Apresenta  4
                MsgBox(linha(15)) ' Apresenta 1,4
                MsgBox(linha(18)) ' Apresenta  1,85
                MsgBox(linha(21)) ' Apresenta 4,134220928 e assim sucessivamente para as 5 linhas, pois as coordenas são as mesmas
            End If

        End While

        oRead.Close()

O que faz Dim linha As String() = lineIn.Split(" "c) ? guarda um vector de strings em que vai guardando tudo num novo elemento até aparecerem os espaços (guarda tb os espaços no elemento)?

é que experimentei:

        ''''''ler
        Dim lineIn As String
        Dim oRead As System.IO.StreamReader
        oRead = oFile.OpenText(intext)
        While oRead.Peek <> -1
            lineIn = oRead.ReadLine()
            Dim linha As String() = lineIn.Split(" "c)
            MsgBox(linha(0)) ' Apresenta a coordenada X
            MsgBox(linha(3)) ' Apresenta a coordenada Y. Se quiseres guardar numa variavel, é só pores nome_variavel = linha(3). Declarara, a variavel fora do evento, caso queiras usar noutra operação
        End While
        oRead.Close()

E no primeiro msgbox aparece-me toda a string Linein e depois dá-me erro quando peço a MsgBox(linha(3)).

Mas é exactamente isto que eu quero, ler os primeiros números. depois de ter isto desenrascado já sei fazer o resto.

Share this post


Link to post
Share on other sites
FreiNando

Experimenta outra forma de separação:

Dim linha As String() = lineIn.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)

Provavelmente tens mais de um espaço entre os valores, e no array de strings irá existir elementos vazios.

Executa o programa em modo debug e coloca um breakpoint na instrução imediatamente a seguir ao split e observa o seu conteudo.

Para observares uma variavel coloca o rato em cima da variavel e espera que apareça a informação, ou clica com o botão direito sobre o nome da variavel no código e escolha do submenu a opção Quick Watch, ou então com a variavel selecionada pressiona Shift + F9.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.