Страница 2 из 2

Добавлено: 19 Февраль 2007, 5:33
lexa
Столкнулся тоже с этой проблемой.
Необходимо постоянно в TPS-ном файле(длина записи 420 байт) постоянно обновлять около ста пятидесяти тысяч строк при импорте из Excel (из сформированного обобщенного прайс-листа).
Попытался использовать предлагаемые решения. Все равно очень долго.
В начале темы прозвучало, на мой взгляд, решение выхода из этой ситуации - работа через ClipBoard.
Вопрос, опять на мой взгляд, не из простых, а для кого-то уже пройденный - а как можно работать напрямую с оперативкой, куда помещен ClipBoard всей таблицы. Каков формат этого куска памяти?
Заранее благодарен за совет.

Добавлено: 19 Февраль 2007, 11:06
Игорь Столяров
Мда ! 150 000 * 420 дает на вскидку около 60 MByte.

Даже если сделать аресацию такой строки - все равно к ней доступ будет последовательным и потребуется загрузка в ClipBoard такого массива данных. Может быть проще разместить данные из XLS таблицы последовательным чтением в виде индексированной QUEUE ?
И далее уже с ней работать ?

А если таблица XLS имеет линейную структуру - то можно вместо "медленного" OLE попробовать ODBC драйвер ...

Добавлено: 19 Февраль 2007, 11:26
Yufil
lexa писал(а):Столкнулся тоже с этой проблемой.
Необходимо постоянно в TPS-ном файле(длина записи 420 байт) постоянно обновлять около ста пятидесяти тысяч строк при импорте из Excel (из сформированного обобщенного прайс-листа).
Попытался использовать предлагаемые решения. Все равно очень долго.
В начале темы прозвучало, на мой взгляд, решение выхода из этой ситуации - работа через ClipBoard.
Вопрос, опять на мой взгляд, не из простых, а для кого-то уже пройденный - а как можно работать напрямую с оперативкой, куда помещен ClipBoard всей таблицы. Каков формат этого куска памяти?
Заранее благодарен за совет.
Буфер обмена состоит из строк, разделённых символами переноса строки <13,10>
Строка состоит из полей в текстовом виде, разделенных знаком табуляции <9>

Добавлено: 19 Февраль 2007, 14:01
lsgsoftware
Я много раз делал так: выгружал эксельную таблицу в текстовый файла и скармливал его клаше. Работало как часы, а объемы были существенно поболее.Попробуй, может это тебя устроит

Добавлено: 19 Февраль 2007, 23:24
lexa
Yufil писал(а):Буфер обмена состоит из строк, разделённых символами переноса строки <13>
Строка состоит из полей в текстовом виде, разделенных знаком табуляции <9>
Спасибо. Это то, что нужно.
Да!, просто для решения этой проблемы мне понадобились функция CLIPBOARD(1), переменная String максимальной длины и функции обработки строки по поиску в ней вышеупомянутых кодов разделителей.
Экспериментировал на не очень быстрой машинке с таблицей в 15тыс. строк. Считывание по каждой ячейке и последующей записи на диск занимало примерно 14 мин. Через закачку в String содержимого CLIPBOARD-а, последующей обработки и записи это заняло всего 4-5сек.
Более объемные таблицы через туже процедуру буду загружать частями, думаю, выигрыш будет тот же.

Добавлено: 20 Февраль 2007, 5:00
lexa
Извиняюсь за неточность – не 4-5сек., а около 2мин. Но это с использованием add(file). Использование append+build снизило длительность всего процесса до 20-22сек. Все равно выигрыш ощутимый.