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

Вход

Регистрация

Напомнить пароль

 

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

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

Добрый день! есть файл test_cod.003. Мне необходимо перекодировать его в Windows-1251. Использую следующую функцию, но нужный результат не получается:
[vba]
Код
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

[/vba]
К сообщению приложен файл: test_cod.003 (0.1 Kb)
 
Ответить
СообщениеДобрый день! есть файл test_cod.003. Мне необходимо перекодировать его в Windows-1251. Использую следующую функцию, но нужный результат не получается:
[vba]
Код
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

[/vba]

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

Excel 2010
Line Input #1, InputData не получается
Все нормально читает.Может этот вариант подойдет
[vba]
Код
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
[/vba]

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




Сообщение отредактировал doober - Воскресенье, 01.12.2024, 16:58
 
Ответить
Сообщение
Line Input #1, InputData не получается
Все нормально читает.Может этот вариант подойдет
[vba]
Код
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
[/vba]


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

doober, из вашего примера попробовал вставить результат в ячейку листа. Первая сточка из текстового файла есть, а как вторую получить? запускать в цикл из массива?. Не понимаю, трудно. Очень мало работаю с макросами. Думал через конструкцию буду читать каждую сточку а уже из сточки брать любые символы какие мне нужны.
[vba]
Код
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
[/vba]
--- но, т.к. в InputData считываются сразу две строки идет конец файл а все.....
Если брать ваш пример, то не понимаю как обрабатывать вторую стоку
К сообщению приложен файл: 8985826.png (74.2 Kb) · 1150380.png (73.4 Kb)


Сообщение отредактировал anka2004 - Воскресенье, 01.12.2024, 17:36
 
Ответить
Сообщениеdoober, из вашего примера попробовал вставить результат в ячейку листа. Первая сточка из текстового файла есть, а как вторую получить? запускать в цикл из массива?. Не понимаю, трудно. Очень мало работаю с макросами. Думал через конструкцию буду читать каждую сточку а уже из сточки брать любые символы какие мне нужны.
[vba]
Код
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
[/vba]
--- но, т.к. в InputData считываются сразу две строки идет конец файл а все.....
Если брать ваш пример, то не понимаю как обрабатывать вторую стоку

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

Excel 2010
[vba]
Код

  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
[/vba]




Сообщение отредактировал doober - Воскресенье, 01.12.2024, 18:08
 
Ответить
Сообщение[vba]
Код

  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
[/vba]

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

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
    Loop
End Sub
[/vba]
Не понимаю, почему тогда у меня через 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
    Loop
End Sub
[/vba]
Не понимаю, почему тогда у меня через Open Name For Input As #1 . Читает не строку а сразу весь файл и потом выходит из цикла....

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

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

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

[/vba]




Сообщение отредактировал doober - Воскресенье, 01.12.2024, 20:36
 
Ответить
СообщениеОб этом в самом начале и надо было сказать.
Поправил код
[vba]
Код

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

[/vba]

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

А если просто открыть этот файл как текстовый и скопировать его содержимое в свой рабочий файл.
[vba]
Код
With Workbooks.Open("F:\Field\Test\test_cod.003")
      .Sheets(1).Cells.Copy ThisWorkbook.Sheets(1).Cells
      .Close
    End With
[/vba]
 
Ответить
СообщениеА если просто открыть этот файл как текстовый и скопировать его содержимое в свой рабочий файл.
[vba]
Код
With Workbooks.Open("F:\Field\Test\test_cod.003")
      .Sheets(1).Cells.Copy ThisWorkbook.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

[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 #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
[/vba]

Может есть еще какой то способ? А у вас эти два файла читает построчно?. Если так то может у меня в нехватает какой нибудь библиотеки которую нужно подключить. А если все же дело в кодировке, то амба!!! ничего не получается.
К сообщению приложен файл: 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 #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
[/vba]

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

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

Excel 2010
Этот вариант открывает все правильно[vba]
Код
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]


 
Ответить
СообщениеЭтот вариант открывает все правильно[vba]
Код
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]

Автор - 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
Группа: Друзья
Ранг: Ветеран
Сообщений: 980
Репутация: 334 ±
Замечаний: 0% ±

Excel 2010
как работает сам код

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


 
Ответить
Сообщение
как работает сам код

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

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

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