Показать сообщение отдельно
Старый 06.05.2011, 13:37   #4  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Проверил этот вариант. Мне он понравился больше. Профессиональная разработка, больше возможностей, грамотно сделано....

Некоторые особенности этого варианта:
- штатно нельзя задать кодировку символов файла при чтении
(по умолчанию она в стандартной западной кодировке, а российские файлы DBF кодируются в кодировке 866, в основном). Пришлось "подправить" это в DLL. - прилагается.

- текстовые поля возврашаются без "обрезанных" с права пробелов,
например
X++:
"Адыгея                                  "
из примера в 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));

}
Проект свободный для коммерческого использования, так что может быть и это пригодится кому то.
Вложения
Тип файла: zip SocialExplorer.FastDBF.dll.zip (9.6 Кб, 302 просмотров)