Asignar codificación UTF-8 a una exportación de texto.

Dudas sobre código
zlagos
Nivel 3
Mensajes: 79
Registrado: Mar Nov 01, 2016 12:14 pm

Asignar codificación UTF-8 a una exportación de texto.

Mensajepor zlagos » Sab Ago 04, 2018 7:34 pm

Bien, gracias a Neckkito, he solucionado el problema de las comillas al exportar un texto desde access.

Ahora el problema que tengo es que lo exporta como ANSI, y yo lo necesito como UTF-8.

Aquí el código de exportación:

Código: Seleccionar todo

Private Sub Exportar_Click()
Dim rst As DAO.Recordset
Dim Archivo As String
Archivo = "E:\arcade\attract\romlists\MMClasicas.txt"
Set rst = CurrentDb.OpenRecordset("MMClasicas")
Open Archivo For Output As #1
While Not rst.EOF
Print #1, rst![Name] & ";" & rst![Title] & ";" & rst![Emulator] & ";" & rst![CloneOf] & ";" & rst![Year] & ";" & rst![Manufacturer] & ";" & rst![Category] & ";" & rst![Players] & ";" & rst![Rotation] & ";" & rst![Control] & ";" & rst![Status] & ";" & rst![DisplayCount] & ";" & rst![DisplayType] & ";" & rst![AltRomname] & ";" & rst![AltTitle] & ";" & rst![Extra] & ";" & rst![Buttons]
rst.MoveNext
Wend
Close #1
rst.Close: Set rst = Nothing
MsgBox "La romlist " & Archivo & " ha sido creado con éxito.", vbInformation, "Creación de Romlist"
End Sub


Lo unico que sé es que el código para UTF-8 es 65001, pero no sé ni dónde ni cómo aplicarlo.

Avatar de Usuario
Neckkito
Moderador
Mensajes: 785
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Asignar codificación UTF-8 a una exportación de texto.

Mensajepor Neckkito » Sab Ago 04, 2018 7:40 pm

Hola!

No lo he probado, pero la solución que ofrece Fayad, en principio, no tiene mala pinta, aunque represente otra sistemática de trabajo.

Para quien no haya seguido los múltiples hilos esa recomendación que menciono es esta: http://nksvaccessolutions.com/Foro/viewtopic.php?p=6976#p6977

Saludos.
Access MVP 2017-2019
http://bit.ly/NckAccess

zlagos
Nivel 3
Mensajes: 79
Registrado: Mar Nov 01, 2016 12:14 pm

Re: Asignar codificación UTF-8 a una exportación de texto.

Mensajepor zlagos » Sab Ago 04, 2018 7:52 pm

Ya lo he visto, pero te digo lo mismo que a Fayad, que mis conocimientos de vba de access no dan de sí lo suficiente como para, leyendo ese código que me facilita, solucionar mi problema.

Ya me costó lo mío entender lo que hacía el código que he puesto aquí... :oops:

Avatar de Usuario
Neckkito
Moderador
Mensajes: 785
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Asignar codificación UTF-8 a una exportación de texto.

Mensajepor Neckkito » Dom Ago 05, 2018 10:38 am

Vamos a ver...

Con el método del FreeFile, y hasta donde yo sé, lo único que haces es crear un archivo de texto basándote en las características del Notepad (Bloc de Notas) de tu sistema (lo digo así para entendernos). Y, en general, el Notepad está configurado para, por defecto, crear archivos de texto con codificación ANSI.

También, y hasta donde yo sé, el sistema del FreeFile no te permite asignar codificaciones diferentes, con lo cual te tienes que apañar con lo que hay; esto es, ANSI. Cierto es que hay soluciones maravillosas por ahí que hablan de toquetear el registro de Windows, o también aplicaciones que te cambian la configuración de la codificación por defecto del bloc de notas. Sin embargo, no puedo recomendarlas porque no he utilizado nada de eso (y espero no tener que utilizarlo). :?

Como bien indicaba Fayad, si utilizamos ADO Stream sí podemos especificar la codificación de caracteres, dado que esa es precisamente una de las propiedades del objeto. Ahora bien, ahora que he mirado con más detenimiento la página recomendada por Fayad (http://computingcoding.blogspot.com/2012/03/writing-pure-utf-8-file-in-vba-using.html) veo dos cosas que no me gustan:

1.- Creo que utiliza un código un tanto confuso para lo que es escribir un triste fichero de texto.
2.- Cae en una contradicción al indicar que no hay que olvidarse de registrar la librería de ADO para después desarrollar el código con latebinding, lo cual hace que sea precisamente innecesario registrar dicha librería. :shock:

En definitiva, que ahí tienes un ejemplo de cómo podría aplicarse ADO para escribir un fichero de texto: http://www.mediafire.com/file/4zzg5hynb1acvjz/zLagos.AdoStream.zip/file

Saludos.
Access MVP 2017-2019
http://bit.ly/NckAccess

pitxiku
VIP
Reto02
Mensajes: 201
Registrado: Sab Sep 30, 2017 6:23 pm

Re: Asignar codificación UTF-8 a una exportación de texto.

Mensajepor pitxiku » Dom Ago 05, 2018 6:24 pm

Si sólo se trata de exportar datos a un archivo de texto, y siempre van a ser los mismos campos con el mismo formato y delimitadores, yo usaría una especificación de exportación:

1. Crea una consulta con los campos deseados, filtros necesarios, ordenación, … y guárdala.
2. Teniendo seleccionada la consulta en el panel de navegación, ve al ribbon Datos externos -> Exportar archivo de texto.
3. Indica un nombre de archivo, y con todas las casillas desmarcadas, pulsa "Aceptar".
4. Indica si quieres formato fijo o delimitado, separadores, … y ve pulsando el botón "Siguiente".
5. Cuando ya no te deje pulsar en "Siguiente", pulsa en "Avanzaado" (a la izquierda del asistente).
6. En la nueva ventana, tienes más posibilidades para ajustar, incluyendo la página de códigos (UTF, ANSI, …).
7. Cuando tengas todo como te guste, pulsa en "Guardar como". Acabas de crear tu especificación de exportación.
8. Ve pulsando en "Aceptar" para cerrar ventanas del asistente. Cuando cierres todo, comprueba si el archivo se ha creado como necesitas.
9. Ahora nos queda usar la especificación: se puede usar con la macro ImportarExportarTexto (debe estar activa la opción "Mostrar todas las acciones"), o con el método DoCmd.TransferText.

Y todo el código que has posteado, se puede quedar en:

Código: Seleccionar todo

Private Sub Exportar_Click()
    DoCmd.TransferText acExportDelim, "Mi especificación creada", "MMClasicas", "E:\arcade\attract\romlists\MMClasicas.txt"
    MsgBox "La romlist " & Archivo & " ha sido creado con éxito.", vbInformation, "Creación de Romlist"
End Sub


Más info:

- https://support.office.com/es-es/articl ... 2950814140
- https://support.office.com/es-es/articl ... 1fe75321b5
- https://msdn.microsoft.com/es-es/vba/ac ... hod-access
- https://msdn.microsoft.com/es-es/librar ... 92475.aspx


Nota: También podemos usar un archivo Schema.ini, pero me parece que la especificación es más sencilla de usar.

zlagos
Nivel 3
Mensajes: 79
Registrado: Mar Nov 01, 2016 12:14 pm

Re: Asignar codificación UTF-8 a una exportación de texto.

Mensajepor zlagos » Lun Ago 06, 2018 6:30 pm

Gracias por vuestra ayuda, y disculpar mis escasos conocimientos.

El caso es que voy a utilizar dos botones en vez de uno, para usar ambos códigos, que funcionan igual de bien, así guardaré ambas formas de crear el archivo:

Imagen

Aquí vuestras soluciones:

Código: Seleccionar todo

Private Sub Exportar_Click()
        'Nota: al usar latebinding no es necesario registrar referencia alguna de ADO.
    Dim objStream
    Dim Archivo As String
    Dim miTexto As String
    Dim rst As DAO.Recordset
   
    Archivo = "E:\arcade\attract\romlists\MMClasicas.txt"

    Set objStream = CreateObject("ADODB.Stream")
    Set rst = CurrentDb.OpenRecordset("MMClasicas", dbOpenForwardOnly)
   
    With objStream
        .Charset = "utf-8"
        .Open
        With rst
            Do Until .EOF
                miTexto = miTexto & .Fields("Name") & ";" & .Fields("Title") & ";" & .Fields("Emulator") & ";" & .Fields("CloneOf") & ";" & .Fields("Year") & ";" & .Fields("Manufacturer") & ";" & .Fields("Category") & ";" & .Fields("Players") & ";" & .Fields("Rotation") & ";" & .Fields("Control") & ";" & .Fields("Status") & ";" & .Fields("DisplayCount") & ";" & .Fields("DisplayType") & ";" & .Fields("AltRomname") & ";" & .Fields("AltTitle") & ";" & .Fields("Extra") & ";" & .Fields("Buttons") & vbCrLf
                .MoveNext
            Loop
        End With
        objStream.WriteText miTexto
        .SaveToFile Archivo, 2
    End With
   
    MsgBox "La romlist " & Archivo & " ha sido creado con éxito.", vbInformation, "Creación de Romlist"

    rst.Close
    Set rst = Nothing
    Set objStream = Nothing
End Sub


Código: Seleccionar todo

Private Sub Lanzar_Exportacion_Click()
DoCmd.RunSavedImportExport "Exportación: MMClasicas"
MsgBox "La romlist MMClasicas.txt ha sido creado con éxito.", vbInformation, "Creación de Romlist"
End Sub


En fin, muchas gracias por todo, de corazón. :D


Volver a “Código VBA”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados