【问题标题】:Excel Formula To Replicate Text To Column FunctionalityExcel 公式将文本复制到列功能
【发布时间】:2022-10-06 21:19:12
【问题描述】:

我想要一个 Excel 中的公式,它可以执行 Text To Columns 的功能。 例如 A1 中的以下字符串

\" text with a comma, stays in one column\",,\" keep starting blank text\",1,2,3,\"123\"

会像这样被分成多个单元格......

    标签: string excel-formula split text-to-column


    【解决方案1】:

    以下 LET 函数允许您根据分隔符(在本例中为逗号)将文本拆分为列。 它忽略引号之间的逗号(Delim 参数 - 其中包含双引号)。 它通过确保在分隔符之前有偶数个引号来做到这一点。

        =LET(
        NOTES,"Splits a string but also checks to see if the splitter is inside a delimiter. So will ignore a comma inside quotes.",
        RawString,$A1,
        Splitter,",",Note2,"This is the character to split the string by",
        Delim,"""",Note4,"This is the text delimiter it looks odd but it's just a double quote - change to "" if you don't want text delimitation",
        IgnoreBlanks,FALSE,
        CleanTextDelims,TRUE,
        TrimBlanks,FALSE,
        SplitString,Splitter&RawString&Splitter,Note3,"Add the splitter to the start and the end to help create the array of split positions",
        StringLength,LEN(SplitString),
        Seq,SEQUENCE(1,StringLength),Note5,"Get a sequence from 1 to the length of the split string",
        Note6,"The below does the bulk of the work. It works out if we are at an odd or even point in terms of count of text delimiters up to the point in the sequence we are processing.",
        Note7,"if we are at an even point and we have a delimiter then make a note of the sequence otherwise put a blank.",
        PosArray,IF(Seq=StringLength,Seq,IF(MOD(LEN(LEFT(SplitString,Seq))-LEN(SUBSTITUTE(LEFT(SplitString,Seq),Delim,"")),2)=0,IF(MID(SplitString,Seq,1)=Splitter,Seq,""),"")),
        PosArrayClean,FILTER(PosArray,PosArray<>""),Note8,"Clean blanks",
        StartArray,FILTER(PosArrayClean,PosArrayClean<>StringLength),
        EndArray,FILTER(PosArrayClean,PosArrayClean<>1),
        StringArray,MID(SplitString,StartArray+1,EndArray-StartArray-1),
        StringArrayB,IF(IgnoreBlanks,FILTER(StringArray,StringArray<>""),StringArray),
        StringArrayC,IF(CleanTextDelims,IF(LEFT(StringArrayB,1)=Delim,MID(StringArrayB,2,IF(RIGHT(StringArrayB,1)=Delim,LEN(StringArrayB)-2,LEN(StringArrayB))),StringArrayB),StringArrayB),
        IFERROR(IF(TrimBlanks,TRIM(StringArrayC),StringArrayC),"")
        )
    

    分解 LET 公式中的每个步骤:

    1. 提供原始字符串(在本例中来自单元格 A1)
    2. 设置分隔符 - 在本例中为逗号
    3. 设置文本分隔符 - 在这种情况下是双引号(看起来很奇怪,因为它必须是双引号 - Delim,"""" )
    4. IgnoreBlanks 是在输出中排除空白单元格的选项
    5. CleanTextDelims 将从结果字符串的开头和结尾清除 TextDelimiter(双引号)
    6. 创建一个SplitString 变量,前后有分割字符。
    7. 获取字符串长度以方便使用
    8. 获取从 1 到字符串长度的序列。
    9. 获取一个字符位置数组,该数组包含在字符串 posArray(分隔符位置数组)中该位置左侧具有偶数个文本分隔符的分隔符。
    10. 清理空白以获得 posArrayClean
    11. 创建一个开始和结束数组(开始数组忽略最后一个,结束数组忽略 PosArrayClean 中的第一项)
    12. 获取要输出的字符串/单元格数组。
    13. 如果使用 IgnoreBlanks,则忽略空白单元格
    14. 如果设置了 CleanTextDelims 选项,则从结果字符串的开头和结尾去掉文本分隔符(双引号)。
    15. 如果设置了 TrimBlanks 选项,则从结果字符串的开头和结尾剪掉空格。

      希望这些注释清楚地解释了它是如何工作的,并使其易于修改。

      如果您想创建一个命名的 Lambda 来使用,您可以使用以下代码粘贴到名为 SplitStringDelim 的命名范围的公式中(当然,您可以将其命名为您喜欢的名称)。注意:您不能在其中使用行分隔符,因此我将其中的注释剥离了。

      =LAMBDA(StringRaw,SplitChar,DelimChar,IgnoreBlank,CleanTextDelim,TrimBlank, LET( RawString,StringRaw, Splitter,SplitChar, Delim,DelimChar, IgnoreBlanks,IgnoreBlank, CleanTextDelims,CleanTextDelim, TrimBlanks,TrimBlank, SplitString,Splitter&RawString&Splitter, StringLength,LEN(SplitString), Seq,SEQUENCE(1,StringLength), PosArray,IF(Seq=StringLength,Seq,IF(MOD(LEN(LEFT(SplitString,Seq))-LEN(SUBSTITUTE(LEFT(SplitString,Seq),Delim,"")),2)=0,IF(MID(SplitString,Seq,1)=Splitter,Seq,""),"")), PosArrayClean,FILTER(PosArray,PosArray<>""),Note8,"Clean blanks", StartArray,FILTER(PosArrayClean,PosArrayClean<>StringLength), EndArray,FILTER(PosArrayClean,PosArrayClean<>1), StringArray,MID(SplitString,StartArray+1,EndArray-StartArray-1), StringArrayB,IF(IgnoreBlanks,FILTER(StringArray,StringArray<>""),StringArray), StringArrayC,IF(CleanTextDelims,IF(LEFT(StringArrayB,1)=Delim,MID(StringArrayB,2,IF(RIGHT(StringArrayB,1)=Delim,LEN(StringArrayB)-2,LEN(StringArrayB))),StringArrayB),StringArrayB), IFERROR(IF(TrimBlanks,TRIM(StringArrayC),StringArrayC),"")))
      

    【讨论】:

      猜你喜欢
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2013-09-24
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多