• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Joca

[Resolvido] DataGridView e ficheiros de texto

8 mensagens neste tópico

Boas!...

Já ando aqui há um bom pedaço de tempo para conseguir isto na DataGridView:

1 - Criar o número de colunas idêntico ao número de vezes que existe o símbolo ";" na primeira linha do ficheiro de texto que abrir.

2 - Considerar que o título no cabeçalho de CADA coluna, na DataGridView, é o texto na primeira linha desse ficheiro em CADA ";".

3 - Existe maneira de exibir correctamente o texto com acentos, já que este não é exibido correctamente na DataGridView?

Alguém tem ideias sobre como o fazer?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda nada... Conforme podes ver não assume correctamente o texto com acentos.

Public Class Form1

    Dim leitorTexto As IO.StreamReader

    Dim nomeFicheiro As String = "c:\TESTE.TXT"

    Dim texto As String

    'Para a DataGridView (DG)
    Dim tabelaDG As New DataTable
    Dim linhaDG As DataRow
    Dim colunaDG As New DataColumn


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

        'FICHEIRO DE TESTE:
        ' Nome ; Idade ; Outros;
        ' Joca; 100 anos ; Qualquer coisa ;
        ' André  ; Ri-te ; ;



        ' Nota: Os espaços colocados antes e depois do ";" no ficheiro acima são propositados. 
        ' A ideia é, depois fazer o trim desses espaços inseridos pelo utilizador na DataGridView.

        leitorTexto = New IO.StreamReader(nomeFicheiro)



        'Isto adiciona as colunas à tabela. Mas eu quero que o programa reconheça
        'automaticamente o número de colunas a criar (pela contagem dos ";").
        tabelaDG.Columns.Add("Nome", Type.GetType("System.String"))
        tabelaDG.Columns.Add("Idade", Type.GetType("System.String"))
        tabelaDG.Columns.Add("Outros", Type.GetType("System.String"))


        'Do While leitorTexto.ReadLine.Contains(";")
        '
        'colunaDG = tabelaDG.Columns.Add
        '
        'Loop
        '
        'colunaDG.ColumnName = nomeFicheiro 'Máximo que consegui...


        Do While leitorTexto.Peek() <> -1

            texto = leitorTexto.ReadLine()

            linhaDG = tabelaDG.NewRow

            tabelaDG.Rows.Add(texto) 'Adiciona a linha à tabela
        Loop

        'Atribui ao datagridview a tabela criada
        DataGridView1.DataSource = tabelaDG

        leitorTexto.Close()


    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa não responder antes ...

A questão do texto não aparecer correcto deve-se ao encoding do texto. Podes alterar fazendo assim:

leitorTexto = New IO.StreamReader(nomeFicheiro, System.Text.Encoding.Default)

Como está o resto ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa lá mas, não consegui vir mais cedo!

Tinhas razão! Era o encoding do texto!  :-[

De qualquer maneira, como obtia sempre erros de código por causa de não ter as colunas (mesmo com if's a verificar dentro do while), optei por fazer de outra maneira, seguindo os links indicados no novo código, em baixo.

Neste momento, a minha dúvida é: porque é que me diz sempre que o caminho não é válido? Não estou a indicar correctamente o percurso?

'Baseado no tutorial do JPaulino "VB.NET: Utilizando o controlo DataGridView"
'em http://vbtuga.blogspot.com/2008/04/vbnet-utilizando-o-controlo.html
'e, no tutorial do Francisco Junior "Usar Arquivos CSV com OleDB"
'em http://thespoke.net/blogs/fbcjunior/archive/2005/10/28/ArquivosCSVOleDB.aspx
'com a readaptação ao meu caso.

Imports System.Data.OleDb


Public Class Form1

    ' Declaração de variáveis privadas
    Dim da As OleDbDataAdapter
    Dim ds As DataSet


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

        Dim nomeFicheiro As String

        'Limpa a DataGrid antes de aceder a novo ficheiro
        DataGridView1.Rows.Clear()

        With OpenFileDialog1
            .Filter = "Ficheiros CSV (*.csv)|*.csv|Ficheiros Texto (*.txt)|*.txt"
        End With

        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then

            nomeFicheiro = OpenFileDialog1.FileName

            Try
                ' Texto de ligação à base de dados
                '
                ' HDR é igual a Header Describes Row, ou o cabeçalho contém o nome dos campos
                ' FMT é o formato, Delimited significa que um ";" está delimitando os campos
                Dim myConnectionString As String = _
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                CStr(nomeFicheiro) & ";Extended Properties='text;HDR=Yes;FMT=Delimited'"

                ' Cria uma nova ligação à base de dados
                Dim connection As New OleDbConnection(myConnectionString)

                'Abre a ligação à base de dados
                connection.Open()

                ' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
                Dim SQL As String = "SELECT * FROM " & CStr(nomeFicheiro)
                da = New OleDbDataAdapter(SQL, connection)


                ' Cria um novo DataSet, ou seja, uma representação em memória da informação
                ds = New DataSet


                ' Coloca a informação da tabela definida no DataSet
                da.Fill(ds, CStr(nomeFicheiro))


                ' Define que a fonte de dados da DataGridView é a nossa DataSet
                ' criando automáticamente as colunas e linhas de dados
                Me.DataGridView1.DataSource = ds.Tables(CStr(nomeFicheiro))


                ' Limpa a ligação à base de dados. Não é necessário fechar a ligação
                ' porque esta não foi aberta através do comando .Open()
                'connection = Nothing

                'Fecha a ligação à base de dados
                connection.Close()

            Catch ex As Exception
                MessageBox.Show("Ocorreu um erro na leitura do ficheiro que seleccionou" + ex.ToString)
            End Try

        Else
            Exit Sub
        End If

    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resimplificando de novo...

Há alguém que me explique o porquê dos erros exibidos usando as duas hipóteses no código em baixo.

O que falta fazer?!

'Baseado no tutorial do JPaulino "VB.NET: Utilizando o controlo DataGridView"
'em http://vbtuga.blogspot.com/2008/04/vbnet-utilizando-o-controlo.html
'e, no tutorial do Francisco Junior "Usar Arquivos CSV com OleDB"
'em http://thespoke.net/blogs/fbcjunior/archive/2005/10/28/ArquivosCSVOleDB.aspx
'com a readaptação ao meu caso.

Imports System.Data.OleDb


Public Class Form1

    ' Declaração de variáveis privadas
    Dim da As OleDbDataAdapter
    Dim ds As DataSet


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

        'HIPÓTESE 1:
        'Dim myConnectionString As String = _
        '"Provider=Microsoft.Jet.OLEDB.4.0;" & _
        '"Data Source=c:\TESTE.TXT;" & _
        '"Extended Properties=text;" & _
        '"HDR=yes;FMT=Delimited"

        'HIPÓTESE 2:
        Dim myConnectionString As String = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\TESTE.TXT;" & _
        "Extended Properties=""text;" & _
        "HDR=Yes;FMT=Delimited"""

        ' Cria uma nova ligação à base de dados
        Dim connection As New OleDbConnection(myConnectionString)

        'Abre a ligação à base de dados
        connection.Open()

        '-------------------------------------------------------------
        'HIPÓTESE 1: o erro é no "connection.Open()", diz:
        'ErrorCode=-2147467259
        'Message = "Não foi possível encontrar ISAM instalável."
        'Source = "Microsoft JET Database Engine"
        '
        'HIPÓTESE 2: o erro é no "connection.Open()", diz:
        'ErrorCode = -2147467259
        'Message = "C:\TESTE.TXT' não é um caminho válido. Verifique se 
        'o caminho foi introduzido correctamente e se está ligado ao 
        'servidor onde reside o ficheiro"
        'Source = "Microsoft JET Database Engine"
        '---------------------------------------------------------------------


        ' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
        Dim SQL As String = "SELECT * FROM TESTE.TXT" ' & CStr(nomeFicheiro)
        da = New OleDbDataAdapter(SQL, connection)

        ' Cria um novo DataSet, ou seja, uma representação em memória da informação
        ds = New DataSet


        ' Coloca a informação da tabela definida no DataSet
        da.Fill(ds, "TESTE") 'CStr(nomeFicheiro))


        ' Define que a fonte de dados da DataGridView é a nossa DataSet
        ' criando automáticamente as colunas e linhas de dados
        Me.DataGridView1.DataSource = ds.Tables("TESTE") 'CStr(nomeFicheiro))


        ' Limpa a ligação à base de dados. Não é necessário fechar a ligação
        ' porque esta não foi aberta através do comando .Open()
        'connection = Nothing

        'Fecha a ligação à base de dados
        connection.Close()


    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já descobri qual era o problema...

Estava mesmo distraído!

O correcto era isto:

Dim myConnectionString As String = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\;" & _
        "Extended Properties='text;" & _
        "HDR=Yes;FMT=Delimited'"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já descobri qual era o problema...

Estava mesmo distraído!

O correcto era isto:

Dim myConnectionString As String = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\;" & _
        "Extended Properties='text;" & _
        "HDR=Yes;FMT=Delimited'"

Ainda bem que está a funcionar ... era um pequeno detalhe que fazia toda a diferença!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora