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

Joca

[Resolvido] DataGridView e ficheiros de texto

Recommended Posts

Joca

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?

Share this post


Link to post
Share on other sites
Joca

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

Share this post


Link to post
Share on other sites
jpaulino

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 ?

Share this post


Link to post
Share on other sites
Joca

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

Share this post


Link to post
Share on other sites
Joca

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

Share this post


Link to post
Share on other sites
Joca

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'"

Share this post


Link to post
Share on other sites
jpaulino

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!

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

×

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.