Разделение предложений на ячейки (Microsoft Excel)
В столбце A у Питера много ячеек, содержащих текст. В частности, каждая ячейка содержит по несколько предложений текста. Он хотел бы разбить предложения на отдельные ячейки. Он знает, что может использовать инструмент «Текст в столбцы», но это не совсем полезно, поскольку предложения могут заканчиваться разными знаками препинания, а некоторые знаки препинания могут использоваться в середине предложения. (Например, точка после названия, например, мистер или мисс) Питер задается вопросом, есть ли лучший способ разбить предложения по разным ячейкам.
Чтобы выполнить эту задачу вручную, есть несколько способов.
Во-первых, вы можете использовать вспомогательный столбец для работы с вашими данными. Например, вы можете поместить эту формулу в ячейку B1:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"Mr.", "Mr#"), "Mrs.", "Mrs#"), "Ms.", "Ms#")
Затем скопируйте формулу до необходимого количества ячеек. В результате вы получаете замену обычных титулов (мистер, миссис и мисс) на уникальную последовательность символов (мистер #, миссис # и мисс #). Скопируйте результаты столбца B обратно в столбец B в качестве значений (чтобы формула была удалена), а затем используйте текст в столбцы в столбце B. Наконец, используйте команду «Найти и заменить», чтобы заменить все экземпляры символа # на точку.
Недостатком этого является то, что формула учитывает только три распространенных использования периода, из которых вам может потребоваться обработать еще несколько. Например, ваши предложения могут иметь названия, такие как Доктор, или показатели квалификации, такие как доктор философии. или эсквайр. Список таких сокращений с периодичностью может быть довольно длинным. В таких случаях вы можете вручную внести изменения следующим образом:
-
Используйте команду «Найти и заменить» для поиска всех точек в тексте, заменяя точки, не заканчивающиеся на предложение, символом маркера (# в описанном выше методе).
-
Используйте инструмент «Текст в столбцы», чтобы разделить предложения.
-
Используйте «Найти» и «Заменить», чтобы вернуть для всех экземпляров символа маркера точку.
Опять же, если у вас много периодов, не заканчивающихся приговором, этот процесс может занять довольно много времени.
Конечно, эти подходы имеют дело с тем, что на самом деле является сложной темой.
Настоящий вопрос в том, как определить предложение? В английском языке есть только три знака препинания, которые завершают предложение: точка, восклицательный знак и вопросительный знак. Однако есть вариации и исключения. Например, предложение может заканчиваться кавычкой, но перед этой кавычкой всегда будет один из трех завершающих знаков препинания. Кроме того, как уже отмечалось, точка может использоваться для обозначения аббревиатуры.
Если вы начнете использовать «Найти и заменить», чтобы справиться со всеми этими знаками препинания и исключениями, то быстро столкнетесь с запутанной серией шагов. Гораздо лучше попробовать выполнить разбиение с помощью макроса. Вот тот, который правильно обрабатывает большинство предложений и сокращений:
Sub SplitSentences() Dim c As Range Dim sException(8) As String Dim sReplacement(8) As String Dim sTerm(6) As String Dim sTemp As String Dim J As Integer Dim sExp As Variant ' These are the valid ways for a sentence to end sTerm(1) = ". " sTerm(2) = "! " sTerm(3) = "? " sTerm(4) = "." & Chr(34) sTerm(5) = "!" & Chr(34) sTerm(6) = "?" & Chr(34) ' These are the exceptions to the rule ' of a period ending a sentence sException(1) = "Mr." sException(2) = "Mrs." sException(3) = "Ms." sException(4) = "Dr." sException(5) = "Esq." sException(6) = "Ph.D." sException(7) = "a.m." sException(8) = "p.m." ' Set up the replacements for the exceptions For J = 1 To 8 sReplacement(J) = Replace(sException(J), ".", "[{}]") Next J For Each c In Selection sTemp = c.Value ' Convert all the exceptions For J = 1 To 8 sTemp = Replace(sTemp, sException(J), sReplacement(J)) Next J ' Demarcate sentences with a tab For J = 1 To 6 sTemp = Replace(sTemp, sTerm(J), Trim(sTerm(J)) & Chr(9)) Next J ' Split sentences into an array sExp = Split(sTemp, Chr(9)) For J = 0 To UBound(sExp) ' Replace the code for valid periods sExp(J) = Replace(sExp(J), "[{}]", ".") ' Place sentences into adjacent cells on row c.Offset(0, J).Value = Trim(sExp(J)) Next J Next c End Sub
Обратите внимание, что допустимые окончания предложений указаны в массиве sTerm, а допустимые сокращения — в массиве sException. Если в вашем тексте могут быть другие сокращения, вам нужно расширить массив sException, чтобы включить их.
Макрос проходит через все выбранные вами ячейки и заменяет все допустимые исключения. Затем он заменяет все допустимые окончания предложения этим завершением, за которым следует символ табуляции.
Затем он разделяет предложения в зависимости от местоположения символа табуляции. Наконец, он восстанавливает все допустимые периоды, которые были в сокращениях, и помещает предложения в соседние ячейки в той же строке.
Обратите внимание, что макрос заменяет все, что было в выбранных ячейках, и сколько ячеек необходимо справа от выбора, чтобы хранить предложения. Из-за этого вы можете убедиться, что сохранили исходный рабочий лист, прежде чем выбирать диапазон ячеек и запускать макрос.
Наконец, вы можете отметить, что макрос не идеален. С точки зрения грамматика, сокращение предложения вполне приемлемо. Когда это происходит, правильная пунктуация требует, чтобы последняя точка в аббревиатуре также служила завершающей точкой для предложения, как в этих двух коротких предложениях:
Sheila earned her Ph.D. She was very happy.
Теперь рассмотрим следующее предложение:
Sheila earned her Ph.D. from an Ivy League school.
Когда вы сравниваете два примера (два предложения и одно предложение), невозможно программно различить степень доктора философии. заканчивает предложение или встречается в середине предложения, не проверяя, начинается ли следующее слово с заглавной буквы или с кавычки, за которой следует заглавная буква. Это может очень быстро стать довольно сложным. К тому же это касается всех сокращений, а не только Ph.D. Вместо того, чтобы пытаться предвидеть и обрабатывать все такие случаи, макрос, упомянутый выше, даже не пытается различить, заканчивает ли аббревиатура предложение или нет — он просто обрабатывает все сокращения так, как если бы они встречаются в середине предложения.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (12549) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365.