В Azure DataFactory я хочу удалить все файлы по определенному пути, которые не содержат подстроку (например, «2024-04-15»).
Мне удалось сделать это с помощью цикла, но это слишком дорого, если количество файлов по определенному пути велико (около 1000).
Таким образом, я хотел протестировать подстановочные знаки, но застрял, пытаясь использовать оператор not для регулярных выражений.
Например, если у меня есть 3 файла по пути: [lorem_2024-04-15.csv, lorem_2024-04-14_test.csv, lorem_2024-04-14.csv]
, я хочу удалить все файлы, кроме lorem_2024-04-15.csv
. Я пытался:
Wildcard file name: *^(?!.*2024-04-15).*
Но при попытке предварительного просмотра данных для набора данных, указывающего на этот путь:
The escaped character ^( is not recognized for wildcard filter (*, ?).
If you want to use ^ in file name, specify ^^ to escape. Index: 2.
Да, это не регулярное выражение, это гораздо более простая система Learn.microsoft.com/en-us/azure/data-factory/…
спасибо @CAustin, пузырь понял, не могли бы вы предложить другое решение, которое не требует циклического перебора списка файлов и удаления каждого из них?
Мне удалось сделать это с помощью цикла, но это слишком дорого, если количество файлов по определенному пути велико (около 1000).
Если вы не хотите использовать цикл для удаления необходимых файлов, вы можете выполнить следующую процедуру:
Перечислите все необходимые файлы, которые необходимо удалить, в одном файле, используя поток данных следующим образом:
Добавьте необходимый набор данных в качестве источника потока данных с подстановочным путем и добавьте столбец filename
в настройках источника, как показано ниже:
Вы получите путь к файлу, как показано ниже:
Затем используйте агрегатное преобразование и примените groupBy к столбцу filename
. В разделе агрегирования создайте новый столбец filenamecount
и в качестве образца подсчитайте столбец имени файла (count(filename)
).
Он предоставит все различные пути к файлам и их количество. Затем используйте преобразование select и удалите лишний столбец filenamecount
из потока.
Теперь примените преобразование «deriveColumn» к столбцу filename
и используйте в нем выражение dropLeft(filename,1)
. Это удалит начальный /
в каждой строке.
Теперь используйте преобразование фильтра и выражение not(like(filename, "%2024-04-15%"))
, чтобы исключить имена файлов, содержащие 2024-04-15
.
Затем возьмите другой набор данных DelimitedText
в качестве приемника потока данных и укажите путь к файлу. Здесь обязательно снимите флажок «Первая строка как заголовок».
Настройте параметры приемника, как показано ниже:
После выполнения потока данных файл сгенерирует имя файла.csv с необходимыми путями к файлам, как показано ниже:
После действия потока данных добавьте действие удаления, выберите набор данных, выберите «Список файлов» и просмотрите файл filename.csv.
После выполнения действия удаления будут удалены все файлы, кроме тех, которые содержат 15 апреля 2024 г., как показано ниже:
определенно единственное жизнеспособное решение, которое не требует больших вычислительных затрат, но слишком громоздко для реализации, не по вине @Bhavani
Вы уверены, что там вообще можно использовать регулярное выражение?