Cómo crear un archivo de texto delimitado con los datos existentes en un objeto DataTable |
Por Enrique Martínez Montejo |
Última revisión: 25/12/2008 |
Puede ser que nos interese crear un archivo de texto delimitado con los datos existentes actualmente en un control DataGridView (o mejor dicho, con los datos existentes en el objeto DataTable asociado al control DataGridView), y asimismo, utilizar un carácter delimitador en concreto, como por ejemplo, que las columnas se encuentren separadas por comas, o por cualquier otro carácter.
La función que muestro a continuación, es una actualización del artículo titulado Cómo crear un archivo delimitado con los datos existentes en un DataSet, y al igual que éste último, crea un archivo de texto en la ruta especificada con los datos existentes actualmente en un objeto DataTable. Asimismo, podemos elegir el carácter que delimitará a los campos, así como si los campos alfanuméricos se deben de encerrar o no entre comillas dobles.
''' <summary>
''' Crea un archivo de texto delimitado con el
contenido del objeto DataTable especificado.
''' </summary>
''' <param name="fileName">Ruta
y nombre del archivo de texto.</param>
''' <param name="dt">Objeto DataTable válido.</param>
''' <param name="separatorChar">El
carácter delimitador de los campos.</param>
''' <param name="hdr">Indica
si la primera fila contiene el nombre de los campos.</param>
''' <param name="textDelimiter">Indica
si los campos alfanuméricos deben aparecer
''' entre comillas dobles.</param>
''' <remarks></remarks>
Public Shared
Sub CreateTextDelimiterFile(ByVal
fileName As
String, ByVal dt As
DataTable, _
ByVal separatorChar
As Char,
ByVal hdr
As Boolean,
ByVal textDelimiter
As Boolean)
' Si no se ha especificado un
nombre de archivo,
' o el objeto DataTable no es válido, provocamos
' una excepción de argumentos no válidos.
'
If ((String.IsNullOrEmpty(fileName))
OrElse (dt Is
Nothing))
Then
Throw
New System.ArgumentException("Argumentos
no válidos.")
End
If
' Si el archivo existe,
solicito confirmación para sobreescribirlo.
'
If
(IO.File.Exists(fileName)) Then
If (MessageBox.Show("Ya
existe un archivo de texto con el mismo nombre." &
Environment.NewLine & _
"¿Desea sobrescribirlo?", _
"Crear archivo de texto delimitado", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Information) = DialogResult.No)
Then Return
End
If
' Crear el archivo de texto con la codificación por defecto.
'
Dim sw
As New IO.StreamWriter(fileName, False,
Text.Encoding.Default)
Try
Dim
value As
String = String.Empty
Dim
col As
Integer = 0
If
(hdr) Then
' La primera línea del archivo de texto contiene el nombre
de los campos.
For Each
dc As DataColumn
In dt.Columns
If (textDelimiter)
Then
' Incluir el nombre del campo entre el caracter
' delimitador de texto especificado.
'
value &= """" & dc.ColumnName &
"""" & separatorChar
Else
' No se incluye caracter delimitador de texto alguno.
'
value &= dc.ColumnName & separatorChar
End If
Next
' Eliminar el último
carácter delimitador de la fila.
sw.WriteLine(value.Remove(value.Length - 1, 1))
value =
String.Empty
End
If
'
Recorrer todas las filas del objeto DataTable.
'
For
Each dr As
DataRow In dt.Rows
For Each
dc As DataColumn
In dt.Columns
If ((dc.DataType.Name.Equals("String"))
AndAlso
(textDelimiter))
Then
' Incluir el dato alfanumérico entre el caracter
' delimitador de texto especificado.
'
value &= """" & dr.Item(col).ToString() &
"""" & separatorChar
Else
' No se incluye caracter delimitador de texto alguno
'
value &= dr.Item(col).ToString() & separatorChar
End If
col += 1
Next
' Siguiente columna
' Al escribir los datos en el archivo, eliminar el
' último
carácter delimitador de la fila.
'
sw.WriteLine(value.Remove(value.Length - 1, 1))
value =
String.Empty
col = 0
Next
' Siguiente fila
Finally
' Nos
aseguramos de cerrar el archivo.
'
sw.Close()
sw =
Nothing
End Try
End Sub
Cómo crear un archivo de texto delimitado con los datos existentes en un objeto DataTable
A continuación, vamos a poner en práctica la función comentada. Para ello vamos a establecer una conexión con la base de datos Northwind de SQL Server, residente en una instancia de Microsoft SQL Server Express, de tal manera que mostremos en un control DataGridView algunos campos de la tabla Employees, por tanto, ejecutaremos en el evento Load del formulario de inicio el siguiente código fuente:
Imports
System.Data.SqlClient
Private Sub Form1_Load(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles
MyBase.Load
Using cnn
As New
SqlConnection( _
"Data
Source=.\SQLExpress;" & _
"Initial Catalog=Northwind;" & _
"Integrated Security=SSPI")
Try
Dim sql As
String = _
"SELECT
EmployeeID, LastName, FirstName, Title, TitleOfCourtesy, BirthDate FROM
Employees"
Dim da As
New SqlDataAdapter(sql, cnn)
Dim dt As
New DataTable("Employees")
da.Fill(dt)
DataGridView1.DataSource = dt
Catch
ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
End Sub
Una vez que tenemos el control DataGridView lleno de datos, podemos hacer en él las modificaciones que creamos oportuno, y posteriormente crear un archivo de texto delimitado separado por comas con los datos actualmente existentes en el objeto DataTable asociado al control DataGridView. Para ello, en el evento Click de un control Button llamaríamos a la función de la siguiente manera:
Private Sub
Button1_Click(ByVal sender
As Object,
ByVal e As
EventArgs) Handles Button1.Click
' Referenciar el objeto DataTable
enlazado a un control DataGridView
'
Dim dt
As DataTable =
DirectCast(DataGridView1.DataSource,
DataTable)
' Indicar nuestra intención de
crear un archivo de texto delimitado por comas,
' así como que en la primera línea aparezcan los nombres de
los campos, y que
' aquellos que sean alfanuméricos, sean encerrados entre
comillas dobles.
'
CreateTextDelimiterFile("C:\Mis
documentos\DataTable.txt", dt, ","c,
True, True)
MessageBox.Show("Se
ha creado satisfactoriamente el archivo de texto.")
End Sub
Si abre el archivo de texto con el Bloc de Notas, observará el siguiente contenido:
"EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate"
1,"Davolio","Nancy","Sales Representative","Ms.",08/12/1948
0:00:00
2,"Fuller","Andrew","Vice President, Sales","Dr.",19/02/1952
0:00:00
3,"Leverling","Janet","Sales Representative","Ms.",30/08/1963
0:00:00
4,"Peacock","Margaret","Sales
Representative","Mrs.",19/09/1937 0:00:00
5,"Buchanan","Steven","Sales Manager","Mr.",04/03/1955
0:00:00
6,"Suyama","Michael","Sales Representative","Mr.",02/07/1963
0:00:00
7,"King","Robert","Sales Representative","Mr.",29/05/1960
0:00:00
8,"Callahan","Laura","Inside Sales
Coordinator","Ms.",09/01/1958 0:00:00
9,"Dodsworth","Anne","Sales Representative","Ms.",27/01/1966
0:00:00
Observe cómo los campos alfanuméricos han sido correctamente delimitados por comillas dobles.
Otros enlaces de interés:
Trabajar con los datos existentes en un archivo de texto
Cómo crear un archivo XML con los datos de un objeto DataSet
Enrique Martínez Montejo - 2008
NOTA: La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo.
NOTE: The information contained in this article and source code included therein, is provided AS IS without warranty of any kind, and confers no rights. You assume any risk to implement, use or run it explained, recommended or suggested in this article.