Обнаружение последовательности файлов - PullRequest
0 голосов
/ 21 июля 2010

Мне нужно импортировать последовательности файлов в программу Qt.Сам по себе импорт не сложен, но я размышляю над тем, что может быть самым простым способом определить, образуют ли файлы последовательность, например:

filename_00001.png
filename_00002.png
filename_00003.png
etc.

Теперь у меня работает импорт drag'n'dropи я сортирую список импортируемых файлов по алфавиту.Но, перебирая QUrl / QString, я изо всех сил пытаюсь найти «простое» решение для определения нумерации изображений.Я мог бы пройти через итерации имен файлов, найти первое число в строке, сформировать базовую строку, счетчик + возможные дополнения и конечные строки и попытаться сопоставить их.Это, однако, звучит немного беспорядочно и заставляет меня думать, что должен быть лучший путь.Но есть ли?

Ответы [ 3 ]

0 голосов
/ 21 июля 2010

То, что вы описываете, скорее всего, является самым простым решением.

Если вам нужно меньше строк кода в вашем приложении, тогда QRegEx - это решение.

0 голосов
/ 22 июля 2010

Я мог бы пройти через итерации имен файлов, найти первое число в строке, сформировать базовую строку, счетчик + возможные отступы и конечные строки и попытаться сопоставить их.Это, однако, звучит немного беспорядочно и заставляет меня думать, что должен быть лучший путь.Но есть ли?

Я хотел иметь простое решение, поэтому я пожертвовал памятью и использую несколько списков / карт для сортировки / группировки имен.Я упаковал строки в структуры с дополнительными полями для вспомогательной информации.

Я использую специальную функцию сравнения.Это не совсем const, поскольку наряду со сравниваемыми строками он также извлекает и сохраняет префикс для каждой записи.(На самом деле я сравниваю версию файла в стиле CVS, и префикс в моем случае - это идентификатор ветви, последовательности - это смежные версии файла.)

Это работает так.Список входных файлов:

"filename_00001.png"
"filename_00002.png"
"filename_00003.png"

Расширения первой полосы:

"filename_00001", "png"
"filename_00002", "png"
"filename_00003", "png"

Затем при сортировке извлекается префикс имени файла: имя - все цифры в конце.Если префиксы равны, тогда сравните числа.(В моем случае ввод не дополняется нулями):

"filename_00001", "png", "filename_"
"filename_00002", "png", "filename_"
"filename_00003", "png", "filename_"

После сортировки / извлечения префикса все последовательности имеют одинаковый префикс.Если в конце файла нет номера, полное имя файла является префиксом и по определению является уникальным.Вы также можете дополнительно сохранить извлеченный номер:

"filename_00001", "png", "filename_", 1
"filename_00002", "png", "filename_", 2
"filename_00003", "png", "filename_", 3

Теперь все они отсортированы и отсортированы правильно, вспомогательная информация подготовлена ​​- все дальнейшие операции довольно тривиальны.Например, итерируя по списку, можно извлечь все последовательности с помощью простого правила: префикс одинаковый / seq num +1 по сравнению с предыдущей записью.

IOW, он может не сильно отличаться от того, что вы делаете.Я просто не боюсь потратить немного памяти / ЦП на операцию, так как после них файловые операции в любом случае медленнее / требуют больше памяти.

0 голосов
/ 21 июля 2010

Моя интуиция сказала бы мне, что любое решение по сути будет включать в себя что-то вроде того, что вы только что описали.Он может быть основан на sscanf, регулярных выражениях или прямом сравнении строк, но подход должен быть в основном таким же.

Могу я спросить, какова цель?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...