Двоичный доступ для чтения найти определенную строку

Sub ReadEntireFileAndPlaceOnWorksheet()
  Dim X As Long, FileNum As Long, TotalFile As String, FileName As String, Result As Variant, Lines() As String
  FileName = "C:\Users\Mohamed samatar.DSSE-EMEA\Documents\EQVL\Test\WHVP113_140910_TTinsug_TT_299Data_PUoff_WOT-TakeOff_NotKickDown_gearD_FelLambda.dat"
  FileNum = FreeFile
  Open FileName For Binary As #FileNum
    TotalFile = Space(LOF(FileNum))
    Get #FileNum, , TotalFile
  Close #FileNum
  Lines = Split(TotalFile, vbNewLine)
  ReDim Result(1 To UBound(Lines) + 1, 1 To 1)
  For X = 1 To UBound(Result)
    Result(X, 1) = Lines(X - 1)
  Next
  Range("A1").Resize(UBound(Result)) = Result
End Sub​

У меня есть несколько файлов в формате .dat, эти файлы содержат некоторую ценную информацию, однако они могут быть довольно большими, попытка открыть каждый файл в блокноте и извлечь нужную мне информацию совершенно неэффективна, так как блокноту требуется много времени для открыть каждый файл. Я столкнулся с этой функцией чтения двоичного доступа, которая, по-видимому, открывает большие файлы и позволяет очень быстро их читать. Мне было интересно, как найти/получить определенные строки информации, можете ли вы использовать аналогичную функцию, чтобы сказать функцию поиска, или есть другой способ получить информацию, это то, что у меня есть до сих пор. Все, что он делает, это сообщает мне тип файла, по сути, я хочу иметь возможность искать определенное строковое значение, или если бы я мог просто вывести весь текст в EXCEL и отсортировать оттуда, любое руководство полезно.


person Samatar    schedule 06.02.2015    source источник
comment
Проверьте ЗДЕСЬ для основных I/ O-функции, вы можете прочитать файл построчно, а затем использовать базовые строковые функции или RegEx, чтобы найти нужные данные, или прочитать весь файл в массив и повторить его и т. д.   -  person David Zemens    schedule 06.02.2015
comment
Спасибо за быстрый ответ, посмотрю!   -  person Samatar    schedule 06.02.2015
comment
Привет, Дэвид, есть ли шанс, что вы можете указать мне правильное направление, я только что просмотрел документ и, возможно, пример чтения файла в массив? Если я смогу заставить его читать в массив, я могу сбросить его в Excel и выполнить поиск там, где у меня немного больше опыта. Мало значит очень мало. Спасибо?   -  person Samatar    schedule 06.02.2015


Ответы (1)


Вот два примера. Первый считывает каждую строку в файле и печатает на листе, начиная с ячейки A1, а затем вниз до A2, A3 и т. д., по одной на каждую строку:

Option Explicit
Sub testReadLine()
    Dim filename As String
    Dim FF As Integer
    Dim line As String
    Dim i as Long

    filename = "C:\yourfilename.txt" '### MODIFY AS NEEDED

    FF = FreeFile
    Open filename For Input As FF
    Do While Not EOF(FF)
        Line Input #FF, line

        Range("A1").Offset(i).Value = i
        i = i + 1
    Loop
    Close FF

End Sub

Во втором примере весь файл считывается в строковую переменную, а затем используется функция Split для преобразования этой строки в массив строк на основе разделителя строк (предполагается, что это vbCRLF).

Это должно быть быстрее, и, конечно, когда у вас есть данные в Excel, вы можете использовать свои обычные функции Excel, такие как «Найти» и т. Д.

Option Explicit
Option Base 0
Sub testReadAll()

    Dim filename As String
    Dim FF As Integer
    Dim text As String
    Dim buffer As Long
    Dim txtArray() As String

    filename = "C:\yourfilename.txt"  '### MODIFY AS NEEDED

    FF = FreeFile
    Open filename For Input As FF
    buffer = LOF(FF)
    text = Input(buffer, FF)
    Close FF

    'Put the text into an array, split by the LineFeed character:
    txtArray = Split(text, vbCrLf)

    'Print to the worksheet:
    Range("A1").Resize(Ubound(txtArray)).Value = Application.Transpose(txtArray)

End Sub
person David Zemens    schedule 06.02.2015
comment
Большое спасибо за ответ, в настоящее время он просто выводит числа. Я должен был объяснить, что формат файла - файл .dat, и я видел некоторые места, где мне потенциально нужно выполнить преобразование из двоичного в обычный текст? в этом ли дело, как он считывает его, поскольку кажется, что он выводит числа от 0 до 4, хотя в файле около 17 МБ данных? - person Samatar; 06.02.2015
comment
Это звучит как новый вопрос, но есть функции преобразования строк, которые могут преобразовывать массив байтов в строку и т. д. Извините, но сейчас полночь, и я не собираюсь задавать дополнительные вопросы в настоящее время. время. Пожалуйста, задайте новый вопрос, чтобы другие могли вам помочь. - person David Zemens; 06.02.2015
comment
это может быть полезно: msdn.microsoft .com/en-us/library/office/ - person David Zemens; 06.02.2015
comment
Оглядываясь назад, кажется, что это работает, в первом коде была опечатка, проблема заключалась только в том, что он получил некоторые ошибки и не завершил выполнение скрипта, я все равно попытаюсь исправить это отсюда, спасибо. - person Samatar; 06.02.2015
comment
Ваше здоровье. Я буду в сети завтра, если у вас возникнут проблемы, я могу попытаться помочь, я просто не смогу помочь сразу сегодня. - person David Zemens; 06.02.2015
comment
Привет, Дэвид, так что хорошие и плохие новости, [я обновил вопрос последним кодом], мне удалось продвинуться дальше, я имею в виду, что я получаю данные, которые мне нужны, в верхней части листа Excel (он извлекает все текстовые данные Я хочу), однако затем я получаю сообщение об ошибке, прежде чем он завершит работу. 1004 Приложение не определено, это происходит в строке: Range (A1). Resize (UBound (Result)) = Result. Проблема, по сути, в том, что у меня есть все, что я хочу, поэтому на этом все может закончиться, но если это будет продолжаться, это не очень практично, есть идеи по решению? - person Samatar; 10.02.2015
comment
Я не в состоянии что-либо проверить прямо сейчас, вам может повезти, если вы зададите новый вопрос, где другие могут вам помочь... Предварительная мысль: рабочий лист защищен или иным образом недоступен, или результаты имеют какое-то измерение который не может поместиться в допустимое пространство на листе. Опять же, я не в состоянии помочь вам с этим в ближайшее время (то есть до следующей недели). - person David Zemens; 10.02.2015