Формула Excel или Google для подсчета вхождений числа 8-ди git в текстовой строке - PullRequest
1 голос
/ 07 февраля 2020

Я надеюсь, что вы можете мне помочь.

У меня есть набор данных, который включает в себя поле для свободного текста комментариев; в этом поле есть введенные номера рабочих заданий, которые я хочу сосчитать - номера WO ВСЕГДА 8 цифр, и я подумал, что взломал его с помощью этого: =ROUNDDOWN(SUMPRODUCT(LEN(M7)-LEN(SUBSTITUTE(M7, {0,1,2,3,4,5,6,7,8,9},"")))/8,0), который правильно определяет номера WO в комментарии, подобном этому:

NWMS - 67431710 - Mattress eta pending from contractor
NWMS - 67431797 - Double base eta pending from contractor

и возвращает счетчик 2 (это одна ячейка с многострочными комментариями).

Также; из-за формулы ROUNDDOWN; комментарий, подобный этому: CMS - 67630485 smell From waste outlets or blockage eta 05.02 возвращает только количество 1 WO (что правильно)

Однако; Новая проблема, с которой я сталкиваюсь, заключается в том, что при добавлении даты ETA, которая также имеет 8 цифр - например, 07/02/2020 - это неправильно добавляет 1 к числу номеров WO.

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

Я работаю в Google Sheets, но лучше понимаю Excel, поэтому формула для любого из них поможет мне, поскольку я смогу преобразовать ее в любом случае.

Ответы [ 4 ]

3 голосов
/ 07 февраля 2020

В MS Excel вы можете использовать функцию FILTERXML для получения необходимого результата:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))=8))

Только пробелы должны быть без дублирования.

enter image description here

Правка № 1:

Решение для начальных нулей и дублирующих пробелов:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(A1," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>#" & SUBSTITUTE(A1," ","</a><a>#") & "</a></data>","//a"))=9))

Правка № 2:

Решение для исключения времени тоже:

=SUMPRODUCT(ISNUMBER(FILTERXML("<data><a>" & SUBSTITUTE(SUBSTITUTE(A5,":","_")," ","</a><a>") & "</a></data>","//a"))*(LEN(FILTERXML("<data><a>#" & SUBSTITUTE(A5," ","</a><a>#") & "</a></data>","//a"))=9))
3 голосов
/ 07 февраля 2020

Вы можете попробовать использовать регулярные выражения (в Google Sheets) для сопоставления числа с восемью числами git.

Например, следующее заменит все группы чисел с восемью числами git на @.

=REGEXREPLACE(M7,"\d{8}","@")

И затем вы можете использовать метод len(M7) - len(substitute(... для подсчета числа вхождений чисел из восьми чисел git в строке.

Окончательная формула будет выглядеть как

=len(REGEXREPLACE(M7,"\d{8}","@"))-len(SUBSTITUTE(REGEXREPLACE(M7,"\d{8}","@"),"@",""))
0 голосов
/ 10 февраля 2020

Поскольку вы спрашивали об использовании регулярных выражений в Excel, вот простой UDF, который вернет Count из Pattern в String.

. Он должен быть переносим на другие версии Windows Excel. Он не будет работать на Ma c Excel, так как у него нет требуемой dll

Option Explicit
Function REGEXCount(S As String, sPattern As String) As Long
    Dim RE As Object, MC As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .Pattern = sPattern
    Set MC = .Execute(S)
End With

REGEXCount = MC.Count
End Function

. Вы можете использовать это на своем рабочем листе как:

=REGEXCount(cell_ref or string,"\b\d{8}\b")

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

Символами слова являются любые элементы в наборе [A-Za-z0-9_]

Если перед WO может предшествовать или после подчеркивания, затем просто измените шаблон на: (?:[^A-Za-z0-9]|^)\d{8}(?:[^A-Za-z0-9]|$)

UDF можно сделать более гибким, но это подойдет для вашего примера.

enter image description here

0 голосов
/ 07 февраля 2020

короче альтернатива Google Sheets:

=INDEX(COUNTIF(SPLIT(REGEXREPLACE(A1, "\d{8}", "♦♥"), "♦"), "*♥*"))

0

...