2016-04-11 2 views
2

Первый раз проводке - пожалуйста, быть нежным :)Excel VBA - Импорт Разделы Textfile (Binary Import)

У меня есть большой текстовый файл (около 50Мб), который находится на нашем рабочем сервере. Файл сортируется по ключевому слову в порядке возрастания. Мне было интересно, можно ли искать и импортировать раздел файла, который соответствует ключу, используя двоичный поиск.

Например, код будет содержать 512kb файла и посмотреть, нужны ли данные в той части файла, если нет, перейдите к следующему 512kb, пока не найдете нужные нам данные. Кроме того, у ключа будет несколько строк (2K) данных, поэтому код должен будет искать начальную и конечную точки ключа.

Я надеюсь сэкономить время при загрузке файла, только загружая раздел файла, который имеет данные, которые нужны пользователю. Существует новый файл, созданный каждый час с последними данными, и из-за медленного сервера (особенно при подключении удаленно (т. Е. Работа из дома) в настоящее время требуется много времени, чтобы загрузить весь файл в отчет.

кто-нибудь знает, возможно ли это?

Большое спасибо

ответ

0

нет, это не возможно загрузить только ту часть файла, который вы заинтересованы. в основном это связано с тем, что вы не можете сказать, где чтобы начать искать в файле. Что бы вы хотели написать? Начните искать в файле размером 50 МБ вокруг позиции 12 МБ?

Тем не менее, вы можете прочитать файл построчно без необходимости загружать весь файл в память первых:

Public Sub ImportToExcel() 

Dim intCounter As Long 
Dim intPointer As Integer 
Dim strFileToImport As String 

'The location of the file you wish to load 
strFileToImport = "C:\tmp\test.csv" 

intPointer = FreeFile() 
Open strFileToImport For Input Access Read Lock Read As #intPointer 

intCounter = 1 
Do Until EOF(intPointer) 
    'Loading row by row from the text file into strLine 
    Line Input #intPointer, strLine 
    'Check if the "KeyYouAreLookingFor" can be found in that line 
    '... if it can be found then copy it to the first sheet 
    If InStr(1, strLine, "KeyYouAreLookingFor") Then 
     Worksheets(1).Cells(intCounter + 1, 1).Value2 = strLine 
     intCounter = intCounter + 1 
    Else 
     'If the key cannot be found but has been found in the past 
     '... then (following your logic that the file is sorted) 
     '... all other rows in the file can be ignored and 
     '... the import is complete: so the program should stop 
     If intCounter > 1 Then Exit Sub 
    End If 
Loop 

Close intPointer 

End Sub 

Посмотрите на комментарии в коде для более подробных разъяснений и дайте мне знать, если это соответствует вашим потребностям ,

Предполагая, что вы текстовый файл 50Мб файл , разделителями CSV вы могли бы еще более уточнить приведенный выше код следующим образом:

If InStr(1, Split(strLine, ",")(0), "KeyYouAreLookingFor") Then 

Конечно, это предполагает, что ваш «ключ» находится в первой колонке каждый ряд. Если нет, просто сделайте правильные настройки по своему вкусу.

+0

Привет Ральф, спасибо за быстрый ответ. То, как я хочу, чтобы он работал, - это начать посередине, и если ключ больше, чем тот, который находится посередине, не обращайте внимания на все выше него, затем найдите середину оставшейся половины файла> полоскание и повторите до ключ найден. Если это невозможно, это нормально. Просто подумал, что я задам вопрос. Просто быстрый вопрос о вашем коде - будет ли решение выше быстрее, чем «textfile.readall», а затем просматривает каждую строку, чтобы найти требуемые данные? – Tabias

+0

Краткий ответ: вышеупомянутое решение является лучшим, если вы имеете дело с большими файлами (такими как ваши). С большинством текстовых редакторов вы даже не можете открывать большие текстовые файлы (100 МБ или больше). Просто дайте ему попробовать с NotePad, и вы увидите. Вышеприведенный код лучше всего, потому что он читает строки за строкой только в памяти. ** Не ** весь файл сразу. Я обработал с вышеуказанным кодом даже файлы> 500 МБ без проблем. Ваше предложение было бы правильным, если бы там был инструмент, который поддерживает это. Но даже использование ODBC для соединения с «SELECT» потребует сканирования всего ** файла **. – Ralph

+0

Привет, Ральф, я просто попробовал ваше решение, потребовалось около двух/трех минут, чтобы выполнить строку «Line Input #intPointer, strLine». Я предполагаю, что когда excel получает доступ ко всему файлу на сервере и загружает его. Чтобы дать вам представление о том, как медленно, во время «загрузки» мое соединение Lan использовалось только 1% (100 Мбит/с). – Tabias

Смежные вопросы