Abrir un archivo de texto delimitado por comas
Por Enrique Martínez Montejo
Última revisión: 06/03/2004
 

Si en nuestro sistema tenemos establecida una configuración regional de español, lo más seguro es que tengamos designada la coma como símbolo decimal, por lo que se nos presentará un problema a la hora de trabajar con un archivo de texto cuyos campos estén delimitados por comas.

La única solución existente mediante programación es recurrir a las funciones GetLocaleInfo y SetLocaleInfo de la API de Windows, para leer y modificar el símbolo decimal, restaurando los valores una vez hayamos leído el archivo de texto, que es lo que hace el ejemplo que nos ocupa en esta ocasión, el cual presupone que tenemos debidamente configurado un archivo de información de esquema Schema.ini en la misma carpeta donde se encuentre el archivo de texto que deseamos leer.

Para ejecutar el ejemplo necesitará insertar un control DataGrid en el formulario de inicio del proyecto. Copie y pegue el siguiente código en la sección Declaraciones del formulario de inicio del proyecto.

Option Explicit

Private Declare Function GetLocaleInfo Lib "kernel32" Alias _
    "GetLocaleInfoA" (ByVal Locale As Long, _
    ByVal LCType As Long, ByVal lpLCData As String, _
    ByVal cchData As Long) As Long

Private Declare Function SetLocaleInfo Lib "kernel32" Alias _
    "SetLocaleInfoA" (ByVal Locale As Long, _
    ByVal LCType As Long, ByVal lpLCData As String) As Long

Private
Sub Form_Load()

    Dim sSepDecimal1 As String, sSepDecimal2 As String
    Dim sBuffer As String
    Dim dl As Long
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Const LOCALE_USER_DEFAULT = &H400

    On Error GoTo ErrFormatoArchivo

    ' Guardamos el valor del Separador decimal
    sBuffer = String(100, vbNullChar)
    dl = GetLocaleInfo(LOCALE_USER_DEFAULT, &HE, sBuffer, 99)
    sSepDecimal1 = Left(sBuffer, 1)

    ' Establecemos el nuevo separador decimal
    dl = SetLocaleInfo(LOCALE_USER_DEFAULT, &HE, ".")

    ' Guardamos el valor del Separador decimal monetario
    sBuffer = String(100, vbNullChar)
    dl = GetLocaleInfo(LOCALE_USER_DEFAULT, &H16, sBuffer, 99)
    sSepDecimal2 = Left(sBuffer, 1)

    ' Establecemos el nuevo separador decimal monetario
    dl = SetLocaleInfo(LOCALE_USER_DEFAULT, &H16, ".")

    ' Creamos un nuevo objeto Connection
    Set cnn = New ADODB.Connection

    ' Abrimos la conexión
    With
cnn
       .Provider = "Microsoft.Jet.OLEDB.4.0"
       .ConnectionString = "Data Source=C:\Mis documentos"
       .Properties("Extended Properties") = "TEXT;HDR=Yes"
       .Open
    End With

    ' Creamos un nuevo objeto Recordset
    Set rst = New ADODB.Recordset

    ' Configuramos y abrimos el Recordset
    With rst
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .Open "Nombre_Archivo#txt", cnn, , , adCmdTable
    End With

    Set
DataGrid1.DataSource = rst

ErrFormatoArchivo:
    ' Cualquier error deberá restaurar los valores de la
    ' configuración regional
    '

    ' Restablecemos el separador decimal
    dl = SetLocaleInfo(LOCALE_USER_DEFAULT, &HE, sSepDecimal1)

    ' Restablecemos el separador decimal monetario
    dl = SetLocaleInfo(LOCALE_USER_DEFAULT, &H16, sSepDecimal2)

End
Sub

 

Otros enlaces de interés:

Trabajar con los datos de un archivo de texto

Indice de Ejemplos de ADO


Enrique Martínez Montejo - 2004

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.