Как прочитать кусками текстовый файл vba
Argument ‘Topic id’ is null or empty
Сейчас на форуме
© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru
Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.
| ООО «Планета Эксел» ИНН 7735603520 ОГРН 1147746834949 |
ИП Павлов Николай Владимирович ИНН 633015842586 ОГРНИП 310633031600071 |
Практическое руководство. Чтение из текстовых файлов в Visual Basic
Метод ReadAllText объекта My.Computer.FileSystem позволяет считывать данные из текстового файла. Если содержимое файла имеет определенную кодировку, например ASCII или UTF-8, ее можно указать в аргументе.
Если вы производите чтение из файла с символами национальных алфавитов, необходимо указать кодировку файла.
Чтобы прочитать файл по одной строке, используйте метод OpenTextFileReader объекта My.Computer.FileSystem . Метод OpenTextFileReader возвращает объект StreamReader. С помощью метода ReadLine объекта StreamReader можно прочитать файл по одной строке. Проверить, достигнут ли конец файла, можно с помощью метода EndOfStream объекта StreamReader .
Чтение данных из текстового файла
Для считывания содержимого текстового файла в строку используйте метод ReadAllText объекта My.Computer.FileSystem , указав путь. В следующем примере содержимое файла test.txt считывается в строку и затем отображается в окне сообщения.
Dim fileReader As String fileReader = My.Computer.FileSystem.ReadAllText("C:\test.txt") MsgBox(fileReader)
Чтение данных из зашифрованного текстового файла
Для считывания содержимого текстового файла в строку используйте метод ReadAllText объекта My.Computer.FileSystem , указав путь и тип кодировки файла. В следующем примере содержимое файла test.txt в кодировке UTF32 считывается в строку и затем отображается в окне сообщения.
Dim fileReader As String fileReader = My.Computer.FileSystem.ReadAllText("C:\test.txt", System.Text.Encoding.UTF32) MsgBox(fileReader)
Отказоустойчивость
При следующих условиях возможно возникновение исключения:
- Путь является недопустимым, поскольку путь представляет собой строку нулевой длины (пустую строку), либо содержит только пробелы, либо содержит недопустимые знаки, либо представляет собой путь к устройству (ArgumentException).
- Путь не является допустимым, поскольку он равен Nothing (ArgumentNullException).
- Файл не существует (FileNotFoundException).
- Файл уже используется другим процессом или возникла ошибка ввода-вывода (IOException).
- Длина пути превышает максимальную длину, определенную в системе (PathTooLongException).
- Имя файла или каталога в пути содержит двоеточие (:) или имеет недопустимый формат (NotSupportedException).
- Не хватает памяти для записи строки в буфер (OutOfMemoryException).
- У пользователя отсутствуют необходимые разрешения на просмотр пути (SecurityException).
По имени файла не всегда можно с уверенностью судить о его содержимом. Например, файл с именем Form1.vb может вовсе не быть исходным файлом Visual Basic.
Следует проверять все входные данные перед использованием их в приложении. Содержимое файла может отличаться от ожидаемого, поэтому может не удаться прочесть файл с помощью методов чтения.
См. также раздел
- FileSystem
- ReadAllText
- Чтение из файлов
- Практическое руководство. Чтение из текстовых файлов с разделителями-запятыми
- Практическое руководство. Чтение из текстовых файлов с полями фиксированного размера
- Практическое руководство. Чтение из текстовых файлов различных форматов
- Устранение неполадок: Чтение из текстовых файлов и запись в такие файлы
- Пошаговое руководство: Операции с файлами и каталогами в Visual Basic
- Кодировки файлов
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Как прочитать кусками текстовый файл vba
Копирование из текстового файла в заданные ячейки книги
Geart:
Добрый день. Возникла задача копирования заданного числа знаков из известной строчки текстового файла. Возможно ли это реализовать на VBA? Я новичок в этом деле, поэтому если можно объяснять по понятнее. 🙂 Пример тестового файла во вложении.
McConst:
Принципиально это возможно. Вод код, который использует функцию для чтения произвольной строки с определенной длиной начиная от заданной позиции. Если длина не задана, по умолчанию берется длина всей строки. Если позиция в строке не задана, по умолчанию берется позиция первого символа в строке.
Код: (vb)
Public Sub test()
Worksheets(1).Cells(1, 1) = FileToString(File:=»C:/Doosan_report_2013-07-17.txt»)
End Sub
Public Function FileToString(File As String, Optional Row As Long = 1, Optional Position As Long = 1, Optional length As Long = 0) As String
‘Чтение куска текста из файла
Dim text As String ‘Сюда будем читать весь текст из файла
Dim List As Variant ‘Здесь текст будет храниться построчно
Dim oStream
Set oStream = CreateObject(«ADODB.Stream»)
With oStream
.Type = 2 ‘Текстовый файл
.Charset = «utf-8» ‘Кодировка, в которой хранится текст в данном файле
.Open
.LoadFromFile File
text = .ReadText ‘Чтение текста из файла в переменную
.Close
End With
Set oStream = Nothing
List = Split(text, vbCrLf)
‘Если длина не задана, тогда длина будет равна длине строки в файле
If length = 0 Then length = Len(List(Row))
‘проверяем, чтобы заданная в функции длина не превышала длины строки в файле от указанной позиции
If length > (Len(List(Row)) — Position + 1) Then length = Len(List(Row)) — Position + 1
FileToString = Mid(List(Row), Position, length)
Но вообще рекомендую переделать этот код под себя, так как данная функция, чтобы вернуть нужный кусок текста, читает весь файл. Если таких кусков много, а файл большой, она будет каждый раз читать один и тот же файл для разных кусков текста, и это скажется на производительности программы. Данная функция просто пример того, как можно реализовать вашу просьбу.
Ниже прикреплен работающий файл. Потестите, если хотите.
Geart:
Спасибо вам огромное, будем разбираться. )))
kuklp:
Можно проще:
Код: (vb)
Public Sub test()
Dim fName$, mRow&, mLen&, mPos&
fName = «D:\DOKUMENT\EXCEL\Module1.txt»
mRow = 9: mLen = 30: mPos = 10
Worksheets(1).Cells(1, 1) = www(fName, mRow, mPos, mLen)
End Sub
kuklp:
Сейчас только посмотрел файл ТС. Там еще проще можно(макрорекордер):
Код: (vb)
Sub www()
Application.DisplayAlerts = 0
ActiveWorkbook.Sheets.Add
ActiveWorkbook.XmlImport URL:=»H:\Doosan_report_2013-07-17.txt», ImportMap _
:=Nothing, Overwrite:=True, Destination:=Range(«A1»)
Application.DisplayAlerts = -1
End Sub
или:
Sub www1()
Код: (vb)
With ActiveSheet.QueryTables.Add(Connection:= _
«TEXT;H:\Doosan_report_2013-07-17.txt», Destination:=Range(«A1»))
.Name = «Doosan_report_2013-07-17_8»
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = -535
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
ActiveSheet.UsedRange.Replace vbTab, «», xlPart
End Sub
А там уж выбирай нужную строку 🙂
Файловые функции VBA
-
CurDir() — функция, которая возвращает путь к каталогу(для указанного диска), в котором по умолчанию будут сохраняться файлы:
Dim sCurDir As String sCurDir = CurDir("D")
Dim sCurDir As String sCurDir = CurDir(«D»)
-
Input() — открывает текстовый файл на чтение. Т.е. таким методом можно открыть файл и вытянуть из него данные. Например, чтобы считать информацию из файла C:Text1.txt и вывести ее в окно Immediate можно применить такой код:
Dim MyChar Open "C:\Text1.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input) Do While Not EOF(1) 'пока файл не кончился ' Получаем по одному символу и добавляем его к предыдущим MyChar = MyChar & Input(1, #1) Loop Close #1 ' Закрываем файл 'Выводим его содержание в окно Immediate '(отобразить Immediate: Ctrl+G в окне редактора VBA) Debug.Print MyChar 'или в MsgBox MsgBox MyChar, vbInformation, "www.excel-vba.ru"
Dim MyChar Open «C:\Text1.txt» For Input As #1 ‘Открываем файл функцией Open() на чтение(Input) Do While Not EOF(1) ‘пока файл не кончился ‘ Получаем по одному символу и добавляем его к предыдущим MyChar = MyChar & Input(1, #1) Loop Close #1 ‘ Закрываем файл ‘Выводим его содержание в окно Immediate ‘(отобразить Immediate: Ctrl+G в окне редактора VBA) Debug.Print MyChar ‘или в MsgBox MsgBox MyChar, vbInformation, «www.excel-vba.ru»
Sub SelectionToTxt() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Output As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub
Sub SelectionToTxt() Dim s As String, rc As Range Dim ff ‘запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = «» Then ‘если пока ничего не записали — присваиваем только значение ячейки s = rc.Value Else ‘если уже записано — добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile ‘Открываем текстовый файл ‘если файла нет — он будет создан Open «C:\Text1.txt» For Output As #ff ‘записываем значение строки в файл Print #ff, s Close #ff ‘ Закрываем файл End Sub
Sub SelectionToTxt_Add() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Append As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub
Sub SelectionToTxt_Add() Dim s As String, rc As Range Dim ff ‘запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = «» Then ‘если пока ничего не записали — присваиваем только значение ячейки s = rc.Value Else ‘если уже записано — добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile ‘Открываем текстовый файл ‘если файла нет — он будет создан Open «C:\Text1.txt» For Append As #ff ‘записываем значение строки в файл Print #ff, s Close #ff ‘ Закрываем файл End Sub
sFileDateTime = FileDateTime("C:\Text1.txt")
sFileDateTime = FileDateTime(«C:\Text1.txt»)
MsgBox FileLen("C:\Text1.txt") & " bites", vbInformation, "www.excel-vba.ru"