powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт файлов в формате ANSI, UTF-8 и UTF-16
16 сообщений из 16, страница 1 из 1
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40113913
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжение поста Импорт 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
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40113923
I2S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
I2S
Гость
для 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
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40113935
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробую.
...
Рейтинг: 0 / 0
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40114034
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss, творение не мое, не тестил на примере.
...
Рейтинг: 0 / 0
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40114037
Eugene-LS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40114168
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробую все предложенные варианты.

Правда в предложении Eugene-LS придётся кое-что переделать. Входной файл может достигать несколько сотен КБ, так что скорее всего придётся считывать по строкам.
...
Рейтинг: 0 / 0
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40114224
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
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40114743
galalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наиболее правильным вариантом будет читать текстовый файл с разделителями используя 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
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40114765
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galalex, сАвсем не читатель? Первый же ответ 22399333 . Набираешь сообщения?
...
Рейтинг: 0 / 0
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40115364
galalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург,
1. Решение, предложенное I2S, решением исходной задачи не является, и даже полурешением. Это лишь начальная стадия изобретения велосипеда.
2. Если ты сегодня не понимаешь важности ясности кода - твоя проблема.
3. Насчёт "Набираешь сообщения" ))). Не поверишь, я день ржал )). Спасибо тебе за отличное настроение. В моём личном рейтинге ты соревнуешься с Рожковым за лучшую шутку ноября 21.
...
Рейтинг: 0 / 0
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40115365
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galalex
я день ржал
конь? Продолжай в том же духе.
galalex
2. Если ты сегодня не понимаешь важности ясности кода - твоя проблема.
смотри не лопни от собственной значимости.
galalex
21.
видимо не отпустило.
...
Рейтинг: 0 / 0
Импорт файлов в формате ANSI, UTF-8 и UTF-16
    #40115368
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galalex
1. Решение, предложенное I2S, решением исходной задачи не является, и даже полурешением. Это лишь начальная стадия изобретения велосипеда.

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

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

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

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


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