:: Visual Foxpro, Foxpro for DOS
Правильно ли я перегоняю файл в другой файл построчно?
негерой
Автор

Сообщений: 17
Дата регистрации: 11.05.2018
Друзья! Есть файл src.db (41 тыща строк) и его нужно построчно перегнать в другой файл dst.dbf. Ниже показываю, как я это делаю. Уж больно медленно у меня это всё перегоняется (9 минут 26 секунд). Меж тем на сортировку файла src.dbf уходят считанные секунды! Мне кажется, я что-то не то делаю. Мне кажется, не нужно на обработке КАЖДОЙ СТРОКИ открывать и закрывать файлы, я не знаю. Проблемные места в коде выделил восклицательными знаками.

SELECT 0
USE src
COPY STRUCTURE TO dst
&&это указательб на строку
p_number_str = 1
&&это общее количество строк в файле ыкс
count_str = RECCOUNT ()
&&работаем поочерёдно с каждой строкой из файла src
DO WHILE p_number_str <= count_str
GO p_number_str
&&? p_number_str
&&считаем очередную строку в массив
SCATTER TO temp_array
&&указатель на текущую строку файла src увеличим
p_number_str = p_number_str + 1
&&дальше работаем с файлом dst
&&!!!
&&в каждый раз закрываю и открываю файл
&&!!!
USE
USE dst
&&создадим в файле dst пустую запись
APPEND BLANK
&&и туда перегоним содержание массива
GATHER FROM temp_array
&&дальше работаем с файлом src
&&!!!
&&в каждый раз закрываю и открываю файл
&&!!!
USE
USE src
ENDDO
CLOSE TABLES

В FoxPro не шарю совсем, так, изредка на работе просят поправить файлы *.dbf.

Реальный код, естессно, другой, поосмысленнее будет. Там строка перегоняется из src.dbf в файл dst.dbf ПО ОПРЕДЕЛЁННОМУ УСЛОВИЮ. Тут я это всё опустил, дабы не загромождать код. Спасибо, кто откликнется.



Исправлено 1 раз(а). Последнее : негерой, 11.01.19 22:28
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Удивительный код, конечно.

Если надо скопировать данные из одной dbf-таблицы в другую dbf-таблицу, то что мешает сделать так?

Use scr
Copy to dst FOR <условие>
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
негерой
Автор

Сообщений: 17
Дата регистрации: 11.05.2018
Simple777
Удивительный код, конечно.
Если надо скопировать данные из одной dbf-таблицы в другую dbf-таблицу, то что мешает сделать так?

Use scr
Copy to dst FOR <условие>
вы бы, товарищ помогли мне, если разбираетесь, на вопрос бы ответили, а я бы вам спасибо сказал.
Фишка в том, что условие МЕНЯЕТСЯ в процессе копирования (определённое поле каждой записи сравнивается с определённым шаблоном). Сколько-то строк скопировал- шаблон поменялся. Ещё сколько-то скопировал- ещё поменялся. Заранее шаблоны прописать нельзя, они становятся известны только в процессе копирования. Сколько раз они поменяются- тоже заранее неизвестно.

Не хочется в дебри залезать, а то так придётся дойти до начальной задачи.



Исправлено 4 раз(а). Последнее : негерой, 11.01.19 23:02
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Если условие неизвестно, то неизвестно что советовать. Пока лишь известно, что "почему-то нельзя записать условие, потому что оно меняется". Такой информации недостаточно, чтобы что-то советовать.
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
негерой
Автор

Сообщений: 17
Дата регистрации: 11.05.2018
Simple777
Если условие неизвестно, то неизвестно что советовать. Пока лишь известно, что "почему-то нельзя записать условие, потому что оно меняется". Такой информации недостаточно, чтобы что-то советовать.
ну посоветуйте, всякий раз нужно файл открывать и закрывать или нет?
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Честно говоря трудно понять, что вам нужно и от чего меняются условия для вставки данных, но может воспользоваться командой insert которая вставит данные из запроса по условию?

INSERT INTO dbf_name [(FieldName1 [, FieldName2, ...])] SELECT SELECTClauses [UNION UnionClause SELECT SELECTClauses ...]

пример из хелпа
INSERT INTO OrdersArchive (order_id, order_date, ship_name) ;
SELECT order_id, order_date, ship_name FROM Orders ;
WHERE order_date >= (DATE()-30)


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Открывать и закрывать всякий раз файл не надо. Выходной файл можно открыть в отдельной рабочей области, и в дальнейшем обращаться к этому файлу по alias или просто переходя в рабочую область, где файл располагается. Например

Close databases
Use scr
Copy structure to dst
Sele 0
Use dst
Sele scr && перейти в рабочую область входной таблицы
Scatter to m.rect
Sele dst
Append blank
Gather from m.rect
Ratings: 0 negative/1 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
негерой
Автор

Сообщений: 17
Дата регистрации: 11.05.2018
Божья_коровка
Честно говоря трудно понять, что вам нужно
Я перегоняю файл построчно. Не скопом, а по одной строке. По одной, понимаете? Ни скопом, а по одной. Правильно ли я перегоняю файл? Посмотрите код, может комментариев добавить для понятности?

Божья_коровка
Честно говоря трудно понять, что вам нужно и от чего меняются условия для вставки данных
Условие тут вообще неважно, важно, что оно есть. Просто поверьте, что в реальной задаче оно есть, я просто не встал его вставлять, чтобы не усложнять код. Строчку с определённым шаблоном я сумею сам сравнить, думаю.
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Вопрос - а для чего перегонять данные по одной строке если можно их вставить сразу скопом по условию?


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
FoxPro позволяет записывать ПЕРЕМЕННЫЕ УСЛОВИЯ в виде выражения. Не так часто бывает, что условие абсолютно невозможно записать в опции FOR <условие>. Не говоря уже о том, что есть мощный инструмент SQL-запросов, где можно записывать многоуровневые и вложенные условия, что и предложила использовать Божья коровка
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
По сути у ТC будет -

INSERT INTO dst (тут наименование полей) ;
SELECT наименования полей FROM src ;
WHERE тут условие


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 1 раз(а). Последнее : Божья_коровка, 11.01.19 23:26
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Божья_коровка
По сути у ТC будет -
INSERT INTO dst (тут наименование полей) ;
SELECT наименования полей FROM src ;
WHERE тут условие ;

Так, видимо, не получится. Условие меняется в процессе копирования. ТС написал об этом. Но такого рода переменные условия можно записывать и через EVALUATION(), и даже в крайнем случае через макроподстановки. Но не зная сути условий, ничего посоветовать конкретного не получится.
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Simple777
Божья_коровка
По сути у ТC будет -
INSERT INTO dst (тут наименование полей) ;
SELECT наименования полей FROM src ;
WHERE тут условие ;

Так, видимо, не получится. Условие меняется в процессе копирования. ТС написал об этом. Но такого рода переменные условия можно записывать и через EVALUATION(), и даже в крайнем случае через макроподстановки. Но не зная сути условий, ничего посоветовать конкретного не получится.
Так ради бога Симпле, пусть условие будет переменным. У меня вообще запросы все формируются динамически. Сформировать строку с условием это же не проблема. Просто действительно не зная сути, трудно советовать. ТС бы хоть версию фокса указал, а то может как у того студента FPD 1 стоит


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 2 раз(а). Последнее : Божья_коровка, 11.01.19 23:32
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
О чем и речь.
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Вот же какие твердые.
Подправьте человеку его код, убрав лишние use и счётчики и заменив do while на scan.
Ему и понятно будет.
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Было бы нелишним для ТС указать версию FoxPro, на которой он работает.
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Taran
Вот же какие твердые.
Подправьте человеку его код, убрав лишние use и счётчики и заменив do while на scan.
Ему и понятно будет.
Думаешь ТС insert непонятен?


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Божья_коровка
Taran
Вот же какие твердые.
Подправьте человеку его код, убрав лишние use и счётчики и заменив do while на scan.
Ему и понятно будет.
Думаешь ТС insert непонятен?

Думаю не в inserte проблема, а как раз наоборот, в select.
Ну и главное. Условие у него меняется через некоторое количество записей.
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Taran
Думаю не в inserte проблема, а как раз наоборот, в select.
Ну и главное. Условие у него меняется через некоторое количество записей.
Ну нарисуй ему тогда scan endscan...


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 2 раз(а). Последнее : Божья_коровка, 12.01.19 00:07
Ratings: 0 negative/0 positive
Re: Правильно ли я перегоняю файл в другой файл построчно?
негерой
Автор

Сообщений: 17
Дата регистрации: 11.05.2018
Simple777
Открывать и закрывать всякий раз файл не надо. Выходной файл можно открыть в отдельной рабочей области, и в дальнейшем обращаться к этому файлу по alias или просто переходя в рабочую область, где файл располагается. Например
Close databases
Use scr
Copy structure to dst
Sele 0
Use dst
Sele scr && перейти в рабочую область входной таблицы
Scatter to m.rect
Sele dst
Append blank
Gather from m.rect

Другой коленкор. Больше ничё и не требовалось. Так сделал

SELECT 0
USE src
COPY STRUCTURE TO dst
&&это указатель на строку
p_number_str = 1
&&это общее количество строк в файле src
count_str = RECCOUNT ()
SELECT 0
USE dst
SELECT src
&&работаем поочерёдно с каждой строкой из файла src
DO WHILE p_number_str <= count_str
GO p_number_str
? p_number_str
&&считаем очередную строку в массив
SCATTER TO temp_array
&&указатель на текущую строку файла src увеличим
p_number_str = p_number_str + 1
&&дальше работаем с файлом dst
SELECT dst
&&создадим в файле dst пустую запись
APPEND BLANK
&&и туда перегоним содержание массива
GATHER FROM temp_array
&&дальше работаем с файлом src
SELECT src
ENDDO
CLOSE TABLES

Решилось за минуту. Коряво, конечно, ну так что теперь.

...Так, а изначальная задача, более сложная (тут она не представлена), где строки копировались по определённому условию, да ещё и не в один файл, а в несколько- за 54 секунды. Есть над чем подумать. Но это потом. Всем спасибо.



Исправлено 1 раз(а). Последнее : негерой, 12.01.19 00:20
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 24 leonid  (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика