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

Cómo leer un archivo de texto delimitado por comas

Indice de Ejemplos de ADO .NET


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.