:: Visual Foxpro, Foxpro for DOS
Re: pivot x2tab на большой таблице
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
SET DECIMALS TO 14
Select Distinct fr From irisgarm Into Cursor curres
cmd = 'create cursor curresult (cdt c(19)'
Do While Not Eof('curres')
cmd = cmd+',c'+Alltrim(fr) +' N(16,14)'
Skip 1 In curres
Enddo
cmd = cmd + ')'
jj = 1
&cmd
Select irisgarm
Go Top
olddt = irisgarm.cdt
Insert Into curresult (cdt) Values (irisgarm.cdt)
cmd =' replace '
Do While Not Eof('irisgarm')
If olddt != irisgarm.cdt
If Not Empty(cmd)
cmd = cmd +' In irisgarm'
&cmd
Endif
If Mod(jj,1000)=0
?jj
Endif
Insert Into curresult (cdt) Values (irisgarm.cdt)
jj = jj+1
olddt = irisgarm.cdt
cmd =' replace '
Endif
If Type('curresult.c'+fr)!='U'
cmd =cmd + 'curresult.c'+irisgarm.fr +' with '+ irisgarm.aml
Endif
Skip 1 In irisgarm
Enddo



Исправлено 1 раз(а). Последнее : Joys, 06.04.21 08:17
Ratings: 0 negative/0 positive
Re: pivot x2tab на большой таблице
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
ЕСЛИ Я ПРАВИЛЬНО ПОНЯЛ КОД!

Алгоритм, очевидно, не оптимальный в плане скорости.
Про мелочи (типа SCAN вместо DO WHILE + SKIP) писать не буду, но главное, на мой взгляд, - добавлять записи в curresult командой INSERT из массива, заполняя сразу все имеющиеся в курсоре поля - отпадет необходимость в макро (вероятно, это главный тормоз), не придется формировать строку команды REPLACE.

Вместо этого для каждой записи irisgarm надо всего-то бросить irisgarm.aml в нужный элемент массива.
Ratings: 0 negative/0 positive
Re: pivot x2tab на большой таблице
Равиль
Автор

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
Set Safety Off
Set Debugout To Boba.Log
Local lnRows, lnCol, lc, i, k, lfcr
lfcr = Chr(13)+Chr(10)
Use In Select("Boba") && Таблица Володи
Use In Select("Rows_CDT") && Строки
Use In Select("Cols_FR") && Колонки
Use In Select("Tmp") && Пустышка
*!* Открываем таблицу Володи, если нет то создаем
*************************************************
Use ? Again Alias Boba Exclusive In 0
If !Used("Boba")
*!* Если таблицы нет, то лепим похожую (20 млн записей)
Debugout Datetime(), "Лепим таблицу"
*************************************
Create Table Boba (CDT t, FR c(8), AML n(18,14))
For m.i = 1 To 20000000
Insert Into Boba ;
(CDT, FR, AML) ;
Values ;
(Datetime(), Padl(Transform(Int(Rand()*100)*1000+Int(Rand()*10)),8,"0"), Rand()*100*Iif(Mod(m.i,2)=0,-1,1))
Next
Endif
*!* Browse Last
Debugout Datetime(), "Индексируем"
***********************************
Create Table Tmp (nk i)
Select Boba
Index On CDT Tag CDT_U Unique
Copy To Rows_CDT Fields Tmp.nk, Boba.CDT && Строки
Index On FR Tag FR_U Unique
Copy To Cols_FR Fields Tmp.nk, Boba.FR && Колонки
Select 0
Use Rows_CDT Exclusive
lnRows = Reccount() + 1 && Кол-во строк (+1 для заголовка колонок)
Replace All nk With Recno() + 1
Index On CDT Tag CDT Additive
Select 0
Use Cols_FR Exclusive
lnCols = Reccount() + 1 && Кол-во колонок (+1 для наименований строк)
Replace All nk With Recno() + 1
Index On FR Tag FR Additive
Debugout Datetime(), "Собираем массив"
***************************************
Dimension aBoba(m.lnRows, m.lnCols)
Store [] To aBoba
aBoba(1, 1) = "aBoba" && Верхний левый угол
Select Rows_CDT
m.i = 1
Scan
m.i = m.i + 1
aBoba(m.i, 1) = Transform(CDT) && Наименования строк
Endscan
Select Cols_FR
m.i = 1
Scan
m.i = m.i + 1
aBoba(1, m.i) = "c"+FR && Наименования колонок
Endscan
Select Boba
Delete Tag All
Set Relation To CDT Into Rows_CDT Additive
Set Relation To FR Into Cols_FR Additive
Scan
aBoba(Rows_CDT.nk, Cols_FR.nk) = Transform(Boba.AML) && Заполняем массив
Endscan
Debugout Datetime(), "Выводим в CSV "
*************************************
Delete File Boba.Csv
For m.i = 1 To m.lnRows
m.lc = []
For m.k = 1 To m.lnCols
m.lc = m.lc + ["]+aBoba(m.i, m.k)+[";]
Next
Strtofile(m.lc+m.lfcr, "Boba.csv", 1)
Next
Debugout Datetime(), "Готово"
******************************
Set Debugout To
Modify File Boba.Log


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: pivot x2tab на большой таблице
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Попробовал
Ничего не создала,
результат пустой файл с ошибками
Там иногда сбои в структуре
Может быть пустое третье поле,
или даже второе
Так идет при скачке исходной информации
Ratings: 0 negative/0 positive
Re: pivot x2tab на большой таблице
Равиль
Автор

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
у меня отработало (14 млн записей - пара минут)

07.04.2021 11:25:13 Индексируем
07.04.2021 11:25:46 Собираем массив
07.04.2021 11:26:06 Выводим в CSV
07.04.2021 11:27:07 Готово

[attachment 35240 11.png]

вторая таблица чуть быстрее (11 млн записей) :
07.04.2021 11:41:49 Индексируем
07.04.2021 11:42:17 Собираем массив
07.04.2021 11:42:33 Выводим в CSV
07.04.2021 11:43:29 Готово

[attachment 35241 222.png]

файлы отправил на почту


------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 1 раз(а). Последнее : Равиль, 07.04.21 09:53
Ratings: 0 negative/0 positive


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

On-line: 17 (Гостей: 17)

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