Цитата:
Сообщение от
gl00mie
Проверил этот вариант. Мне он понравился больше. Профессиональная разработка, больше возможностей, грамотно сделано....
Некоторые особенности этого варианта:
- штатно нельзя задать кодировку символов файла при чтении
(по умолчанию она в стандартной западной кодировке, а российские файлы DBF кодируются в кодировке 866, в основном). Пришлось "подправить" это в DLL. - прилагается.
- текстовые поля возврашаются без "обрезанных" с права пробелов,
например
из примера в c файлом kladr.dbf
А во остальном этот вариант - очень даже "FastDbf"
Вот пример использования на том же примере...
Файл - 198 тыс строк, время работы примера - 21 секунда, даже быстрее чем предидущий пример!!!
X++:
static void DBFTest(Args _args)
{
SocialExplorer.IO.FastDBF.DbfFile dbfFile;
SocialExplorer.IO.FastDBF.DbfRecord dbfRecord;
SocialExplorer.IO.FastDBF.DbfHeader dbfHeader;
int cnt;
int i;
str name;
str code;
int name_idx;
int code_idx;
int t1, t2;
;
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
t1 = timeNow();
dbfFile = new SocialExplorer.IO.FastDBF.DbfFile();
dbfFile.Open("c:\\KLADR.DBF", System.IO.FileMode::Open);
dbfHeader = dbfFile.get_Header();
cnt = dbfHeader.get_RecordCount(); // определяет количество строк в файле
dbfRecord = new SocialExplorer.IO.FastDBF.DbfRecord(dbfHeader, System.Text.Encoding::GetEncoding(866)); // можно задать кодировку в dbf файле
// определение порядкового номера столбца по его имени
name_idx = dbfRecord.FindColumn("name");
code_idx = dbfRecord.FindColumn("code");
info(strFmt("строк в файле %1", cnt));
for (i = 0; i < cnt; i++)
{
dbfFile.Read(i, dbfRecord);
name = dbfRecord.get_Item(name_idx);
// Для корректного отображения результата по текстовым полям нужно использовать strrTrim для удаления пробелов в конце строки
name = strRtrim(name);
code = dbfRecord.get_Item(code_idx);
}
dbfFile.Close();
}
catch (exception::CLRError)
{
error(AifUtil::getClrErrorMessage());
dbfFile.Close();
}
catch (exception::Internal)
{
throw error("Internal");
}
t2 = timeNow();
info(strFmt("Время обработки %1", t2 - t1));
}
Проект свободный для коммерческого использования, так что может быть и это пригодится кому то.