none
Ler arquivo texto RRS feed

  • Pergunta

  • Olá a todos! Preciso ler um arquivo texto e contar os caracteres que tem as linhas e jogar numa tabela ou listview. Não tem delimitadores e nem padrão de tamanho, exemplo:

    Usuário                   Data         Hora       Arquivo       DocId      Ação

    virginia-bptista     20071126 11:39.48  Sedex Det                     SEARCH 
    virginia-bptista     20071126 11:39.53  Sedex Det    13821538   READ   
    jorge                   20071126 11:40.56  Sedex Det                     SEARCH 

    O arquivo texto é assim como no exemplo acima, preciso pegar o nome de todos os usuários jogar numa coluna do banco ou listview, depois a data em outra coluna,hora e assim sucessivamente... Sendo que tem os espaços em branco e não delimitador, os nomes não tem padrao de tamanho. Se alguém puder dar uma luz agradeço desde ja!

    quinta-feira, 30 de setembro de 2010 23:24

Respostas

  • Como não analisei com tempo, tentei fazer da melhor forma possível. Para as linhas que você passou funcionou normal. Segue o Código:

    Criei uma classe com os campos das colunas dos arquivos

      Public Class EstruturaArquivo
        Public TextoCompleto As String
        Public Data As Date
        Public HoraData As DateTime
        Public Hora As String
        Public Usuario As String
        Public Arquivo As String
        Public DocId As String
        Public Acao As String
      End Class

    Depois fui lendo o arquivo, e achando coisas lógicas como a data ter 8 dígitos, a hora também.

        Dim listaLinha As New List(Of EstruturaArquivo)
        Dim reader As New StreamReader("C:\Teste.txt")
        Dim linha As EstruturaArquivo

        While Not reader.EndOfStream
          linha = New EstruturaArquivo
          linha.TextoCompleto = reader.ReadLine()
          For i As Integer = 0 To linha.TextoCompleto.Length - 1
            If linha.Data.Equals(DateTime.MinValue) AndAlso Date.TryParseExact(linha.TextoCompleto.Substring(i, 8), "yyyyMMdd", New CultureInfo("pt-BR"), DateTimeStyles.None, linha.Data) Then
              linha.Usuario = linha.TextoCompleto.Substring(0, i).Trim
              i += 8
            End If
            If linha.HoraData.Equals(DateTime.MinValue) AndAlso Not linha.Data.Equals(DateTime.MinValue) Then
              If DateTime.TryParseExact(linha.TextoCompleto.Substring(i, 8), "HH:mm.ss", New CultureInfo("pt-BR"), DateTimeStyles.None, linha.HoraData) Then
                linha.Hora = linha.HoraData.ToString("HH:mm.ss")
                i += 8
              End If
            End If
            If Not linha.HoraData.Equals(DateTime.MinValue) Then
              If linha.DocId Is Nothing AndAlso Not IsNumeric(linha.TextoCompleto(i)) AndAlso Not (linha.TextoCompleto(i) & linha.TextoCompleto(i + 1) = "  ") Then
                linha.Arquivo &= linha.TextoCompleto(i)
              Else
                If linha.DocId Is Nothing Then linha.DocId = String.Empty
                If linha.Arquivo IsNot Nothing AndAlso IsNumeric(linha.TextoCompleto(i)) Then
                  linha.DocId &= linha.TextoCompleto(i)
                ElseIf linha.Arquivo IsNot Nothing AndAlso linha.TextoCompleto(i) <> " " Then
                  linha.Acao &= linha.TextoCompleto(i)
                End If
              End If

            End If
          Next
          listaLinha.Add(linha)
        End While

     

    Se não for isso, posta a dúvida; :)


    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form
    • Marcado como Resposta adelar quarta-feira, 6 de outubro de 2010 23:46
    segunda-feira, 4 de outubro de 2010 03:01

Todas as Respostas

  • Olá a todos! Preciso ler um arquivo texto e contar os caracteres que tem as linhas e jogar numa tabela ou listview. Não tem delimitadores e nem padrão de tamanho, exemplo:

    Usuário                   Data         Hora       Arquivo       DocId      Ação

    virginia-bptista     20071126 11:39.48  Sedex Det                     SEARCH 
    virginia-bptista     20071126 11:39.53  Sedex Det    13821538   READ   
    jorge                   20071126 11:40.56  Sedex Det                     SEARCH 

    O arquivo texto é assim como no exemplo acima, preciso pegar o nome de todos os usuários jogar numa coluna do banco ou listview, depois a data em outra coluna,hora e assim sucessivamente... Sendo que tem os espaços em branco e não delimitador, os nomes não tem padrao de tamanho. Se alguém puder dar uma luz agradeço desde ja!

    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/029da5ff-e77b-4c52-b468-23bce03f3721

    SE nao tem delimitadores, voce vai ter de fazer milagres pra ler e organizar como queres.

     


    Just Be Humble Malange!
    quinta-feira, 30 de setembro de 2010 23:29
    Moderador
  • Olá a todos! Preciso ler um arquivo texto e contar os caracteres que tem as linhas e jogar numa tabela ou listview. Não tem delimitadores e nem padrão de tamanho, exemplo:

    Usuário                   Data         Hora       Arquivo       DocId      Ação

    virginia-bptista     20071126 11:39.48  Sedex Det                     SEARCH 
    virginia-bptista     20071126 11:39.53  Sedex Det    13821538   READ   
    jorge                   20071126 11:40.56  Sedex Det                     SEARCH 

    O arquivo texto é assim como no exemplo acima, preciso pegar o nome de todos os usuários jogar numa coluna do banco ou listview, depois a data em outra coluna,hora e assim sucessivamente... Sendo que tem os espaços em branco e não delimitador, os nomes não tem padrao de tamanho. Se alguém puder dar uma luz agradeço desde ja!

    http://www.velocityreviews.com/forums/t122087-reading-text-file-to-dataset.html
    Just Be Humble Malange!
    quinta-feira, 30 de setembro de 2010 23:31
    Moderador
  • Pois é.... Estava pensando no seguinte: Na coluna nome e arquivo são as que tem maior variação de tamanho,então pensei o seguinte:  Como nunca vou saber quantos caracteres tem o nome por exemplo, posso ver quando começa o primeiro espaço em branco, ou seja, começo da posição 0 e vejo o primeiro espaço em branco ou vazio após o nome, ali seria o nome, poderia ser desta forma? Obrigado!
    sábado, 2 de outubro de 2010 03:13
  • O que você poderia fazer também era aplicar uma expressão regular para pegar a máscara de data que no seu caso o formato é 20071126, o da hora com os dois pontos e ponto no segundo, o do arquivo com alfanumerico, o doc com inteiro e a ação novamente com alfanumerico. Conseguiu entender?

    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form
    sábado, 2 de outubro de 2010 03:29
  • O que você poderia fazer também era aplicar uma expressão regular para pegar a máscara de data que no seu caso o formato é 20071126, o da hora com os dois pontos e ponto no segundo, o do arquivo com alfanumerico, o doc com inteiro e a ação novamente com alfanumerico. Conseguiu entender?

    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form

    @Bruno Maestro

    Nao Consegui Entender.....

    Se for possivel, Bruno, queres desenvolver uma solucao, pra esta situacao. Podemos fazer o codigo juntos....

    Deixa-me saber.

    Apenas uma coriosidade, Como foi possivel ter este tipo de dados bem organizado sem usar "Delimitadores"?

    -----------------------------------------------------------------------------------

    Usuário                   Data         Hora       Arquivo       DocId      Ação

    virginia-bptista     20071126 11:39.48  Sedex Det                     SEARCH  
    virginia-bptista     20071126 11:39.53  Sedex Det    13821538   READ    
    jorge                   20071126 11:40.56  Sedex Det                     SEARCH

    ----------------------------------------------------------------------------------- 

    Eu nao sou muito amigo do CSV files.

    Deixa-me saber....

    Obrigado, Bruno.

     


    Just Be Humble Malange!
    sábado, 2 de outubro de 2010 11:34
    Moderador
  • Malange, estou indo viajar agora e amanhã a gente dá uma olhada.
    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form
    sábado, 2 de outubro de 2010 13:35
  • bruno

     

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

     

            Try

                Dim stream As New StreamReader("C:\txtMsdn.csv")

                Dim linhaTxt As String

                Dim LinhaSeparada

                linhaTxt = stream.ReadLine()

                While linhaTxt IsNot Nothing

                    LinhaSeparada = linhaTxt.Split(" ")

                    ListView1.Items.Add(New ListViewItem(LinhaSeparada(0).ToString))

                    linhaTxt = stream.ReadLine()

                End While

            Catch ex As Exception

                MessageBox.Show(ex.Message)

            End Try      

        End Sub

     

    o segredo estra no split que le quebra a string em um vetor de strings de acordo com um caracter passado por parametro

    no caso eu passei um espaço.. 

    toda vez que o split encontrar um espaço na string ele quebra para uma nova...

    ae eh soh pegar a string no vetor pelo index.. no caso o index eh o 0 e vc tem o nome dos user...

    espero ter ajudado 

    abs

    sábado, 2 de outubro de 2010 14:42
  • Eu sei carregar CSV Files, mas, nao gosto de lidar com este tipo de ficheiro. 

    @Vander

    O OP nao esta a falar de CSV Focheiro. Esta a falar de texto.

    Veja o thread acima........


    Just Be Humble Malange!
    sábado, 2 de outubro de 2010 21:24
    Moderador
  • Primeiramente, obrigado a todos pelo apoio! Respondendo a exclamação do amigo:"Apenas uma coriosidade, Como foi possivel ter este tipo de dados bem organizado sem usar "Delimitadores"?..Na realidade eu dei uns espaços para ficar melhor organizado para postar, esse arquivo texto tem em torno de 440.000 mil linhas. Esse abaixo, só copiei e colei, são seis colunas. Mas essa e a pior parte que peguei...Como vocês podem perceber entre o usuário e o restante das colunas tem um bom espaço neste caso, mas vai ter casos que o nome do usuário vai ser maior e vai chegar próximo a data... Obrigado a todos!!!

     

     admin                20071125 18:41.03 Prefeitura de Jaraguá do Sul          SEARCH 
    admin                20071125 18:41.10 Prefeitura de Jaraguá do Sul 5        READ   
    marcos               20071126 08:17.05 AR BANRISUL                   SEARCH 
    marcos               20071126 08:17.13 AR BANRISUL          5        READ   
    irineu               20071126 08:25.41 Sistemas de Inteligência Competitiva          SEARCH 
    irineu               20071126 08:26.07 Sedex Det                     SEARCH 
    irineu               20071126 08:26.21 Sedex Det            12851444 READ   
    irineu               20071126 08:26.31 Sedex Det            12851444 DOWNLOAD
    irineu               20071126 08:26.57 Sedex Det                     SEARCH

    sábado, 2 de outubro de 2010 23:20
  • Olá Vander! Obrigado pela ajuda! Fiz conforme seu código, deu certo a parte de pegar os usuários, mas como pego o restante das colunas usando esse mesmo método? No caso, quero pegar data, hora,arquivo, DOCID, Ação...Estou jogando um datagridview, jogo nas colunas do grid como está no arquivo texto...Obrigado!!!
    segunda-feira, 4 de outubro de 2010 02:05
  • Adelar estou fazen um exemplo aqui e já te passo.
    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form
    segunda-feira, 4 de outubro de 2010 02:08
  • Como não analisei com tempo, tentei fazer da melhor forma possível. Para as linhas que você passou funcionou normal. Segue o Código:

    Criei uma classe com os campos das colunas dos arquivos

      Public Class EstruturaArquivo
        Public TextoCompleto As String
        Public Data As Date
        Public HoraData As DateTime
        Public Hora As String
        Public Usuario As String
        Public Arquivo As String
        Public DocId As String
        Public Acao As String
      End Class

    Depois fui lendo o arquivo, e achando coisas lógicas como a data ter 8 dígitos, a hora também.

        Dim listaLinha As New List(Of EstruturaArquivo)
        Dim reader As New StreamReader("C:\Teste.txt")
        Dim linha As EstruturaArquivo

        While Not reader.EndOfStream
          linha = New EstruturaArquivo
          linha.TextoCompleto = reader.ReadLine()
          For i As Integer = 0 To linha.TextoCompleto.Length - 1
            If linha.Data.Equals(DateTime.MinValue) AndAlso Date.TryParseExact(linha.TextoCompleto.Substring(i, 8), "yyyyMMdd", New CultureInfo("pt-BR"), DateTimeStyles.None, linha.Data) Then
              linha.Usuario = linha.TextoCompleto.Substring(0, i).Trim
              i += 8
            End If
            If linha.HoraData.Equals(DateTime.MinValue) AndAlso Not linha.Data.Equals(DateTime.MinValue) Then
              If DateTime.TryParseExact(linha.TextoCompleto.Substring(i, 8), "HH:mm.ss", New CultureInfo("pt-BR"), DateTimeStyles.None, linha.HoraData) Then
                linha.Hora = linha.HoraData.ToString("HH:mm.ss")
                i += 8
              End If
            End If
            If Not linha.HoraData.Equals(DateTime.MinValue) Then
              If linha.DocId Is Nothing AndAlso Not IsNumeric(linha.TextoCompleto(i)) AndAlso Not (linha.TextoCompleto(i) & linha.TextoCompleto(i + 1) = "  ") Then
                linha.Arquivo &= linha.TextoCompleto(i)
              Else
                If linha.DocId Is Nothing Then linha.DocId = String.Empty
                If linha.Arquivo IsNot Nothing AndAlso IsNumeric(linha.TextoCompleto(i)) Then
                  linha.DocId &= linha.TextoCompleto(i)
                ElseIf linha.Arquivo IsNot Nothing AndAlso linha.TextoCompleto(i) <> " " Then
                  linha.Acao &= linha.TextoCompleto(i)
                End If
              End If

            End If
          Next
          listaLinha.Add(linha)
        End While

     

    Se não for isso, posta a dúvida; :)


    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form
    • Marcado como Resposta adelar quarta-feira, 6 de outubro de 2010 23:46
    segunda-feira, 4 de outubro de 2010 03:01
  • Olá Bruno! Obrigado pela ajuda! Era isso mesmo..
    quarta-feira, 6 de outubro de 2010 23:46