2016-11-28 6 views
0

С учетом столбца excel, содержащего пути к файлу, какая формула excel возвращает только расширение файла?Формула Excel VBA: извлечь расширение файла из пути к файлу?

src\main\java\com\something\proj\UI.java ->java src\main\java\com\something\proj\Server.scala ->scala src\main\java\com\something\proj\include.h\someinclude.hpp ->hpp

Примечание 1: эта формула отлично подходит для работы с путей файлов только один период, но не для случая 3:
=IF(A1="","",RIGHT(A1,LEN(A1)-FIND(".",A1)))

Примечание 2: Я понимаю, что эти пути к файлу зависят от Windows, мне не нужно кросс-платформенное решение.

Связанный: triming extension from filename in Excel и How to extract file name from path?

ответ

1

Найдет все после последнего .:

=MID(A1,FIND("{{{",SUBSTITUTE(A1,".","{{{",LEN(A1)-LEN(SUBSTITUTE(A1,".",""))))+1,LEN(A1)) 

enter image description here

+0

Прохладный, спасибо! Я пытаюсь понять, как это работает - можете ли вы объяснить этот подход? –

+0

@ user3633993 сначала он подсчитывает число '.' и заменяет последний' .' '{{{'. Затем он обнаруживает, что '{{{' и разбивает на нем текстовую строку. –

+2

Возможно, было бы безопаснее использовать запрещенный символ, например '*' для разделения. Это угловой случай, но '{{.foo' является допустимым именем файла. – Comintern

2

С данными в A1, использование:

=SUBSTITUTE(RIGHT(SUBSTITUTE(A1,".",REPT(".",999)),999),".","") 

enter image description here

От:

Jim Cone's old post

+0

Удивительный, спасибо! Попытка понять подход - можете ли вы объяснить, почему это работает? –

+0

@BradWehrwein Он работает, потому что он отделяет любые символы после последнего периода от всех остальных символов на 999 точек или любого другого номера, который вы выберете. Затем вы можете выбрать самые правые 999 символов, зная, что вы выбираете ничего, кроме ваших символов расширения и кучу периодов. Замените периоды, и вы готовы пойти. – u8it

0

Вот хороший длинный ответ. :-)

=SUBSTITUTE(A1,LEFT(A1,FIND(CHAR(1),SUBSTITUTE(A1,".",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,".",""))))),"") 
0

Аккуратный трюк, который я иногда использую для строки синтаксического анализа в целом использовать в FilterXML() функцию (Excel 2013 и более поздние версии). Основная стратегия заключается в использовании Substitute() для форматирования строки таким образом, чтобы она анализировалась по элементам в строке xml, а затем вы можете использовать синтаксис xpath, чтобы удобно перемещаться по вашим разборным элементам. Используя эту стратегию, получая расширение будет выглядеть следующим образом ...

=FILTERXML("<A><p>" & SUBSTITUTE(A1,".","</p><p>.")&"</p></A>","//p[last()]") 

Если вы не знакомы с XML, это может показаться пугающим, но если вы можете понять, что происходит, я считаю, что это будет чище , более гибкие и более легкие для запоминания, чем альтернативные подходы с использованием len(), substitute() и т. д. Одна из причин, почему это приятнее, состоит в том, что есть только одна ссылка на ячейку.

Недопустимые символы

Есть два символа, которые разрешены в путях, но не в XML: & и '

Уравнение выше будет работать, если эти символы нет, в противном случае, они будут нуждаться в для чего-то вроде этого ...

=FILTERXML("<A><p>" & SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(J8,"'",""),"&",""),".","</p><p>.")&"</p></A>","//p[last()]")

Пример

Предположим, у нас есть неприятный путь к файлу, как это:

C: \ Folder1 \ Folder2 \ (уродливые символы @ # $% ^() _ + = {} ;;, `) \ two.dots.LongExt

1.) Substitution() часть преобразует его в XML-строку, как это ...

<A> 
    <p> 
     C:\Folder1\Folder2\(ugly characters [email protected]#$%^()_+={};;,`)\two 
    </p> 
    <p> 
     .dots 
    </p> 
    <p> 
     .txt 
    </p> 
</A> 

2.) После форматирования, это тривиально, чтобы выбрать последний элемент p, используя синтаксис xpath //p[last()].

Смежные вопросы