Автор | Сообщение |
|
| Администратор
|
Пост N: 1592
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.07.10 11:08. Заголовок: Опять о формате dbase
Этот вопрос время от времени здесь поднимается. Есть такой формат visual dbase, который харбор не поддерживает. Обычно 1-й байт заголовка файла - 0x04 Вот, к примеру, его описание и обсуждение в harbour mail list: [url=http://www.mail-archive.com/harbour@harbour-project.org/msg24578.html]click here[/url] Кто-нибудь читал такие файлы любыми средствами ? Я думаю, можно сделать хотя бы чтение/запись таких файлов через usrrdd, без поддержки индексов. Но прежде чем делать, решил спросить
|
|
|
Новых ответов нет
, стр:
1
2
All
[см. все]
|
|
|
| Администратор
|
Пост N: 1593
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.07.10 14:12. Заголовок: Поскольку мне надо б..
Поскольку мне надо было прочитать сабж быстро, сделал класс DBASE, пока только для чтения Спецификация класса: CLASS DBase DATA nHandle DATA cHeader DATA nType DATA nFileSize DATA nRecCount DATA nHdrLen DATA nRecLen DATA nFieldCnt DATA aStruct DATA nRecNo DATA cRecord DATA lBof DATA lEof METHOD New(cName) CONSTRUCTOR METHOD Defaults() METHOD First() METHOD Last() METHOD Next() METHOD Skip(nSkip) METHOD Goto(nRec) METHOD FieldPos( cField ) METHOD Deleted() METHOD Close() DESTRUCTOR Finalize() ERROR HANDLER OnError() ENDCLASS
|
|
|
|
| постоянный участник
|
Пост N: 1450
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.07.10 00:57. Заголовок: А как вообще определ..
А как вообще определить - что файл DBF ? Я понимаю, что по первому байту можно CHR(3) . Но так может быть что другой файл начинается с CHR(3).... Есть ли какая проверка на принадлежность файла к классу DBF и по типам DBF ?
|
|
|
|
| Администратор
|
Пост N: 1605
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.07.10 08:11. Заголовок: В первом байте dbf з..
В первом байте dbf значение может быть не только 3 см. функцию hb_dbfReadDBHeader в source\rdd\dbf1.c Это то, что харбор поддерживает, а могут быть и другие значения, тот же формат dbase А как определить... да, точно, по расширению файла же можно ! Можно правда еще выполнить простейшую проверку: размер заголовка плюс размер записи*к-во записей должен быть равным размеру файла. Если это так - это наверняка дбф
|
|
|
|
| постоянный участник
|
Пост N: 1451
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.07.10 08:49. Заголовок: Pasha пишет: А как ..
Pasha пишет: цитата: | А как определить... да, точно, по расширению файла же можно ! |
| Если бы ! В РКЦ Донецка умники сидят.... Лицевой счет абонента типа: 8а498/35, 8а330/25, 19/89, 82/3, 8а605/46, 6а308/30, 8а271/115 ..... А оплату жильцов передают в файлах с расширениями "фиг поймешь", типа: 68411010.87d 68411010.c6d 68411010.f5d 68411010.h9d 68411010.lcd 68411010.scd 68411011.8cd 68411011.cad 68411011.i9d 68411011.o6d 68411011.r7d 68411011.u4d 68411012.f7d и т.д. А заодно еще передают текстовые файлы с почти такими же расширениями: 6841d711.c0p 6841d711.ps 6841d71a.ps 6841d721.c0p 6841d721.o0p 6841d721.ps 6841d72a.ps Мне то нетрудно быстренько вручную их раскидать.... А за моей программой девушки работают. Попробуй им объясни какие файлы куда переписывать... Удавись... Pasha пишет: цитата: | Можно правда еще выполнить простейшую проверку: размер заголовка плюс размер записи*к-во записей должен быть равным размеру файла. Если это так - это наверняка дбф |
| А алгоритм можно ?
|
|
|
|
| Администратор
|
Пост N: 1607
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.07.10 08:57. Заголовок: Алгоритм это слишком..
Алгоритм это слишком громко для такой проверки 4 байта с 4-го - это к-во записей размер заголовка - 2 байта с 8-го размер записи - 2 байта с 10-го считать эти значения через fopen - fread, получить размер файла, и выполнить проверку
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 17.06.10
|
|
Отправлено: 23.07.10 09:35. Заголовок: А что, ошбку при отк..
А что, ошбку при открыти обработать низя ? Тож можно определить DBF не DBF
|
|
|
|
| Администратор
|
Пост N: 1608
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.07.10 09:43. Заголовок: Andrey пишет: В РКЦ..
Andrey пишет: цитата: | В РКЦ Донецка умники сидят.... |
| я плачу квартплату по твоей программе ? интересно...
|
|
|
|
| постоянный участник
|
Пост N: 1452
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.07.10 10:20. Заголовок: Pasha пишет: я плач..
Pasha пишет: цитата: | я плачу квартплату по твоей программе ? интересно... |
| Нет не по моей. Я от них данные беру для своей программы, кто и сколько заплатил за домофон. База хорошая Firebird 1.5 , а вот реализация.... <\/u><\/a> <\/u><\/a>
|
|
|
|
| Администратор
|
Пост N: 1609
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.07.10 10:23. Заголовок: Понятно. У меня домо..
Понятно. У меня домофона нет
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 23.07.10 11:04. Заголовок: Проверка файла - DBF или нет ( для Dbase III CHR(3) )
// ..... nerr=0 cerr="" get_dbfpar(filename,,,,,,@nerr,@cerr) if nerr#0 // "Некорректная БД" endif //........ Function get_dbfpar(fn,f_size,nbyte,last_rec,rec_size,of_set,nerr,cerr) // параметры DBF static arr_err:={; {0,"<Нет ошибки > "} ,; //1 {1,"<Не файл БД > "} ,; //2 {2,"<Неверный размер БД > "} ,; //3 {4,"<Нет доступа Read+Sh> "} ,; //4 {5,"<Аттрибут READONLY > "} ,; //5 {6,"<Дата БД больше тек.> "} ; //6 } Local ret:=.t.,s,nHandle LOCAL nCurrent,fattr:=0 Local sag:=chr(03),ierr:=1 f_size :=0 nbyte :=0 last_rec:=0 rec_size:=0 of_set :=0 DO WHILE .t. nerr :=arr_err[1,1]; cerr := arr_err[1,2] s:=space(32) nHandle:=fopen(fn,FO_READ+FO_SHARED) if ( ret:=(nHandle>=0) ) nCurrent := FSEEK( nHandle, 0, FS_RELATIVE ) // Get file position // Get file length nbyte := FSEEK( nHandle, 0, FS_END ) // размер файла FSEEK( nHandle, nCurrent ) // Reset file position fread(nHandle,@s,32) sag:= asc(substr(s,1,1)) if !(sag=3.or.sag=131) // БД или БД с мемо ret:=.f.;ierr:=2 nerr:=arr_err[ierr,1]; cerr := arr_err[ierr,2] endif last_rec:= ; 256*256*(; 256*asc(substr(s,8,1)) ; +asc(substr(s,7,1)) ; )+; 256*asc(substr(s,6,1)) ; +asc(substr(s,5,1)) rec_size:=; // размер записи 256*asc(substr(s,12,1)) ; +asc(substr(s,11,1)) of_set:=; // смещение - размер заголовка 256*asc(substr(s,10,1)) ; +asc(substr(s, 9,1)) f_size:= last_rec*rec_size+of_set+1 // размер базы if abs(f_size-nbyte)>rec_size // несовпадение размера базы и файла ret:=.f.;ierr:=3 nerr:=arr_err[ierr,1]; cerr := arr_err[ierr,2] endif if f_size > nbyte+1 ret:=.f.;ierr:=2 nerr:=arr_err[ierr,1]; cerr := arr_err[ierr,2] endif FCLOSE(nHandle) if ret if ISBIT(FILEATTR(fn),1)// Readonly ret:=.f.;ierr:=5 nerr:=arr_err[ierr,1]; cerr := arr_err[ierr,2] EXIT endif if FILEDATE(fn) > date() ret:=.f.;ierr:=6 nerr:=arr_err[ierr,1]; cerr := arr_err[ierr,2] endif endif else //nHandle<0 ret:=.f.;ierr:=4 nerr:=arr_err[ierr,1]; cerr := arr_err[ierr,2] endif EXIT ENDDO return ret
|
|
|
|
| постоянный участник
|
Пост N: 1453
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.07.10 11:30. Заголовок: Спасибо БОЛЬНОЕ petr..
Спасибо БОЛЬШОЕ petr707 ! Думаю не только мне пригодиться !
|
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 20.10.15
|
|
Отправлено: 22.01.16 17:35. Заголовок: Добрый день! Заказа..
Добрый день! Заказали мне формировать вых.файлы в формате dBase IV: клиенту необходимо сохранить в формате DBF dBASE IV и документы загружаются в систему "Клиент-Банк" Присланные файлы были сохранены в формате DBF dBASE III К стыду признаю, что не знаю как сие сделать средствами Clipper/Harbour. Как при создании (открытии) указать, что файл dBase IV??
|
|
|
|
| |
Пост N: 5466
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.01.16 18:18. Заголовок: mshep http://articl..
|
|
|
|
| |
Пост N: 171
Зарегистрирован: 21.04.13
|
|
Отправлено: 22.01.16 18:28. Заголовок: Другой формат DBF
Смотрите описание в dbinfo.ch RDDI_TABLETYPE Лучше иметь образцы файлов, тогда проще, как пример ниже - функция создания некоторого типа таблицы, похоже Visual_foxpro (без претензии на универсальность) Правда, с костылем - прямая запись в заголовок Далее такую таблицу удается заполнить обычными средствами - append ,append from .. .... Function FoxDBCREATE(cfile,arr_str) Local ret:=.t.,f_hand:=0,sf1:=chr(3),sf2:=chr(0x1A) #include "dbinfo.ch" hb_rddinfo(RDDI_TABLETYPE,DB_DBF_VFP) DBCREATE(cfile ,arr_str) f_hand:=FOPEN(cfile,FO_READWRITE) if f_hand>0 FSEEK(f_hand, 0,0)// FWRITE(f_hand,sf1,1) FSEEK(f_hand,-1,2)// FWRITE(f_hand,sf2,1) FCLOSE(f_hand) endif hb_rddinfo(RDDI_TABLETYPE,DB_DBF_STD) return ret
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 20.10.15
|
|
Отправлено: 22.01.16 18:32. Заголовок: Спасибо. уже прогугл..
Спасибо. уже прогуглил, поплакал.... Не думал, что так все запущено....... Еще не знаю, как после преобразования они будут открываться в клиппере (фоксовские например в автомате при открытии в клиппере преобразуются в клипперовские) и как проверять, что я буду отправлять в банк...... Есть еще добрые люди где-то сверху, которые помогают тем, кому делать нечего! ))))
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 20.10.15
|
|
Отправлено: 22.01.16 21:45. Заголовок: Опять дедушка тупит..
Опять дедушка тупит что-то…… (((( Посмотрел описание заголовка dbf ( http://www.autopark.ru/ASBProgrammerGuide/DBFSTRUC.HTM например) и посмотрел файл якобы dBase IV, что мне ребятишки из банка любезно прислали как образец, разница его с моим - в 29-м байте заголовка “26” у них стоит (у меня – “00”, а по http://articles.org.ru/docum/dbfall.php это – зарезервированная обл.), и в описаниях полей после типа поля (т.е. начиная с 12 байта) стоят значения какие-то (если верить http://articles.org.ru/docum/dbfall.php, это – “Адрес данных поля (ссылка на память, а не на диск)” . Что это за ссылка???? Интересное наблюдение: когда я из программы физически ставлю “26” в заголовок в свой сформированный файл, потом открываю его в DBFnavigator и там сохраняю как dBase IV, мои ручные “26” она зануляет (т е так же как и якобы в dBase IV должно быть), но в описаниях полей что-то после 11 файла что-то лепит, причем то же, что и в банковских файлах. Резюмируя, возникают вопросы: 1) Что за байда “26” в 29 байте заголовка (есть в образце, что мне дали, но не создает его DBFнавигатор при сохранении файла в формате dBase IV). Имеет ли это отношение к dBase IV вообще? 2) Что записывается в описаниях полей после типа поля? - “Адрес данных поля (ссылка на память, а не на диск)” . Для текущ.файла я, понятно, слижу эти цифорки из образца, что мне дали, проблема – если потом другой файл создавать надо будет. Путано наверно дедушка написал, да может поймет кто и поможет дотошно….
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 20.10.15
|
|
Отправлено: 22.01.16 21:54. Заголовок: P.S. Присмотрелся - ..
P.S. Присмотрелся - понял: просто смещение это начала поля относительно начала записи...... Видно, совсем иной механизм пробега по файлу в dBase IV.... Так что вопрос 2) отпадает. Первый вопрос, хоть и не актуален для жизни, остается, ибо непонимаемое вселяет смятение в души.....
|
|
|
|
| |
Пост N: 172
Зарегистрирован: 21.04.13
|
|
Отправлено: 22.01.16 22:14. Заголовок: 29 байт - это кодовая страница
29 0x1D 1 Идентификатор кодовой страницы файла (dBASE IV, Visual FoxPro, XBase). См. табл 9. Не нужно открывать такую таблицу в Clipper, он удаляет этот байт ( укорачивает заголовок) Открывайте Fox'ом
|
|
|
|
| |
Пост N: 11
Зарегистрирован: 20.10.15
|
|
Отправлено: 22.01.16 22:50. Заголовок: Пасибки!! Только ч..
Пасибки!! Только что зашел отрапортовать, что закрыл вопрос - нашел по др ccылке - Russian OEM = “26”. Так что все уже почти OK. То что клиппер приводит к св виду - знаю, вопросы все снялись, осталось только подумать, как клиентов убедить, что по формированию файла для банка справка с него им не нужна..... Мои извинения что хлопот доставил - не самые удачные ссылки по описанию структуры сначала открыл.... И тогда еще доп.вопрос: есть какой-то dbf-браузер, который однозначно бы сказал, какой формат файла? (DBFнавигвтор просто тупо якобы переписывает в выбираемом формате, а в каком формате был данный ему файл - не выдает
|
|
|
|
| |
Пост N: 14
Зарегистрирован: 20.10.15
|
|
Отправлено: 28.01.16 21:54. Заголовок: Возможно, кому-то е..
Возможно, кому-то еще потребуется копаться с dBase IV. Из своих исследований: Никакого лейбла или картинки, что это именно dBase IV, в заголовке файла нет. Отличия: a) по другому как-то пишется 1б в “Дата последней модификации в виде ГГММДД” (год), но это не влияет; б) в дескрипторе поля после типа поля в dBaseIV пишется его смешение относительно начала записи (в dBaseIII – “00”), длины поля нет ни в III, ни в IV, хотя по описанию в “Энциклопедии юных сурков”: 11 0x0B 1 Тип поля. См. табл 7 12 0x0C 4 Зарезервировано 16 0x10 1 Полная длина поля Непонятка получается. ((( в) В III в нач.инф.части стоит 0D, в IV его нет. г) DbfNavigator при преобразовании файла III в IV удаляет в конце “1A” (но это кажется уже погрешность его самого). Правил файл на физуровне, с заголовком быстро получилось, а в записях в длинах вечно путался. Потом выключил вторую извилину у себя в голове и в файле IV тупо удалил руками в текст.редакторе (не ZAP) всю инф. часть включая хвостик 0D001A после этого в программе файл открылся, записался и уже откликался на кличку “dBase IV”. Слишком просто и скучно ((((( На этом и покончил. Но желание разобраться на будущее осталось…
|
|
|
Новых ответов нет
, стр:
1
2
All
[см. все]
|
|