Двоичен достъп за четене, намиране на конкретен низ

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, тези файлове съдържат ценна информация, но могат да бъдат доста големи, опитвайки се да отворя всеки файл в Notepad и извличането на информацията, от която се нуждая, изобщо не е ефективно, тъй като Notepad отнема много време, за да отворете всеки файл. Попаднах на тази функция за четене на двоичен достъп, която очевидно отваря големи файлове и ви позволява да ги четете много бързо. Чудех се как да намеря/получа конкретни редове информация, можете ли да използвате подобна функция, за да кажете функцията за намиране или има друг начин за получаване на информация, това е, което имам досега. Всичко, което прави, е да ми каже типа на файла, по същество искам да мога да търся конкретна стойност на низ или ако мога просто да изхвърля целия текст в 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, въпреки че във файла има около 17MB данни? - 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)) = Резултат. Проблемът по същество е, че имам всичко, което искам, така че може да свърши дотук, но ако това ще продължи да се случва, не е много практично, някакви идеи за решение? - person Samatar; 10.02.2015
comment
Не съм в състояние да тествам каквото и да било в момента, може да имате повече късмет, като зададете нов въпрос, където други може да са в състояние да ви помогнат... Предварителна мисъл: работният лист е защитен или по друг начин недостъпен, или резултатите са с някакво измерение които не могат да се поберат в разрешеното място в работния лист. Отново, не съм в състояние да ви помогна с това в скоро време (т.е. преди следващата седмица). - person David Zemens; 10.02.2015