powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Столбец в строку
20 сообщений из 20, страница 1 из 1
Столбец в строку
    #39665621
Местами администратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица, содержащая один столбец с данными (например целочисленных, записей скажем тысячи три),
1
2
3
4
100
...
...
нужно значения всех строк закинуть в буфер обмена в виде строки через какой-нибудь разделитель, скажем / (например 1/2/3/4/100/.....)
Каким образом это сделать с максимальной производительностью?
...
Рейтинг: 0 / 0
Столбец в строку
    #39665665
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай цикл
например через SCAN

Или проблема в том. чтобы поместить в буфер обмена?
...
Рейтинг: 0 / 0
Столбец в строку
    #39665681
Местами администратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас сканом и делаю, предварительно выбрав необходимые уникальные записи в курсор (с преобразованием типа данных в текст),
а потом скан.
_ClipText=''
SELECT in_buf
SCAN FOR !EMPTY(zn)
_ClipText=_ClipText+ALLTRIM(zn)+'/'
ENDSCAN
как видишь в этой версии строка помещается на каждом шаге в буфер обмена. А насколько это разумно не знаю.
...
Рейтинг: 0 / 0
Столбец в строку
    #39665686
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть проблема со скоростью / временем выполнения?
...
Рейтинг: 0 / 0
Столбец в строку
    #39665691
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местами администратор...
нужно значения всех строк закинуть в буфер обмена в виде строки через какой-нибудь разделитель, скажем / (например 1/2/3/4/100/.....)
...
А насколько это разумно не знаю.
Да, нужны серьезные обоснования такого решения)
Но коли уж так, то скан самый разумный для фокса, по 150 причинам.
Лаконично, понятно, быстро.
...
Рейтинг: 0 / 0
Столбец в строку
    #39665705
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местами администраторсейчас сканом и делаю, предварительно выбрав необходимые уникальные записи в курсор (с преобразованием типа данных в текст),
а потом скан.
_ClipText=''
SELECT in_buf
SCAN FOR !EMPTY(zn)
_ClipText=_ClipText+ALLTRIM(zn)+'/'
ENDSCAN
как видишь в этой версии строка помещается на каждом шаге в буфер обмена. А насколько это разумно не знаю.
Буфер обмена не надо как переменную использовать, лучше так
Код: sql
1.
2.
3.
4.
5.
6.
lcText = ''
SELECT in_buf
SCAN FOR !EMPTY(zn) 
  lcText = lcText + '/' + ALLTRIM(zn)
ENDSCAN 
_ClipText = substr(lcText, 2)
...
Рейтинг: 0 / 0
Столбец в строку
    #39665876
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве у переменной не будет ограничение в 256 символов?
...
Рейтинг: 0 / 0
Столбец в строку
    #39665877
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183А разве у переменной не будет ограничение в 256 символов?
Нет. 16 Мб если не путаю.
...
Рейтинг: 0 / 0
Столбец в строку
    #39665879
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256 символов ограничение для строки в коде, т.е. так будет ошибка
Код: sql
1.
lcText = '... тут больше 256 символов ...'


а так нет
Код: sql
1.
lcText = '... тут чуть меньше 256 символов ...' + '... еще чуть меньше 256 символов ...' + ...
...
Рейтинг: 0 / 0
Столбец в строку
    #39665902
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно.
Всё время думал, что текстовые переменные имеют тип

Character
Произвольный текст.
1 байт на символ; до 254 байтов
...
Рейтинг: 0 / 0
Столбец в строку
    #39665907
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Странно.
Всё время думал, что текстовые переменные имеют тип

Character
Произвольный текст.
1 байт на символ; до 254 байтов
Не путай переменные и поля таблиц. Поля типа Character до 254, переменные до 16 Мб
...
Рейтинг: 0 / 0
Столбец в строку
    #39665910
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вроде не путаю "типы данных переменных" и "типы данных полей таблиц"
А ссылку на документацию можно?
А то всё имеющееся говорит обратное.
http://vfp7.ru/Vfp/help/fox01230.htm

Может дело в версии фокса?
...
Рейтинг: 0 / 0
Столбец в строку
    #39665922
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там только про поля, про переменные просто не написали. Т.е. это ограничение DBF, а не фокса.

Вот кусок хэлпа VFP9, в ранних версиях также
Visual FoxPro System Capacities Fields
Maximum size of character fields. 254
...

Miscellaneous
Maximum # of characters per character string or memory variable. 16,777,184
...
Здесь тоже самое http://fox.wikis.com/wc.dll?Wiki~VisualFoxProLimits
...
Рейтинг: 0 / 0
Столбец в строку
    #39665973
Местами администратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Да в общем то в переменную всегда и закидывал данные, и после обработки в буфер обмена (конечная цель - поместить данные в виде строки через разделитель в буфер обмена). А тут необходимость расширить функциональность классу возникла, ну и подумалось - почему бы обработку через буфер не делать. Кстати, а почему через буфер не желательно?
...
Рейтинг: 0 / 0
Столбец в строку
    #39665983
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местами администраторКстати, а почему через буфер не желательно?
Во-первых медленнее работает, во-вторых пользователь может что-нибудь в буфер скопировать во время работы цикла и будет каша.
...
Рейтинг: 0 / 0
Столбец в строку
    #39667706
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местами администратор,

Не знаю про "лисички", но в большинстве языков SQL это делается с помощью группировки.
Надо и "лисички" проверить.
...
Рейтинг: 0 / 0
Столбец в строку
    #39667760
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeно в большинстве языков SQL это делается с помощью группировки.
Пример кода можно посмотреть
...
Рейтинг: 0 / 0
Столбец в строку
    #39667806
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE @t TABLE (qqq varchar(255))
DECLARE @s varchar(max)

INSERT INTO @t(qqq) VALUES ('1')
INSERT INTO @t(qqq) VALUES ('2')
INSERT INTO @t(qqq) VALUES ('3')
INSERT INTO @t(qqq) VALUES ('4')

SET @s=''
SELECT @s=CASE WHEN s='' THEN '' ELSE '/' END+qqq FROM @t

SELECT @s
...
Рейтинг: 0 / 0
Столбец в строку
    #39667807
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Пардон, вопрос невнимательно прочитал.
...
Рейтинг: 0 / 0
Столбец в строку
    #39667935
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местами администраторИмеется таблица, содержащая один столбец с данными (например целочисленных, записей скажем тысячи три),
1
2
3
4
100
...
...
нужно значения всех строк закинуть в буфер обмена в виде строки через какой-нибудь разделитель, скажем / (например 1/2/3/4/100/.....)
Каким образом это сделать с максимальной производительностью?

Из экзотики

1. Если в качестве типа данных для этого поля используется тип Numeric, то физически в файле DBF число хранится как символьная строка. Т.е. для данного типа число 123 так физически и будет хранится как 3 символа "123" с ведущими пробелами

Из этого следует, что можно просто открыть файл DBF как текстовый файл. Затем "отрезать" заголовок. А вот в качестве разделителя использовать служебный байт, в котором хранится признак удаленной записи. Можно предварительно сделать DELETE ALL, чтобы этот разделитель "проявился"

Код: sql
1.
_clipText = FileToStr("MyTable.dbf")



Есть тип поля это не Numeric и не Character, то можно предварительно выгрузить таблицу в старый формат через

COPY TO ... TYPE FOX2X AS 866


2. При помощи COPY TO можно также выгрузить в текстовый файл. Поскольку у Вас один столбец, то разделителем будет два символа: перевод строки и возврат каретки. Т.е. Chr(13) + Chr(10)

Код: sql
1.
2.
3.
select MyTab
COPY TO MyFile.txt TYPE DELIMITED
_clipText = FileToStr("MyFile.txt")



Правда, формально, это не одна "строка", а много "строк". По одной строке на поле. Поскольку в качестве разделителя в этой "строке" будет именно перевод строк. У этой команды нет возможности изменить разделитель "строк"

К сожалению, если такой "разделитель" не подходит, то замена разделителя "съест" весь выигрыш от быстрой выгрузки. Просто в FoxPro работа с большими текстовыми строками - это относительно медленная операция. Можно, конечно, поиграться с FOPEN()+FGETS(), но не уверен, что результат будет быстрее чем описанный ранее SCAN
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Столбец в строку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]