텍스트 문자열 내에서 텍스트를 추출하는 방법
저는 VBA를 사용하지 않고 해결하고 싶은 간단한 문제가 있지만, 그것이 해결할 수 있는 유일한 방법이라면 그렇게 하세요.
여러 행(모두 하나의 열)이 있는 파일이 있습니다.각 행에는 다음과 같은 데이터가 있습니다.
17.82E-13 >gi|297848936|ref|XP_00| 4-하이드록사이드 gi|297338191|gb|23343|랜덤
25.09E-09 >gi|168010496|ref|xp_00|2-피루브산
기타...
제가 원하는 것은 "gi|"로 시작하여 "|"로 끝나는 숫자의 문자열을 추출하는 방법입니다.일부 행의 경우 최대 5gi 숫자를 의미할 수 있으며, 다른 행의 경우 하나만 의미할 수 있습니다.
다음과 같은 결과가 나오기를 바랍니다.
297848936,297338191
168010496
기타...
regex 개체를 사용하는 매우 유연한 VBA 답변입니다.함수가 수행하는 작업은 원하는 문자열(기본값 ", ")로 구분하여 찾은 모든 하위 그룹 일치 항목(괄호 안의 항목)을 추출하는 것입니다.정규 표현식에 대한 정보는 http://www.regular-expressions.info/ 에서 확인할 수 있습니다.
첫 번째 문자열이 A1에 있다고 가정하면 다음과 같이 부릅니다.
=RegexExtract(A1,"gi[|](\d+)[|]")
이것은 일련의 숫자 뒤에 오는 "gi|"의 모든 발생을 찾기 때문에 질문의 첫 번째 줄에 대해 다음과 같은 결과를 얻을 수 있습니다.
297848936, 297338191
이것을 칼럼에 적어두면 당신은 모두 끝입니다!
Function RegexExtract(ByVal text As String, _
ByVal extract_what As String, _
Optional separator As String = ", ") As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
Dim i As Long, j As Long
Dim result As String
RE.pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)
For i = 0 To allMatches.count - 1
For j = 0 To allMatches.Item(i).submatches.count - 1
result = result & (separator & allMatches.Item(i).submatches.Item(j))
Next
Next
If Len(result) <> 0 Then
result = Right$(result, Len(result) - Len(separator))
End If
RegexExtract = result
End Function
여기 있습니다(데이터가 A열에 있다고 가정).
=VALUE(LEFT(RIGHT(A1,LEN(A1) - FIND("gi|",A1) - 2),
FIND("|",RIGHT(A1,LEN(A1) - FIND("gi|",A1) - 2)) -1 ))
가장 좋은 공식은 아니지만 숫자를 추출하는 데 효과가 있을 것입니다.
출력이 쉼표로 구분된 행당 두 개의 값이 있기 때문에 방금 알게 되었습니다.셀당 여러 번호에 대해 작동하려면 두 번째 일치, 세 번째 일치 등이 있는지 확인해야 합니다.
정확한 샘플(셀당 최대 2개의 값을 가정)과 관련하여 다음 코드가 작동합니다.
=IF(ISNUMBER(FIND("gi|",$A1,FIND("gi|", $A1)+1)),CONCATENATE(LEFT(RIGHT($A1,LEN($A1)
- FIND("gi|",$A1) - 2),FIND("|",RIGHT($A1,LEN($A1) - FIND("gi|",$A1) - 2)) -1 ),
", ",LEFT(RIGHT($A1,LEN($A1) - FIND("gi|",$A1,FIND("gi|", $A1)+1)
- 2),FIND("|",RIGHT($A1,LEN($A1) - FIND("gi|",$A1,FIND("gi|", $A1)+1) - 2))
-1 )),LEFT(RIGHT($A1,LEN($A1) - FIND("gi|",$A1) - 2),
FIND("|",RIGHT($A1,LEN($A1) - FIND("gi|",$A1) - 2)) -1 ))
못생겼으면 어때요?VBA 솔루션이 더 나을 수도 있지만, 여기에 남겨두겠습니다.
최대 5개의 숫자로 가려면 패턴을 연구하고 공식에서 수동으로 반복합니다.길어질 거예요!
▁the▁first▁on▁data▁the▁split다▁i▁probably에 있는 자료를 먼저 나누었을 것입니다.|
텍스트를 열로 변환 마법사를 사용하는 구분 기호입니다.데이터 탭에 있는 Excel 2007에서 데이터 도구 그룹을 선택한 다음 텍스트에서 열을 선택합니다.기타 지정: 및|
구분 기호로 사용합니다.
게시한 샘플 데이터를 보면 이 작업을 수행한 후에는 숫자가 모두 동일한 열에 포함되므로 원하지 않는 열을 삭제할 수 있습니다.
다른 사람들이 VBA 없이 해결책을 제시한 것처럼...저는 사용하는 것을 발표하겠습니다.이제, 사용할 것인지 아닌지에 대한 당신의 결정입니다.
방금 @Issun이 정규식으로 솔루션을 제시한 것을 보았습니다, 매우 좋습니다!어느 쪽이든 질문에 대해 '보통' VBA만을 사용하는 솔루션을 제시합니다.
Option Explicit
Option Base 0
Sub findGi()
Dim oCell As Excel.Range
Set oCell = Sheets(1).Range("A1")
'Loops through every row until empty cell
While Not oCell.Value = ""
oCell.Offset(0, 1).Value2 = GetGi(oCell.Value)
Set oCell = oCell.Offset(1, 0)
Wend
End Sub
Private Function GetGi(ByVal sValue As String) As String
Dim sResult As String
Dim vArray As Variant
Dim vItem As Variant
Dim iCount As Integer
vArray = Split(sValue, "|")
iCount = 0
'Loops through the array...
For Each vItem In vArray
'Searches for the 'Gi' factor...
If vItem Like "*gi" And UBound(vArray) > iCount + 1 Then
'Concatenates the results...
sResult = sResult & vArray(iCount + 1) & ","
End If
iCount = iCount + 1
Next vItem
'And removes trail comma
If Len(sResult) > 0 Then
sResult = Left(sResult, Len(sResult) - 1)
End If
GetGi = sResult
End Function
Google Sheets에서 Excel을 열고 REGEXREXTRUCT와 함께 정규 표현을 사용합니다.
샘플 사용량
=REGEXEXTRACT("My favorite number is 241, but my friend's is 17", "\d+")
팁:REGEXEXTRACT
돌아올 것입니다241
이 예제에서는 첫 번째 일치 대소문자를 반환합니다.
당신의 경우에는
=REGEXEXTRACT(A1,"gi[|](\d+)[|]")
언급URL : https://stackoverflow.com/questions/7086270/how-to-extract-text-within-a-string-of-text
'IT' 카테고리의 다른 글
UITableViewStylePlain을 사용하여 UITableView에서 부동 헤더를 비활성화할 수 있습니까? (0) | 2023.05.13 |
---|---|
ASP에 대한 그리드 컨트롤.NET MVC? (0) | 2023.05.13 |
두 개의 목록(Of String)을 결합하는 가장 효율적인 방법은 무엇입니까? (0) | 2023.05.13 |
홈브루의 설치 가능한 패키지 목록을 어떻게 찾습니까? (0) | 2023.05.13 |
sudo: npm: 명령을 찾을 수 없습니다. (0) | 2023.05.13 |