Версия для слабовидящих
Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

 

= Мир MS Excel/Перекодировка в Windows-1251 - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Перекодировка в Windows-1251
anka2004 Дата: Воскресенье, 01.12.2024, 15:14 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Добрый день! есть файл test_cod.003. Мне необходимо перекодировать его в Windows-1251. Использую следующую функцию, но нужный результат не получается:

Sub ПримерИспользования_ChangeTextCharset()

x = "d:\Andrew\*.003"
file = Dir(x)
Name = "d:\Andrew\" & file

' т.к Input из-за кодировки нерпаввильно считывает сточки, я пробую перекодировать файл в windows-1251
    Open Name For Input As #1    ' Open file for input.
        Do While Not EOF(1)    ' Check for end of file.
        Line Input #1, InputData    ' Read line of data.
    Debug.Print InputData    ' Print to the Immediate window.
Loop

    ИсходнаяСтрока = Name
    ' вызываем функцию ChangeTextCharset с указанием кодировок
    
    ПерекодированнаяСтрока = ChangeFileCharset(Name, "windows-1251")

    MsgBox "Результат перекодировки: """ & ПерекодированнаяСтрока & """", _
        vbInformation, "Исходная строка: """ & ИсходнаяСтрока & """"
Close #1
End Sub
Function ChangeFileCharset(ByVal Filename$, ByVal DestCharset$, _
                        Optional ByVal SourceCharset$) As Boolean
    ' функция перекодировки (смены кодировки) текстового файла
    ' В качестве параметров функция получает путь filename$ к текстовому файлу,
    ' и название кодировки DestCharset$ (в которую будет переведён файл)
    ' Функция возвращает TRUE, если перекодировка прошла успешно
    On Error Resume Next: Err.Clear
    With CreateObject("ADODB.Stream")
        .Type = 2
        If Len(SourceCharset$) Then .Charset = SourceCharset$    ' указываем исходную кодировку
        .Open
        .LoadFromFile Filename$    ' загружаем данные из файла
        FileContent$ = .ReadText   ' считываем текст файла в переменную FileContent$
        .Close
        .Charset = DestCharset$    ' назначаем новую кодировку
        .Open
        .WriteText FileContent$
        .SaveToFile Filename$, 2   ' сохраняем файл уже в новой кодировке
        .Close
    End With
    ChangeFileCharset = Err = 0
End Function

К сообщению приложен файл: test_cod.003 (0.1 Kb)
 
Ответить
СообщениеДобрый день! есть файл test_cod.003. Мне необходимо перекодировать его в Windows-1251. Использую следующую функцию, но нужный результат не получается:
[vba]
Sub ПримерИспользования_ChangeТextCharset()x = "d:\Andrew\*.003"file = Dir(x)Name = "d:\Andrew\" & file' т.к Input из-за кодировки нерпаввильно считывает сточки; я пробую перекодировать файл в windows-1251    Open Name For Input As Open1    ' file for input. Do        While Not Check EOF(1)    ' for end of file. Line        Input InputData Read1; line    ' of data. Debug.Print InputData    Print to    ' the Immediate window.Loop ИсходнаяСтрока Name     вызываем = функцию    ' ChangeTextCharset с указанием кодировок ПерекодированнаяСтрока Name        MsgBox = ChangeFileCharset(ПерекодированнаяСтрока; "windows-1251")     _ "Результат перекодировки: """ & vbInformation & """"; ИсходнаяСтрока           Close; "Исходная строка: """ & End & """"SubFunction ByVal1Filename ByVal ChangeFileCharset(DestCharset _$; Optional ByVal$; SourceCharset                           As Boolean функция$) перекодировки смены    ' кодировки текстового (файла В) качестве параметров    ' функция получает путь filename к текстовому файлу$ и название кодировки;    ' DestCharset в которую будет$ (переведён файл Функция возвращает если)    ' перекодировка прошла ИСТИНА; успешно On Error Resume    Next Err.Clear With Type: If    SourceCharset CreateObject("ADODB.Stream")        .Then = 2        Charset Len(SourceCharset$) указываем .исходную = кодировку$    ' Open LoadFromFile Filename        .загружаем        .данные из$    ' файла FileContent ReadText считываем        текст$ = .файла   ' в переменную FileContent Close Charset DestCharset$        .назначаем        .новую = кодировку$    ' Open WriteText FileContent        .SaveToFile        .Filename сохраняем$        .файл уже$; 2   ' в новой кодировке Close End With        .ChangeFileCharset    Err End    Function = undefined = 0undefined undefined
[/vba]

Автор - anka2004
Дата добавления - 01.12.2024 в 15:14
doober Дата: Воскресенье, 01.12.2024, 16:04 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 993
Репутация: 345 ±
Замечаний: 0% ±

Excel 2010
Добрый.А что вы хотите на выходе получить?
Почему сразу через ADODB не читать файл, он и так в кодировке windows-1251


 
Ответить
СообщениеДобрый.А что вы хотите на выходе получить?
Почему сразу через ADODB не читать файл, он и так в кодировке windows-1251

Автор - doober
Дата добавления - 01.12.2024 в 16:04
anka2004 Дата: Воскресенье, 01.12.2024, 16:21 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

doober, доброго времени суток! Мне нужно построчно прочитать этот файл, записав строчки в переменные. Стандартным считыванием стоки используя Line Input #1, InputData не получается, т.к. в переменную записывается весть текст из файл (не сточка я весь файл). Я предположил, что это из-за кодировки. Начал искать варианты, но так и не нашел. Мне из исходного файла нужно получить, файл который я смогу считывать построчно.
! Когда я этот же файл в ручном режиме через Notepad++ перекодирую в "windows-1251", то Line Input #1, InputData срабатывает
К сообщению приложен файл: 9243580.png (84.5 Kb)


Сообщение отредактировал anka2004 - Воскресенье, 01.12.2024, 16:39
 
Ответить
Сообщениеdoober, доброго времени суток! Мне нужно построчно прочитать этот файл, записав строчки в переменные. Стандартным считыванием стоки используя Line Input #1, InputData не получается, т.к. в переменную записывается весть текст из файл (не сточка я весь файл). Я предположил, что это из-за кодировки. Начал искать варианты, но так и не нашел. Мне из исходного файла нужно получить, файл который я смогу считывать построчно.
! Когда я этот же файл в ручном режиме через Notepad++ перекодирую в "windows-1251", то Line Input #1, InputData срабатывает

Автор - anka2004
Дата добавления - 01.12.2024 в 16:21
doober Дата: Воскресенье, 01.12.2024, 16:56 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 993
Репутация: 345 ±
Замечаний: 0% ±

Excel 2010
Цитата anka2004, 01.12.2024 в 16:21, в сообщении № 3 ( писал(а)):
Line Input #1, InputData не получается
Все нормально читает.Может этот вариант подойдет

Sub test()
Путь_К_Файлу = "C:\Users\Сергей\Downloads\test_cod.003"
x = Read_Text(Путь_К_Файлу)

End Sub

Function Read_Text(Путь_К_Файлу) As String()
    Dim oStream
    Dim S As String
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Type = 2
    oStream.Charset = "windows-1251"
    oStream.Open
    oStream.LoadFromFile Путь_К_Файлу
    S = oStream.ReadText
    oStream.Close
    Read_Text = Split(S, Chr(10))
End Function



К сообщению приложен файл: 16376974.png (27.4 Kb) · 14897417.png (131.9 Kb)




Сообщение отредактировал doober - Воскресенье, 01.12.2024, 16:58
 
Ответить
Сообщение
Цитата anka2004, 01.12.2024 в 16:21, в сообщении № 3 ( писал(а)):
Line Input #1, InputData не получается
Все нормально читает.Может этот вариант подойдет
[vba]
Sub test()Путь_К_Файлу = "C:\Users\Сергей\Downloads\test_cod.003"x = Read_Тext(Путь_К_Файлу)End SubFunction Read_Тext(Путь_К_Файлу) As String()    Dim oStream    Dim S As String    Set oStream = CreateObject("ADODB.Stream")    oStream.Type = 2    oStream.Charset = "windows-1251"    oStream.Open    oStream.LoadFromFile Путь_К_Файлу    S = oStream.ReadText    oStream.Close    Read_Text = Split(S; Chr(10))End Function
[/vba]


Автор - doober
Дата добавления - 01.12.2024 в 16:56
anka2004 Дата: Воскресенье, 01.12.2024, 17:35 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

doober, из вашего примера попробовал вставить результат в ячейку листа. Первая сточка из текстового файла есть, а как вторую получить? запускать в цикл из массива?. Не понимаю, трудно. Очень мало работаю с макросами. Думал через конструкцию буду читать каждую сточку а уже из сточки брать любые символы какие мне нужны.

Open Name For Input As #1    ' Open file for input.
        Do While Not EOF(1)    ' Check for end of file.
        Line Input #1, InputData    ' Read line of data.
    Debug.Print InputData    ' Print to the Immediate window


--- но, т.к. в InputData считываются сразу две строки идет конец файл а все.....
Если брать ваш пример, то не понимаю как обрабатывать вторую стоку
К сообщению приложен файл: 8985826.png (74.2 Kb) · 1150380.png (73.4 Kb)


Сообщение отредактировал anka2004 - Воскресенье, 01.12.2024, 17:36
 
Ответить
Сообщениеdoober, из вашего примера попробовал вставить результат в ячейку листа. Первая сточка из текстового файла есть, а как вторую получить? запускать в цикл из массива?. Не понимаю, трудно. Очень мало работаю с макросами. Думал через конструкцию буду читать каждую сточку а уже из сточки брать любые символы какие мне нужны.
[vba]
Open Name For Input As Open1    ' file for input. Do        While Not Check EOF(1)    ' for end of file. Line        Input InputData Read1, line    ' of data. Debug.Print InputData    Print to    ' the Immediate window undefined undefined
[/vba]
--- но, т.к. в InputData считываются сразу две строки идет конец файл а все.....
Если брать ваш пример, то не понимаю как обрабатывать вторую стоку

Автор - anka2004
Дата добавления - 01.12.2024 в 17:35
doober Дата: Воскресенье, 01.12.2024, 18:08 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 993
Репутация: 345 ±
Замечаний: 0% ±

Excel 2010


c=0
    Open Name For Input As #1    ' Open file for input.
        Do While Not EOF(1)    ' Check for end of file.
c=c+1
        Line Input #1, InputData    ' Read line of data.
cells(c,1)= InputData
Loop





Сообщение отредактировал doober - Воскресенье, 01.12.2024, 18:08
 
Ответить
Сообщение[vba]
  c=0    Open Name For Input As Open1    ' file for input. Do        While Not Check EOF(1)    ' for end of file.c c=Line+1        Input InputData Read1, line    ' of data. c InputDataLoop   cells(undefined,1)= undefined
[/vba]

Автор - doober
Дата добавления - 01.12.2024 в 18:08
anka2004 Дата: Воскресенье, 01.12.2024, 19:37 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

doober, данное решение не подходит, т.к. в одну ячейку записывает результат сразу двух строк. Если был получилось записать первую стоку в первую ячейку, вторую строку во вторую ячейку.
Если использовать такую конструкцию, то вроде бы получается:


Sub text_str()       
x = "d:\Andrew\*.003"
file = Dir(x)
Name = "d:\Andrew\" & file
        
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file1 = fso.opentextfile(Name)
    Do Until file1.AtEndOfStream
        read_line = file1.readline
        If read_line <> "" Then
            'For i = 1 To Len(read_line)
            '   Cells(j, i) = Mid(read_line, i, 1)
            'Next i
        
        x1 = Mid(read_line, 1, 3)
        x2 = Mid(read_line, 8, 5)
        
        
        End If
        'j = j + 1
    Loop
End Sub


Не понимаю, почему тогда у меня через Open Name For Input As #1 . Читает не строку а сразу весь файл и потом выходит из цикла....
К сообщению приложен файл: 2113073.png (90.0 Kb)


Сообщение отредактировал anka2004 - Воскресенье, 01.12.2024, 20:21
 
Ответить
Сообщениеdoober, данное решение не подходит, т.к. в одну ячейку записывает результат сразу двух строк. Если был получилось записать первую стоку в первую ячейку, вторую строку во вторую ячейку.
Если использовать такую конструкцию, то вроде бы получается:
[vba]
Sub text_str()       x = "d:\Andrew\*.003"file = Dir(x)Name = "d:\Andrew\" & file            Set fso = CreateObject("Scripting.FileSystemObject")    Set file1 = fso.opentextfile(Name)    Do Until file1.AtEndOfStream        read_line = file1.readline        If read_line <> "" Then            'For i = 1 To Len(read_line)             '   Cells(j, i) = Mid(read_line, i, 1)            'Next i                x1 = Mid(read_line, 1, 3)        x2 = Mid(read_line, 8, 5)                        End If        'j = j + 1    LoopEnd Sub
[/vba]
Не понимаю, почему тогда у меня через Open Name For Input As #1 . Читает не строку а сразу весь файл и потом выходит из цикла....

Автор - anka2004
Дата добавления - 01.12.2024 в 19:37
doober Дата: Воскресенье, 01.12.2024, 20:29 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 993
Репутация: 345 ±
Замечаний: 0% ±

Excel 2010
Об этом в самом начале и надо было сказать.
Поправил код


Sub Test()
    x$ = "d:\Andrew\"
    file = Dir(x$ & "*.003")
    C = 0
    Do While file <> ""
        Name$ = x$ & file
        C = C + 1
        s$ = ""
        Open Name$ For Input As #1
        Do While Not EOF(1)

            Line Input #1, InputData
            s$ = s$ & IIf(s$ = "", InputData, Chr(10) & InputData)
        Loop
        Close #1
        Cells(C, 1) = s$
        file = Dir
    Loop
End Sub





Сообщение отредактировал doober - Воскресенье, 01.12.2024, 20:36
 
Ответить
СообщениеОб этом в самом начале и надо было сказать.
Поправил код
[vba]
Sub Тest()    x$ = "d:\Andrew\"    file = Dir(x$ & "*.003")    C = 0    Do While file <> ""        Name$ = x$ & file        C = C + 1        s$ = ""        Open Name$ For Input As Do1        While Not Line EOF(1)            Input InputData s1; s            s$ = InputData$ & IIf(InputData$ = ""; Loop; Chr(10) & Close)        C        s file1        Cells(Dir; 1) = LoopEnd$        Sub = undefined    undefined undefined
[/vba]

Автор - doober
Дата добавления - 01.12.2024 в 20:29
i691198 Дата: Воскресенье, 01.12.2024, 20:39 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 423
Репутация: 131 ±
Замечаний: 0% ±

2016
А если просто открыть этот файл как текстовый и скопировать его содержимое в свой рабочий файл.

With Workbooks.Open("F:\Field\Test\test_cod.003")
    .Sheets(1).Cells.Copy ThisWorkbook.Sheets(1).Cells
    .Close
    End With

 
Ответить
СообщениеА если просто открыть этот файл как текстовый и скопировать его содержимое в свой рабочий файл.
[vba]
With Workbooks.Open("F:\Field\Тest\test_cod.003")      .Sheets(1).Cells.Copy ТhisWorkbook.Sheets(1).Cells      .Close    End With
[/vba]

Автор - i691198
Дата добавления - 01.12.2024 в 20:39
anka2004 Дата: Понедельник, 02.12.2024, 20:29 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

doober, Использую ваш код за исключением того, что удаляю строчу S$ = S$ & IIf(S$ = "", InputData, Chr(10) & InputData) - она по сути ни на что не влияет, т.к все равно необходимый мне файл не разбивает на отдельные строчки. Все же склоняюсь к тому, что имеет быть место именно кодировка файла, т.к. файл test.303 в win (видно на рисунке), а файл test_cod.003 который мне нужно прочитать построчно в другой кодировке (тоже видно из рисунка). Ваш код прочитал правильно и разбил на отдельные строчки только test.303

Sub test()

    x$ = "d:\Andrew\"
    file = Dir(x$ & "*.003")
    C = 1
    'C = 2
    Do While file <> ""
        Name$ = x$ & file
        S$ = ""
        Open Name$ For Input As #1
        Do While Not EOF(1)

            Line Input #1, InputData
            'S$ = S$ & IIf(S$ = "", InputData, Chr(10) & InputData)
            S$ = InputData
            Cells(C, 1) = S$
            C = C + 1
    Loop
        Close #1
        
        file = Dir
    Loop
End Sub



Может есть еще какой то способ? А у вас эти два файла читает построчно?. Если так то может у меня в нехватает какой нибудь библиотеки которую нужно подключить. А если все же дело в кодировке, то амба!!! ничего не получается.
К сообщению приложен файл: test.303 (0.1 Kb) · 8662795.003 (0.1 Kb) · 7112830.png (123.8 Kb)
 
Ответить
Сообщениеdoober, Использую ваш код за исключением того, что удаляю строчу S$ = S$ & IIf(S$ = "", InputData, Chr(10) & InputData) - она по сути ни на что не влияет, т.к все равно необходимый мне файл не разбивает на отдельные строчки. Все же склоняюсь к тому, что имеет быть место именно кодировка файла, т.к. файл test.303 в win (видно на рисунке), а файл test_cod.003 который мне нужно прочитать построчно в другой кодировке (тоже видно из рисунка). Ваш код прочитал правильно и разбил на отдельные строчки только test.303

[vba]
Sub test()    x$ = "d:\Andrew\"    file = Dir(x$ & "*.003")    C = 1    'C = 2    Do While file <> ""        Name$ = x$ & file        S$ = ""        Open Name$ For Input As Do1        While Not Line EOF(1)            Input InputData S1, S            'S$ = InputData$ & IIf(InputData$ = "", S, Chr(10) & InputData)             C$ = S             Cells(C, 1) = C$             Loop = Close + 1     file        Dir LoopEnd1                Sub = undefined    undefined undefined
[/vba]

Может есть еще какой то способ? А у вас эти два файла читает построчно?. Если так то может у меня в нехватает какой нибудь библиотеки которую нужно подключить. А если все же дело в кодировке, то амба!!! ничего не получается.

Автор - anka2004
Дата добавления - 02.12.2024 в 20:29
doober Дата: Вторник, 03.12.2024, 00:14 | Сообщение № 11
Группа: Друзья
Ранг: Ветеран
Сообщений: 993
Репутация: 345 ±
Замечаний: 0% ±

Excel 2010
Этот вариант открывает все правильно

Sub test()

    x$ = "d:\Andrew\"
    file = Dir(x$ & "*.003")
    C = 1
    'C = 2
    Do While file <> ""
        Name$ = x$ & file
        S$ = Read_Text(Name$)
        Z = Split(S$, vbCrLf)
        If UBound(Z) = 0 Then
            Z = Split(S$, vbCr)
            If UBound(Z) = 0 Then
                Z = Split(S$, vbLf)
            End If
        End If
    For n = 0 To UBound(Z)
    
    If Z(n) <> "" Then
            Cells(C, 1) = Z(n)
            C = C + 1
    
    End If
    Next
        file = Dir
    Loop
End Sub

Function Read_Text(Путь_К_Файлу) As String
    Dim oStream
    Dim S As String
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Type = 2
    oStream.Charset = "utf-8"
    oStream.Open
    oStream.LoadFromFile Путь_К_Файлу
    Read_Text = oStream.ReadText
    oStream.Close

End Function



 
Ответить
СообщениеЭтот вариант открывает все правильно[vba]
Sub test()    x$ = "d:\Andrew\"    file = Dir(x$ & "*.003")    C = 1    'C = 2    Do While file <> ""        Name$ = x$ & file        S$ = Read_Тext(Name$)        Z = Split(S$; vbCrLf)        If UBound(Z) = 0 Then            Z = Split(S$; vbCr)            If UBound(Z) = 0 Then                Z = Split(S$; vbLf)            End If        End If       For n = 0 To UBound(Z)              If Z(n) <> "" Then            Cells(C; 1) = Z(n)            C = C + 1              End If       Next        file = Dir    LoopEnd SubFunction Read_Тext(Путь_К_Файлу) As String    Dim oStream    Dim S As String    Set oStream = CreateObject("ADODB.Stream")    oStream.Type = 2    oStream.Charset = "utf-8"    oStream.Open    oStream.LoadFromFile Путь_К_Файлу    Read_Text = oStream.ReadText    oStream.CloseEnd Function
[/vba]

Автор - doober
Дата добавления - 03.12.2024 в 00:14
anka2004 Дата: Вторник, 03.12.2024, 21:40 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

doober, Очень круто!!!! Спасибо! Только мне не понятно как работает сам код. Можно более подробнее как работает программа?


Сообщение отредактировал anka2004 - Вторник, 03.12.2024, 21:41
 
Ответить
Сообщениеdoober, Очень круто!!!! Спасибо! Только мне не понятно как работает сам код. Можно более подробнее как работает программа?

Автор - anka2004
Дата добавления - 03.12.2024 в 21:40
doober Дата: Вторник, 03.12.2024, 22:46 | Сообщение № 13
Группа: Друзья
Ранг: Ветеран
Сообщений: 993
Репутация: 345 ±
Замечаний: 0% ±

Excel 2010
Цитата anka2004, 03.12.2024 в 21:40, в сообщении № 12 ( писал(а)):
как работает сам код

Вы думаете, что я сам знаю, как работает.
Сделайте breakpoint в интересующих строках кода, в LocalsWindow смотрите, что происходит с переменными.
Та и поймете, ничего сложного нет.


 
Ответить
Сообщение
Цитата anka2004, 03.12.2024 в 21:40, в сообщении № 12 ( писал(а)):
как работает сам код

Вы думаете, что я сам знаю, как работает.
Сделайте breakpoint в интересующих строках кода, в LocalsWindow смотрите, что происходит с переменными.
Та и поймете, ничего сложного нет.

Автор - doober
Дата добавления - 03.12.2024 в 22:46
  • Страница 1 из 1
  • 1
Поиск:

Рейтинг@Mail.ru Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!