Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт файлов в формате ANSI, UTF-8 и UTF-16 / 16 сообщений из 16, страница 1 из 1
22.11.2021, 18:57
    #40113913
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Продолжение поста Импорт CSV файла в Access

Вынес в отдельную ветку,

Проблема следующая.
Excel и Access работают с форматом ANSI (насколько я знаю). Для ввода в программу присылают файлы CSV (те же текстовики) в форматах ANSI, UTF-8 и UTF-16
ANSI и UTF-16 грузятся без проблем (от UTF-16 не ожидал), а вот UTF-8 нормально загрузить не могу. Использую для конвертации в ANSI стороннюю программу Recode (маленькая, работает без установки хелпа нет, так что про командный режим нет данных).
Но начальство хочет, чтобы всё решалось в одной программе и никаких лишних телодвижений (женщины-операторы).

Пробовал грузить вручную через "Внешние данные"

Вот и возникает вопрос, как программно определить формат файла и как обработать файл в формате UTF-8.

Пример файла UTF-8 прикрепляю. Если надо то и программу кину.


-------------------------------------------------------------
Мы рождены чтоб сказки сделать былью! Даже самые страшные...
...
Рейтинг: 0 / 0
22.11.2021, 19:42
    #40113923
I2S
I2S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
для UTF8:

Option Compare Database

Option Explicit

Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long

Public Function ToUTF8(ByVal sText As String) As String
Dim nRet As Long, strRet As String

strRet = String(Len(sText) * 2, vbNullChar)
nRet = WideCharToMultiByte(65001, &H0, StrPtr(sText), Len(sText), StrPtr(strRet), Len(sText) * 2, 0&, 0&)

ToUTF8 = Left(StrConv(strRet, vbUnicode), nRet)
End Function

Public Function FromUTF8(ByVal sText As Variant) As String
Dim nRet As Long, strRet As String

sText = Nz(sText, "")

strRet = String(Len(sText), vbNullChar)
nRet = MultiByteToWideChar(65001, &H0, sText, Len(sText), StrPtr(strRet), Len(strRet))

FromUTF8 = Left(strRet, nRet)
End Function
...
Рейтинг: 0 / 0
22.11.2021, 20:04
    #40113935
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Спасибо, попробую.
...
Рейтинг: 0 / 0
23.11.2021, 00:32
    #40114034
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Joss, творение не мое, не тестил на примере.
...
Рейтинг: 0 / 0
23.11.2021, 01:25
    #40114037
Eugene-LS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Joss
Пример файла UTF-8 прикрепляю. Если надо то и программу кину.

Примерно так можно:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub test01()
'Перекодирование файла из UTF-8 в ANSI/1251
Dim obj As Object, sVal$

    sVal = "d:\Temp\products_utf8.csv"

    Set obj = CreateObject("ADODB.Stream")
    obj.Charset = "utf-8"
    obj.Open
    obj.LoadFromFile (sVal)
    sVal = obj.ReadText()

    Debug.Print sVal
    
End Sub
...
Рейтинг: 0 / 0
23.11.2021, 14:11
    #40114168
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Спасибо, попробую все предложенные варианты.

Правда в предложении Eugene-LS придётся кое-что переделать. Входной файл может достигать несколько сотен КБ, так что скорее всего придётся считывать по строкам.
...
Рейтинг: 0 / 0
23.11.2021, 16:49
    #40114224
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Joss
Вот и возникает вопрос, как программно определить формат файла и как обработать файл в формате UTF-8.
Для файлов в UTF кодировке предусмотрен признак кодировки (называется BOM - дополнительные первые 2-3 байта). Но он не обязательный и в вашем примере его нет. Прочитать BOM можно, открыв файл как бинарный, а если его нет, то определить, что это UTF-16 легко, а ANSI или UTF-8 - это еще те танцы с бубном, и лезть туда не советую.
Попробуйте такой код. Он читает указанный файл, автоматически определяя кодировку, и сохраняет копию в ANSI, заменяя существующий.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    Dim lobjStream As ADODB.Stream
    Dim lobjTarget As ADODB.Stream
        
    Set lobjStream = New ADODB.Stream
    Set lobjTarget = New ADODB.Stream
        
    lobjStream.Open
    lobjTarget.Open
    
    lobjStream.Charset = "_autodetect_all" 'просто немного подлый - учтите, что автоопределение работает не для всех кодировок
    lobjStream.LoadFromFile lsFileSource
    
    lobjTarget.Charset = "windows-1251"
    lobjStream.CopyTo lobjTarget
    lobjTarget.SaveToFile lsFileToCopy, adSaveCreateOverWrite

О результате сообщите, пжл.
...
Рейтинг: 0 / 0
25.11.2021, 08:53
    #40114743
galalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Наиболее правильным вариантом будет читать текстовый файл с разделителями используя ADO.Recordset через через Microsoft Text ODBC Driver, подробно изложено здесь Экспорт денежного поля в формат CSV . К сожалению, драйвер не поддерживает преобразование из UTF-8. Поэтому текстовые поля в UTF-8 из ADO.Recordset следует преобразовывать функцией FromUTF8():
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
' CodePage constant for UTF-8
Private Const CP_UTF8 As Long = 65001
' Maps a character string to a UTF-16 (wide character) string
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpMultiByteStr As String, _
    ByVal cchMultiByte As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long) As Long
' Maps a UTF-16 (wide character) string to a new character string
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As Long, _
    ByVal cchMultiByte As Long, _
    ByVal lpDefaultChar As Long, _
    ByVal lpUsedDefaultChar As Long) As Long
  
Public Function ToUTF8(ByVal Value As String) As String
    Dim nRet As Long
    Dim strRet As String
    strRet = String(Len(Value) * 2, vbNullChar)
    nRet = WideCharToMultiByte(CP_UTF8, &H0, StrPtr(Value), Len(Value), StrPtr(strRet), Len(Value) * 2, 0&, 0&)
    ToUTF8 = Left$(StrConv(strRet, vbUnicode), nRet)
End Function
 
Public Function FromUTF8(ByVal Value As String) As String
    Dim nRet As Long
    Dim strRet As String
    strRet = String(Len(Value), vbNullChar)
    nRet = MultiByteToWideChar(CP_UTF8, &H0, Value, Len(Value), StrPtr(strRet), Len(strRet))
    FromUTF8 = Left$(strRet, nRet)
End Function
...
Рейтинг: 0 / 0
25.11.2021, 10:36
    #40114765
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
galalex, сАвсем не читатель? Первый же ответ 22399333 . Набираешь сообщения?
...
Рейтинг: 0 / 0
26.11.2021, 21:44
    #40115364
galalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Панург,
1. Решение, предложенное I2S, решением исходной задачи не является, и даже полурешением. Это лишь начальная стадия изобретения велосипеда.
2. Если ты сегодня не понимаешь важности ясности кода - твоя проблема.
3. Насчёт "Набираешь сообщения" ))). Не поверишь, я день ржал )). Спасибо тебе за отличное настроение. В моём личном рейтинге ты соревнуешься с Рожковым за лучшую шутку ноября 21.
...
Рейтинг: 0 / 0
26.11.2021, 21:46
    #40115365
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
galalex
я день ржал
конь? Продолжай в том же духе.
galalex
2. Если ты сегодня не понимаешь важности ясности кода - твоя проблема.
смотри не лопни от собственной значимости.
galalex
21.
видимо не отпустило.
...
Рейтинг: 0 / 0
26.11.2021, 22:12
    #40115368
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
galalex
1. Решение, предложенное I2S, решением исходной задачи не является, и даже полурешением. Это лишь начальная стадия изобретения велосипеда.

galalex, да, забыл сказать, это практически один в один одинаковый код с тем что ты гордо тиснул тут
...
Рейтинг: 0 / 0
26.11.2021, 23:12
    #40115372
galalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Панург, значимость это у тебя, иначе скромнее бы был. "Молодец среди овец, а против молодца сам овца". Заканчивай своей пустой болтовнёй "набирать сообщения".
...
Рейтинг: 0 / 0
26.11.2021, 23:21
    #40115373
galalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
Панург
galalex
1. Решение, предложенное I2S, решением исходной задачи не является, и даже полурешением. Это лишь начальная стадия изобретения велосипеда.

galalex, да, забыл сказать, это практически один в один одинаковый код с тем что ты гордо тиснул тут

Ты походу даже не врубаешься в смысл сказанных мною слов. Тебе помочь догадаться, или сам допрёшь, коль такой важный?
...
Рейтинг: 0 / 0
27.11.2021, 08:21
    #40115430
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
galalex
Ты походу даже не врубаешься в смысл сказанных мною слов. Тебе помочь догадаться, или сам допрёшь, коль такой важный?
ну-ка, просвети! Что остановился?
...
Рейтинг: 0 / 0
27.11.2021, 08:23
    #40115431
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт файлов в формате ANSI, UTF-8 и UTF-16
galalex
коль такой важный

не, я не важный. Важный, по твоим словам ты.
забористые у тебя вещества
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт файлов в формате ANSI, UTF-8 и UTF-16 / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]