Как я могу отформатировать значение между 2-м и 4-м подчеркиванием в имени файла? - PullRequest
1 голос
/ 21 сентября 2019

У меня есть код VBA для записи имен файлов в таблицу в базе данных MS Access.

Значения выглядят следующим образом:

FileName
----------------------------------------------------    
WC1603992365_Michael_Cert_03-19-2019_858680723.csv
WC1603992365_John_Non-Cert_03-19-2019_858680722.csv
WC1703611403_Paul_Cert_03-27-2019_858679288.csv

Каждое имя файла имеет 4 _ подчеркивания, а длина имени файла меняется.

Я хочу захватить значение между 2nd и подчеркивание 3rd , например:

Cert
Non-Cert
Cert

У меня есть другая программа для загрузки файлов, и она имеет функцию «переименования» с регулярным выражением.И я настроил следующее:

Source file Name: (.*)\_(.*)\_(.*)\_(.*)\_\-(.*)\.(.*)
New File Name: \5.\6

В этом примере я перемещаю 5-й раздел имени файла на передний план и добавляю расширение файла.

Например, WC1603992365_Michael_Cert_03-19-2019_858680723.csv будет сохранен как 858680723.csv в папке.

Есть ли способ, с помощью которого я могу использовать RegEx для захвата 3-го раздела имени файла и сохранитьзначение в поле?

Я пробовал код VBA и искал примеры SQL, но я не нашел ни одного.

Поскольку длина имени файла не фиксирована, я не могу использовать LEFT илиRIGHT ...

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Одним из возможных решений является использование функции VBA Split для разделения строки на массив строк с использованием подчеркивания в качестве разделителя, а затем возврат элемента с индексом 2 в этом массиве.

ДляНапример, вы можете определить функцию VBA, например, следующую, находящуюся в общедоступном модуле:

Function StringElement(strStr, intIdx As Integer) As String
    Dim strArr() As String
    strArr = Split(Nz(strStr, ""), "_")
    If intIdx <= UBound(strArr) Then StringElement = strArr(intIdx)
End Function

Здесь я определил аргумент strStr как вариант, чтобы вы могли передать его Null значения без ошибок.

Если указано значение Null или если указанный индекс превышает границы массива, возвращенного путем разбиения строки с помощью подчеркивания, функция вернет пустую строку.

Затем вы можете вызвать вышеуказанную функцию из оператора SQL:

select StringElement(t.Filename, 2) from Filenames t

Здесь я предположил, что ваша таблица называется Filenames - измените ее для соответствия.

0 голосов
/ 21 сентября 2019
declare @Filename varchar(100) = 'WC1603992365_Michael_Cert_03-19-2019_858680723.csv'
declare @partial varchar(100) = substring(@Filename,charindex('_',@Filename)+1,len(@Filename))
set @partial = substring(@partial,charindex('_',@partial)+1,len(@partial))
set @partial = substring(@partial,0,charindex('_',@partial))
select @partial
...