如何在Excel中拆分列,直到 * 后的第一个数字

hujrc8aj  于 2023-06-07  发布在  其他
关注(0)|答案(7)|浏览(185)

我正在尝试将I have范围拆分为2。我想要的结果是直到*之后的第一个数字。我尝试过将文本转换为列,并尝试使用TextBefore和TextAfter,但由于长度的差异,它不起作用。这就是我奋斗的地方。
| 我有|我需要|我需要|
| - -----|- -----|- -----|
| ABCK1234456| ABCK1234|四百五十六|
| 电话:+86-21 - 88888888传真:+86-21 - 88888888| AB
L2987| 456459326|
| AB
BCDEFGJKLDEG221971| ABBCDEFGJKLDEG22|一九七一年|
| GHIFGHIGUI0219711985| GHIFGHIGUI02| 1971年 *|
一级方程式
=TEXTBEFORE(A1,"*",2)
二级方程式赛车
=TEXTAFTER(A1,"*",3)
不知道为什么 * 从markdown表中删除。在Excel中进行屏幕打印。忽略中间的空格,没有空格时markdown没有阅读。

nuypyhwy

nuypyhwy1#

备选方案:

=LET(
    ζ,A1:A4,
    κ,"*",
    MAKEARRAY(ROWS(ζ),2,
        LAMBDA(α,β,
            LET(
                ξ,INDEX(ζ,α,1),
                φ,XMATCH(1,1-ISERR(0+(TEXTSPLIT(ξ,κ)&"**0"))),
                IF(1-β,TEXTAFTER(ξ,κ,φ),TEXTBEFORE(ξ,κ,φ))
            )
        )
    )
)
qni6mghb

qni6mghb2#

这里有另一个方法:

  • *上拆分
  • 使用XMATCH查找第一个数字序列
  • 使用TAKEDROP创建序列和TEXTJOIN,其中*位于第一个数字之前和之后
  • HSTACK两个字符串
B1: =LET(
    a, TEXTSPLIT(A1, "*"),
    b, XMATCH(TRUE, ISNUMBER(-a)),
    c, TEXTJOIN("*", , TAKE(a, , b)),
    d, TEXTJOIN("*", , DROP(a, , b)),
    HSTACK(c, d)
)

填写

  • 请注意,Excel会将某些值转换为数字。这些值包括系统可能解释为日期、指数符号、比率或分数等的值。(例如:May25; 1E5; 5/9`)。如果这些可能在你的字符串中,并且你希望它们被解释为文本,请扩展你的例子以包含它们 *
camsedfj

camsedfj3#

公式

这里有一个选项 * 不带 * LAMBDA()

B2中的公式:

=LET(s,A2:A5,z,"*",x,FILTERXML("<t><s>*"&SUBSTITUTE(s,z,"</s><s>*")&"</s></t>","//s[substring(.,2)*0=0][1]"),y,TEXTAFTER(s,x&z,1),IF({1,0},TEXTBEFORE(s,z&y),y))

这里的想法是,FILTERXML()的xpath表达式用于标识第一个数字的位置与//s[substring(.,2)*0=0][1]
为了防止删除前导零,我在每个元素的位置1插入星号。当稍后使用TEXTBEFORE()TEXTAFTER()来防止误报时,这也变得很重要。

注意:在此上下文中使用FILTERXML()需要使用windows Excel 365版本。
PowerQuery:

只是为了好玩,我在PQ里玩了一下,看看我能不能做到这一点:

M代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    Out_1 = Table.TransformColumns(Source,{"I have", each let x = "*"&List.First(List.Select(Text.Split(_,"*"),(s)=> Text.Select(s,{"0".."9"})=s))&"*" in Text.ReplaceRange(_,Text.PositionOf(_,x)+Text.Length(x)-1,1,"|")}),
    Out_2 = Table.SplitColumn(Out_1, "I have", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"I need.1", "I need.2"})
in
    Out_2
eulz3vhy

eulz3vhy4#

前后对比

=LET(data,A2:A10,dl,"*",e,"",
MAKEARRAY(ROWS(data),2,LAMBDA(r,c,
    LET(d,INDEX(data,r,1),
        ts,TEXTSPLIT(d,,dl),
        s,SEQUENCE(XMATCH(TRUE,ISNUMBER(--ts))),
        tj,TEXTJOIN(dl,FALSE,INDEX(ts,s)),
    IFERROR(IF(c=1,tj,TEXTAFTER(d,tj&dl)),e)))))

flvlnr44

flvlnr445#

我的版本:

=LET(b,TEXTJOIN("*",1,DROP(TOROW(--TEXTSPLIT(A1,"*"),3),,1)),
     a,LEFT(A1,LEN(A1)-LEN(b)-1),
HSTACK(a,b))

其中,它首先计算第二部分'B',方法是通过分隔符*分割范围并将所有溢出值转换为数字。文本值将转换为错误,并由TOROW参数3过滤掉。然后通过从初始文本中删除a的文本字符串来计算a
并将其溢出:

=DROP( REDUCE(0, A1:A4,
       LAMBDA(x, y,
              LET(b,TEXTJOIN("*",1,DROP(TOROW(--TEXTSPLIT(y,"*"),3),,1)),
                  a,LEFT(y,LEN(y)-LEN(b)-1),
VSTACK(x,
       HSTACK(a,b))))),
      1)
kmb7vmvb

kmb7vmvb6#

您可以使用SEARCH查找星号的位置。然后将其与LEFTRIGHT组合以获得所需的子字符串。
比如说,

=LEFT(A2, SEARCH("*",A2)-1)
tkqqtvp1

tkqqtvp17#

我必须承认,你有一个有效的观点:据我所知,Excel没有一个基本的函数来查找字符串中子字符串的最后一个条目(但VBA有,它是InStrRev函数)。
所以,我建议你用这个InStrRev VBA函数做一个小函数,并在你的Excel工作表中使用它,就像这样:
VBA代码:

Function LastIndexOf(inputstring As String, substring As String)
  LastIndexOf = InStrRev(inputstring, substring)
End Function

Excel公式:

  • 单元格“B1”:=LastIndexOf(A1,"_")
  • 单元格“C1”:=RIGHT(A1,LEN(A1)-LastIndexOf(A1, "_"))

(Cell“B1”仅用于演示目的。)
截图:

相关问题