powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Счетчик в конце имени файла
9 сообщений из 9, страница 1 из 1
Счетчик в конце имени файла
    #33545830
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
натолкнулся на небольшую проблемку, в обсуждениях не нашел.
----------
Есть файл который пользователь сохраняет, в случае если такой файл есть уже в конце имени файла надо добавить цифру, соотв. если есть цифра, ее надо инкрементировать.

Например имя файла, "ааа11"
надо сделать "ааа12"

решил что оптимальным будет "перевернуть" имя файла и использовать VAL()
т.е. Val("11aaa") +1 это нужный мне счетчик.

как "изящно" перевернуть, в голову ничего не приходит, а может вообще не потому пути пошел?

______________________________________
Strong
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546021
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADIR() по маске файла+убираем буквы из имени+сортируем массив по убыванию=> следующий номер = первый элемент массива+1
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546165
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инвертировать не получиться. Точнее, результат будет не тот, что нужно:

Инвертируем "a12" - получаем "21а" - число 21 - следующее 22 - имя "а22"

Т.е. вместо ожидаемого "а13" имеем "а22"

Проще всего дописывать не число, а дату-время в символьном выражении:

?TTOC(DATETIME(),1)

Получишь символьную строку вида ГГГГММДДЧЧММСС или год-месяц-день-час-минуты-секунды без разделителей.

Вероятность повторного значения есть, но минимальная. Можно предварительно проверить факт существования файла с таким именем и повторить формирование имени, если есть дубль. Вряд ли будет больше 2 циклов формирования имени.

Если все-таки хочется выделить числовую часть и есть уверенность, что числа могут быть только и исключительно в конце имени файла, то можно так:

Код: plaintext
1.
2.
3.
4.
LOCAL lcNumValue, lcFileName
lcFileName = "abc123"
lcNumValue = ChrTran(m.lcFileName,ChrTran(m.lcFileName,"0123456789",""),"")
?lcNumValue

"Фокус" тут в следующем. Сначала я выбрасываю из имени файла все цифры. Полученную символьную строку использую как список символов, которые надо выбросить из строки. В реузльтате, остануться только и исключительно цифры.

Однако такой способ не применим, если возможно перемешивание букв и цифр.

Ну, например, при выделении только цифр из имени вроде "a1b2c3" получим число "123". И что с ним делать дальше?
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546169
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
написал вот так но не очень нравится, может есть вариант изящнее


cl_FileXl -имя файла
cl_CountFile- счетчик в кнце имени файла

cl_FileXl="131kljhhjkl123f"
cl_CountFile=""
cl_CutSmbl=""


FOR l_I=1 TO LEN(cl_FileXl)
cl_CutSmbl=LEFT(RIGHT(cl_FileXl,l_I),1)
IF ISDIGIT(cl_CutSmbl)
cl_CountFile=cl_CutSmbl+cl_CountFile
ELSE
EXIT
ENDIF
ENDFOR
cl_FileXl=SUBSTR(cl_FileXl,1, LEN(cl_FileXl)-LEN(cl_CountFile) );
+PADL( ;
TRANSFORM( VAL(cl_CountFile)+1 ) ,;
IIF( LEN(cl_CountFile)<3, 3,LEN(cl_CountFile) ),;
"0";
)
MESSAGEBOX(cl_FileXl)



______________________________________
Strong
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546347
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Если все-таки хочется выделить числовую часть и есть уверенность, что числа могут быть только и исключительно в конце имени файла, то можно так:

Код: plaintext
1.
2.
3.
4.
LOCAL lcNumValue, lcFileName
lcFileName = "abc123"
lcNumValue = ChrTran(m.lcFileName,ChrTran(m.lcFileName,"0123456789",""),"")
?lcNumValue

"Фокус" тут в следующем. Сначала я выбрасываю из имени файла все цифры. Полученную символьную строку использую как список символов, которые надо выбросить из строки. В реузльтате, остануться только и исключительно цифры.

Однако такой способ не применим, если возможно перемешивание букв и цифр.

Ну, например, при выделении только цифр из имени вроде "a1b2c3" получим число "123". И что с ним делать дальше?

Предлагаю не "убивать" буквы, а заменить их, например, на "_". Ну и дальше RAT() и пр.
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546581
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМОднако такой способ не применим, если возможно перемешивание букв и цифр.

Ну, например, при выделении только цифр из имени вроде "a1b2c3" получим число "123". И что с ним делать дальше?

Имя файла может быть любым.

насчет ВладимирМ дописывать не число, а дату-время в символьном выражении
имя файла слишком удлиннится, пользователям не нравится.
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546586
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
LOCAL ARRAY arrFiles( 1 )
LOCAL lcFileMask, lnArrLen, lnCount, lcAlfa, lcStr

lcAlfa = "QWERTYUIOPASDFGHJKLZXCVBNM"
lcFileMask = "T:\TXT\a381_*"
ADIR(arrFiles,lcFileMask)
lnArrLen = ALEN(arrFiles)
FOR lnCount =  1  TO lnArrLen STEP  5 
	lcStr = CHRTRAN(arrFiles(lnCount),lcAlfa,"_")
	arrFiles(lnCount) = VAL(SUBSTR(lcStr,RAT("_",lcStr)+ 1 ))
NEXT
SET STEP ON 
ASORT(arrFiles, 1 ,- 1 , 1 )
RETURN arrFiles( 1 , 1 )
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546723
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простейшее решение, это вообще не анализировать имя существующего файла. Идешь с другого конца. Формируешь имя файла, если такое имя есть, увеличиваешь счетчик и опять проверяешь. Ну, примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL lcPrefix, lcFileName, lnI
lcPrefix = "abc"
FOR m.lnI =  1  TO  100000 
	lcFileName = m.lcPrefix+TRNSFORM(m.lnI)
	IF File(m.lcFileName) = .F.
		EXIT
	ENDIF
ENDFOR

* Имя, которого еще (или уже) нет
?m.lcFileName

Т.е. не надо "выцарапывать" какие-то фрагменты из существующих файлов. Все формируешь сам.
...
Рейтинг: 0 / 0
Счетчик в конце имени файла
    #33546913
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМПростейшее решение, это вообще не анализировать имя существующего файла. Идешь с другого конца. Формируешь имя файла, если такое имя есть, увеличиваешь счетчик и опять проверяешь. Ну, примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL lcPrefix, lcFileName, lnI
lcPrefix = "abc"
FOR m.lnI =  1  TO  100000 
	lcFileName = m.lcPrefix+TRNSFORM(m.lnI)
	IF File(m.lcFileName) = .F.
		EXIT
	ENDIF
ENDFOR

* Имя, которого еще (или уже) нет
?m.lcFileName

Т.е. не надо "выцарапывать" какие-то фрагменты из существующих файлов. Все формируешь сам.

В общем согласен, в моем случае подобный подход будет более эффективен.

Всем большое спасибо, за дельные советы.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Счетчик в конце имени файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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