Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Como abrir ficheiros de texto delimitados

Os ficheiros de texto são cada vez menos usados, mas ainda há alguns casos que se utilizam, como por exemplo, para a criação de ficheiros log, ficheiro CSV (Comma-separated values), etc.

Para ler ficheiros de texto existem vários métodos, alguns dos quais referidos num artigo anterior, mas quando são listas a forma mais fácil, rápida e prática de o fazer é utilizando uma ligação Microsoft Jet OLE DB 4.0.

Imaginemos o seguinte ficheiro (dados.csv):

1;Amarelo;22:09 11-06-2010
2;Azul;22:10 12-06-2010
3;Verde;22:11 12-06-2010
4;Verde;22:12 13-06-2010
5;Preto;22:13 14-06-2010
6;Branco;22:14 14-06-2010

Para ler este ficheiro é apenas necessário:

' ConnectionString para ligação Microsoft Jet OLEDB
Dim connString As String =
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\;" &
    "Extended Properties='text;HDR=no;FMT=Delimited'"

Dim SQL As String = "SELECT * FROM dados.csv"
Using da As New OleDb.OleDbDataAdapter(SQL, connString)
    Dim ds As New DataSet
    da.Fill(ds)

    Stop ' Informação disponível no DataSet

End Using

Desta forma colocamos toda a informação num DataSet. Neste exemplo, a DataTable terá 6 linhas (rows) e três colunas (columns), onde as colunas terão o nome, gerado automaticamente, de “F1”, “F2” e “F3”.

Depois é fácil filtrar os dados! Por exemplo, para mostrar todos os registos que tenham na segunda coluna o valor “Verde”:

' ConnectionString para ligação Microsoft Jet OLEDB
Dim connString As String =
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\;" &
    "Extended Properties='text;HDR=no;FMT=Delimited'"

Dim SQL As String = "SELECT * FROM dados.csv"
Using da As New OleDb.OleDbDataAdapter(SQL, connString)
    Dim ds As New DataSet
    da.Fill(ds)

    Dim view As DataView = ds.Tables(0).DefaultView
    view.RowFilter = "F2 = 'Verde'"

    ' Mostra o número das linhas que têm o
    ' valor “Verde’ na segunda coluna      
    For x As Integer = 0 To view.Count - 1
        Console.WriteLine(view(x).Row.Item(0).ToString)
    Next
    Console.Read()

End Using

Neste exemplo foi utilizado um DataView, mas podia ser feito directamente na instrução SQL:

"SELECT * FROM dados.csv WHERE F2 = 'Verde'"

Mas imaginemos que o ficheiro tem um delimitador diferente, ou seja, não é utilizado o ponto e virgula (;) mas sim outro. Isto poderá acontecer por diversos motivos, com por exemplo, quando o ficheiro é gerado por uma máquina ou quando é gerado por uma aplicação que não temos controlo.

Imaginemos agora que o delimitador e uma barra (|).

1|Amarelo|22:09 11-06-2010
2|Azul|22:10 12-06-2010
3|Verde|22:11 12-06-2010
4|Verde|22:12 13-06-2010
5|Preto|22:13 14-06-2010
6|Branco|22:14 14-06-2010

Se executássemos o código anterior, iria ler o ficheiro como uma coluna apenas. 

Uma solução para resolver este problema seria a de utilizar um ficheiro de schema, com o nome schema.ini, que seria colocado na mesma directoria do ficheiro a ler. Este ficheiro fornece o IISAM com informações sobre o formato dos dados, o nome da coluna e informações sobre o tipo de dados, e várias outras características, permitindo também definir qual o delimitador.

A estrutura(simplificada) é a seguinte:

[nome do ficheiro]
Format=Delimited(delimitador)
ColNameHeader=True ou False

Para o exemplo apresentado, o ficheiro schema.ini ficaria da seguinte forma:

[dados.csv]
Format=Delimited(|)
ColNameHeader=False

Desta forma podemos ler o ficheiro indicando qual o delimitador correcto e definindo ainda algumas informações adicionais.

2 comentários:

P3dr0 disse...

Boas eu tenho um programa em que quero consultas filtradas á base de dados, quero expolas numa datagridview apartir do nome que meto nnuma textbox.

Dim adapter_cliente As New GesturoDBDataSetTableAdapters.ClienteTableAdapter()
Dim tab_cliente As New GesturoDBDataSet.ClienteDataTable
Dim sql As String = "SELECT * FROM Cliente WHERE Nome = '% " & TextBox1.Text & "'"
adapter_cliente.Fill(tab_cliente.DataSet.Tables(CInt(sql)))

estou tentando isso com este código, mas dá me erro quando tou a executar a coisa dame um nullreferenceexception.

se me pudesses dar umas dicas de como configurar o "fill" agradecia ^^

Jorge Paulino disse...

Mas o que isto tem a ver com este artigo?

A forma mais fácil é usando um DataView pois desta forma não precisas de ir sempre à base de dados. Mas coloca a tua questão aqui

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico