powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поиск и замена в бинарном файле
20 сообщений из 20, страница 1 из 1
Поиск и замена в бинарном файле
    #36452595
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Мне необходимо в бинарном файле заменить символ "*" на "пробел"
Мой код:

Dim handle, outhandle As Integer
Dim infilename, outfilename, buffer As String

infilename = "c:\bb\m_oper.dbf"
outfilename = "c:\bb\ConvertedTextFile.txt"

handle = FreeFile
Open infilename For Input As handle

outhandle = FreeFile
Open (outfilename) For Output As outhandle

Do While EOF(handle) = False
Line Input #handle, buffer

Do While InStr(buffer, "*") > 0
buffer = Replace(buffer, "*", " ")
Loop
Print #outhandle, buffer
Loop

Close (handle)
Close (outhandle)

в результате размер файла уменьшается.

Вероятно источник ошибки тут:
Do While InStr(buffer, "*") > 0
buffer = Replace(buffer, "*", " ")

P.S. При открытии файла другим способом:
Open infilename For Binary Access Read As handle - размер файла увеличивается

Помогите, пожалуйста, с реализацией
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36452611
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrei2010,

На данный момент использую вызов скрипта из командной строки:

авторcscript.exe SearchAndReplace.vbs "m_oper.dbf" "*" " "

хотелось бы в студию скрипт SearchAndReplace в бинарном файле средствами visual basic
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36453053
PWW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei2010,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
      
      FileName="xxx.bin" 
      File_Path2="yyy.din"

       nFile = FreeFile
        Open FileName For Binary Lock Read As #nFile 'открыли файл на чтение
            Длина = LOF(nFile)
            Dim www As String
            www = Space$(Длина) 'выделили память
            Get #nFile, , www     'считали файл в переменную
            ‘……перелопатили 
            E_File = FreeFile 
            Open File_Path2 For Append As #E_File 'открыли файл на добавление
            Print #E_File, www     'записали на диск новый файл
            
            Close T_File
            Close E_File

(код размещай между тегами *SRC vba* и *SRC* нажав кнопочку SRC)
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36455556
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доработав, реализовал следующим способом:

InFileName = CurrentProject.Path + "\m_oper.dbf"
OutFileName = CurrentProject.Path + "\m_oper_m.dbf"

HandleIn = FreeFile

Open InFileName For Binary Lock Read As #1 'открыли файл на чтение
FileLength = LOF(HandleIn)

buffer = Space$(FileLength) 'выделили память
Get #1, , buffer 'считали файл в переменную
' удаляем из файла признак удаленных записей '*'
'---------------------------------------------
Do While InStr(buffer, "*") > 0
buffer = Replace(buffer, "*", " ")
Loop
'---------------------------------------------
HandleOut = FreeFile
Open OutFileName For Append As #2 'открыли файл на добавление
Print #2, buffer 'записали на диск новый файл

Close (HandleIn)
Close (HandleOut)
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36455617
Дмитрий Исаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei2010
Код: plaintext
1.
2.
3.
4.
  HandleIn = FreeFile
  
  Open InFileName For Binary Lock Read As # 1     'открыли файл на чтение
  FileLength = LOF(HandleIn)

Не понял смысл этой доработки. Какой тут будет FileLength?
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36456943
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Исаев,

А как написать правильно?
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36457469
Дмитрий Исаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что у PWW всё правильно.

Когда открывают несколько файлов (Open ... As #1, Open ... As #2), чтобы не помнить все эти #1 и #2, используют идентификаторы, получаемые функцией FreeFile. Функция возвращает следующий номер, который можно использовать для открытия файла.

Код: plaintext
1.
2.
3.
nFile = FreeFile ' берём следующий свободный идентификатор
Open FileName For Binary Lock Read As #nFile ' открываем файл с данным идентификатором
Длина = LOF(nFile) ' находим его длину
...

Ваш код будет работать только тогда, когда FreeFile вернёт 1.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36457559
PWW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei2010,

FreeFile – функция, возвращает свободный номер, ещё не задействованный для открытия файла (возвращает от 1 до 511)

Поэтому это правильно.
Код: plaintext
1.
2.
nFile = FreeFile ' берём следующий свободный идентификатор
Open FileName For Binary Lock Read As #nFile ' открываем файл с данным идентификатором
Длина = LOF(nFile) ' находим его длину
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36457666
Andrei2010
Код: plaintext
1.
2.
3.
4.
  HandleIn = FreeFile
  
  Open InFileName For Binary Lock Read As # 1     'открыли файл на чтение
  FileLength = LOF(HandleIn)
Вы поучаете в HandleIn свободный дискриптор и затем используете в функции LOF, а файл откріваете с явным указанием #1. Вся ваша конструкция работает только потому, что из VBA в вашем сеансе другие файлі не открівались, и FreeFile вернул 1. Надо вместо As #1 указать HandleIn.
ЗЫ. Lock Read, это не "открыли файл на чтение", а закрыли доступ на его чтение другим юзерам.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36457682
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),

Спасибо за замечание. Внесу исправление.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36457769
PWW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei2010,

Здесь ошибочка
Код: plaintext
Close T_File
закрывать надо
Код: plaintext
1.
Close nFile
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36457856
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrei2010,

Код принял следующий вид:

Dim rst As DAO.Recordset
Dim SQL As String
Dim Pos, M_stal, Diametr, Plan, Dlina, KodZagolovka
Dim InFileName, OutFileName, FileLength, HandleIn, HandleOut
Dim buffer As String

' удаляем файл
If FileExists(CurrentProject.Path + "\m_oper.dbf") = True Then
Kill CurrentProject.Path + "\m_oper.dbf"
End If

' удаляем файл
If FileExists(CurrentProject.Path + "\m_oper_m.dbf") = True Then
Kill CurrentProject.Path + "\m_oper_m.dbf"
End If

' копируем файл
FileCopy PaketPath + "\m_oper.dbf", CurrentProject.Path + "\m_oper.dbf"

InFileName = CurrentProject.Path + "\m_oper.dbf"
OutFileName = CurrentProject.Path + "\m_oper_m.dbf"

HandleIn = FreeFile

Open InFileName For Binary Lock Read As #HandleIn 'открыли файл на чтение
FileLength = LOF(HandleIn)

buffer = Space$(FileLength) 'выделили память
Get #HandleIn, , buffer 'считали файл в переменную
' удаляем из файла признак удаленных записей '*'
'---------------------------------------------
Do While InStr(buffer, "*") > 0
buffer = Replace(buffer, "*", " ")
Loop
'---------------------------------------------
HandleOut = FreeFile
Open OutFileName For Append As #HandleOut 'открыли файл на добавление
Print #HandleOut, buffer 'записали на диск новый файл

Close (HandleIn)
Close (HandleOut)

P.S. Единственное, что мне не понятно - размер выходного файла увеличивается на 2 байта. Даже при отключении блока замены "*" на "пробел".
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36457916
Дмитрий Исаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei2010P.S. Единственное, что мне не понятно - размер выходного файла увеличивается на 2 байта.Посмотрите, вот так не будет увеличиваться:
Код: plaintext
Print #HandleOut, buffer;
(иначе Print добавляет два байта переноса строки, vbCrLf).

А вообще, программы побайтового сравнения файлов рулят (например, команда "Сравнить по содержимому" в любом Total Commander).

Неприятно то, что у меня в DBF-файле были звёздочки во всяких названиях - он и их удалил.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36458099
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Исаев,

Благодарю! Я бы не догадался.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36458379
PWW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei2010,
авторP.S. Единственное, что мне не понятно - размер выходного файла увеличивается на 2 байта. Даже при отключении блока замены "*" на "пробел".

Похоже в строку заглатывается весь файл после чего добавляется признак конца самой строки, када прочитал файл. И уже в увеличенном виде записывается на диск.
Чтобы проверить сделай какой-нибудь читаемый текстовый файл, и посмотри где появляется отличие визуально.

Как вариант Append замени на Output (хотя в твоём случае это одно и тоже)

Zzz. если не секрет, зачем такой шахер-махер - менять * на пробел в таком уважаемом файле как *.dbf, это вроде база ?
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36458416
PWW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrei2010,

Код: plaintext
1.
2.
Do While InStr(buffer, "*") >  0 
buffer = Replace(buffer, "*", " ")
Loop

Цикл здесь не нужен, по умолчанию Replace заменяет все вхождения.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36458661
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PWW,

Номер записи является ключем для других связанных dbf-файлов (особенности программы написанной на Clipper-е). Поэтому приходится это делать.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36458674
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PWW,

Да, это точно. Цикл "Do While" лишний.
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36458793
PWWAndrei2010,
авторP.S. Единственное, что мне не понятно - размер выходного файла увеличивается на 2 байта. Даже при отключении блока замены "*" на "пробел".

Похоже в строку заглатывается весь файл после чего добавляется признак конца самой строки, када прочитал файл. И уже в увеличенном виде записывается на диск.
Чтобы проверить сделай какой-нибудь читаемый текстовый файл, и посмотри где появляется отличие визуально.

Как вариант Append замени на Output (хотя в твоём случае это одно и тоже)

Zzz. если не секрет, зачем такой шахер-махер - менять * на пробел в таком уважаемом файле как *.dbf, это вроде база ? "Append замени на Output" здесь не поможет. Бинарній файл надо считывать в массив инструкцией GET, обрабатавать массив (раньше я писал вам, что надо вычислять позицию байта-признака удаления каждой записи и лечить только нго) и сохранять инструкцией PUT. И никакого преобразования в строку, а также методов работы с текстовыми файлами.

В другой вашей ветке (зачем две?) я вам советовал ODBC драйвер. Пробовали, или этот путь интереснее?
...
Рейтинг: 0 / 0
Поиск и замена в бинарном файле
    #36460505
Andrei2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),

нет не пробовал
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поиск и замена в бинарном файле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]