|
|
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Добрый день! Мне необходимо в бинарном файле заменить символ "*" на "пробел" Мой код: 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 - размер файла увеличивается Помогите, пожалуйста, с реализацией ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2010, 17:07 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010, На данный момент использую вызов скрипта из командной строки: авторcscript.exe SearchAndReplace.vbs "m_oper.dbf" "*" " " хотелось бы в студию скрипт SearchAndReplace в бинарном файле средствами visual basic ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2010, 17:15 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. (код размещай между тегами *SRC vba* и *SRC* нажав кнопочку SRC) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2010, 23:00 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Доработав, реализовал следующим способом: 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2010, 14:54 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010 Код: plaintext 1. 2. 3. 4. Не понял смысл этой доработки. Какой тут будет FileLength? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2010, 15:17 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Дмитрий Исаев, А как написать правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 10:54 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Я думаю, что у PWW всё правильно. Когда открывают несколько файлов (Open ... As #1, Open ... As #2), чтобы не помнить все эти #1 и #2, используют идентификаторы, получаемые функцией FreeFile. Функция возвращает следующий номер, который можно использовать для открытия файла. Код: plaintext 1. 2. 3. Ваш код будет работать только тогда, когда FreeFile вернёт 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 13:24 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010, FreeFile – функция, возвращает свободный номер, ещё не задействованный для открытия файла (возвращает от 1 до 511) Поэтому это правильно. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 13:46 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010 Код: plaintext 1. 2. 3. 4. ЗЫ. Lock Read, это не "открыли файл на чтение", а закрыли доступ на его чтение другим юзерам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 14:12 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Анатолий ( Киев ), Спасибо за замечание. Внесу исправление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 14:18 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010, Здесь ошибочка Код: plaintext Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 14:42 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
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 байта. Даже при отключении блока замены "*" на "пробел". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 15:02 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010P.S. Единственное, что мне не понятно - размер выходного файла увеличивается на 2 байта.Посмотрите, вот так не будет увеличиваться: Код: plaintext А вообще, программы побайтового сравнения файлов рулят (например, команда "Сравнить по содержимому" в любом Total Commander). Неприятно то, что у меня в DBF-файле были звёздочки во всяких названиях - он и их удалил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 15:21 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Дмитрий Исаев, Благодарю! Я бы не догадался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 16:04 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010, авторP.S. Единственное, что мне не понятно - размер выходного файла увеличивается на 2 байта. Даже при отключении блока замены "*" на "пробел". Похоже в строку заглатывается весь файл после чего добавляется признак конца самой строки, када прочитал файл. И уже в увеличенном виде записывается на диск. Чтобы проверить сделай какой-нибудь читаемый текстовый файл, и посмотри где появляется отличие визуально. Как вариант Append замени на Output (хотя в твоём случае это одно и тоже) Zzz. если не секрет, зачем такой шахер-махер - менять * на пробел в таком уважаемом файле как *.dbf, это вроде база ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 17:01 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
Andrei2010, Код: plaintext 1. 2. Цикл здесь не нужен, по умолчанию Replace заменяет все вхождения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 17:10 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
PWW, Номер записи является ключем для других связанных dbf-файлов (особенности программы написанной на Clipper-е). Поэтому приходится это делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 18:42 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
PWW, Да, это точно. Цикл "Do While" лишний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 18:47 |
|
||
|
Поиск и замена в бинарном файле
|
|||
|---|---|---|---|
|
#18+
PWWAndrei2010, авторP.S. Единственное, что мне не понятно - размер выходного файла увеличивается на 2 байта. Даже при отключении блока замены "*" на "пробел". Похоже в строку заглатывается весь файл после чего добавляется признак конца самой строки, када прочитал файл. И уже в увеличенном виде записывается на диск. Чтобы проверить сделай какой-нибудь читаемый текстовый файл, и посмотри где появляется отличие визуально. Как вариант Append замени на Output (хотя в твоём случае это одно и тоже) Zzz. если не секрет, зачем такой шахер-махер - менять * на пробел в таком уважаемом файле как *.dbf, это вроде база ? "Append замени на Output" здесь не поможет. Бинарній файл надо считывать в массив инструкцией GET, обрабатавать массив (раньше я писал вам, что надо вычислять позицию байта-признака удаления каждой записи и лечить только нго) и сохранять инструкцией PUT. И никакого преобразования в строку, а также методов работы с текстовыми файлами. В другой вашей ветке (зачем две?) я вам советовал ODBC драйвер. Пробовали, или этот путь интереснее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2010, 19:46 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=36457666&tid=1633497]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 355ms |

| 0 / 0 |
