Добрый день! есть файл 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 с указанием кодировок
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. Мне необходимо перекодировать его в 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 с указанием кодировок
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
doober, доброго времени суток! Мне нужно построчно прочитать этот файл, записав строчки в переменные. Стандартным считыванием стоки используя Line Input #1, InputData не получается, т.к. в переменную записывается весть текст из файл (не сточка я весь файл). Я предположил, что это из-за кодировки. Начал искать варианты, но так и не нашел. Мне из исходного файла нужно получить, файл который я смогу считывать построчно. ! Когда я этот же файл в ручном режиме через Notepad++ перекодирую в "windows-1251", то Line Input #1, InputData срабатывает
doober, доброго времени суток! Мне нужно построчно прочитать этот файл, записав строчки в переменные. Стандартным считыванием стоки используя Line Input #1, InputData не получается, т.к. в переменную записывается весть текст из файл (не сточка я весь файл). Я предположил, что это из-за кодировки. Начал искать варианты, но так и не нашел. Мне из исходного файла нужно получить, файл который я смогу считывать построчно. ! Когда я этот же файл в ручном режиме через Notepad++ перекодирую в "windows-1251", то Line Input #1, InputData срабатываетanka2004
Все нормально читает.Может этот вариант подойдет [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]
Код
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
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 считываются сразу две строки идет конец файл а все..... Если брать ваш пример, то не понимаю как обрабатывать вторую стоку
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
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]
[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
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
[/vba] Не понимаю, почему тогда у меня через Open Name For Input As #1 . Читает не строку а сразу весь файл и потом выходит из цикла....
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
Об этом в самом начале и надо было сказать. Поправил код [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]
Об этом в самом начале и надо было сказать. Поправил код [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
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]
Может есть еще какой то способ? А у вас эти два файла читает построчно?. Если так то может у меня в нехватает какой нибудь библиотеки которую нужно подключить. А если все же дело в кодировке, то амба!!! ничего не получается.
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
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
Вы думаете, что я сам знаю, как работает. Сделайте breakpoint в интересующих строках кода, в LocalsWindow смотрите, что происходит с переменными. Та и поймете, ничего сложного нет.
Вы думаете, что я сам знаю, как работает. Сделайте breakpoint в интересующих строках кода, в LocalsWindow смотрите, что происходит с переменными. Та и поймете, ничего сложного нет.doober