Аккуратный трюк, который я иногда использую для строки синтаксического анализа в целом использовать в 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()]
.
Прохладный, спасибо! Я пытаюсь понять, как это работает - можете ли вы объяснить этот подход? –
@ user3633993 сначала он подсчитывает число '.' и заменяет последний' .' '{{{'. Затем он обнаруживает, что '{{{' и разбивает на нем текстовую строку. –
Возможно, было бы безопаснее использовать запрещенный символ, например '*' для разделения. Это угловой случай, но '{{.foo' является допустимым именем файла. – Comintern