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:
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 ^^
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
Enviar um comentário