【问题标题】:Split Text By every Nth Delimiter and Transpose Google Sheets按每 N 个分隔符拆分文本并转置 Google 表格
【发布时间】:2021-02-04 02:55:27
【问题描述】:

我需要从一段文本中提取文本。该块如下所示:

{"some text"},{"some more text"},{"some other"},{"some other text"},{"let's add more"},{"even more other text"}

文本应该成对出现,以便第一个和第二个 {""},{""} 进入同一个单元格,依此类推。我尝试了拆分功能,但由于分隔符是逗号,我无法成对拆分。所以我需要在每 2 个逗号后拆分,并将结果对放在它自己的单元格中。然后转置结果,使文本垂直进入一列。

我尝试了=SPLIT("",","),但没有得到想要的输出。

我为此使用 Google 表格并希望在 Google 表格中执行此操作,但我愿意在 Excel 中执行此操作。

如果您想查看 Google 表格文件,这里是链接 https://docs.google.com/spreadsheets/d/1sbK6nF-6SO4oOKTdercgnfHGeQol-vfV5SRcFXNBy5o/edit?usp=sharing

【问题讨论】:

  • 问题应该是自包含的。虽然欢迎使用外部链接,但请考虑添加一个 ascii 表,如(thisthis)或屏幕截图或 csv 文本(如 this)以显示您的数据结构。

标签: excel google-apps-script google-sheets google-sheets-formula


【解决方案1】:

有趣的查询。

B2,看看下面的公式是否适合你:

=TRANSPOSE(SPLIT(REGEXREPLACE(A2,"([^,]+,[^,]+),","$1|"),"|"))

如果需要,可以使正则表达式更具体地仅针对大括号之间的逗号。


编辑

SPLIT你想要的结果分成两列去掉我想出的大括号和外引号:

=TRANSPOSE({SPLIT(REGEXREPLACE(A2,"{""([^,]+)""},{""([^,]+)""}(?:,|$)","$1|"),"|");SPLIT(REGEXREPLACE(A2,"{""([^,]+)""},{""([^,]+)""}(?:,|$)","$2|"),"|")})

【讨论】:

  • 将此添加到 D2 =ARRAYFORMULA(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(C2:C="","",(split(C2:C,","))),"{",""),"}",""),"""","")) 感谢您的公式,我已将文本分开,但无法将其合并为一个公式。我想进一步操纵你的公式,但我不能。如果你有时间,请看我在 D2 中的尝试。
  • @maryongubo,我尽我的 GS 知识回答了这个问题。
  • 这就是我一直在寻找的公式,而您成功了!谢谢。
  • 此解决方案不允许在字符串中使用逗号。
【解决方案2】:

要调整ARRAYFORMULA 的解决方案,我们只需用逗号连接所有字符串。

关于以下解决方案的几点说明:

使用REGEXREPLACE,我们剥离了所有周围的{"..."}。同时,我们用"♠" 替换每个偶数逗号(不仅仅是每个逗号,而是记录之间的逗号,例如字符串中的逗号不会受到影响),以便稍后将对拆分为单独的字符串,并且我们将每个奇数逗号替换为替换为 "♥" 以便稍后将一对拆分为两个字符串。

=ARRAYFORMULA(
  SPLIT(
    TRANSPOSE(
      SPLIT(
        REGEXREPLACE(
          TEXTJOIN(
            ",",
            True,
            A2:A
          ),
          "\{""(.*?)""\},\{""(.*?)""\},?",
          "$1♥$2♠"
        ),
        "♠"
      )
    ),
    "♥"
  )
)

【讨论】:

  • 我正在处理的字符串不会有任何逗号,但我必须同意以上是一种安全的方式,以防万一。我偶然发现了另一个挑战。有些字符串没有匹配项,因此它们不会成对出现。我希望为不匹配的字符串添加一个空对。理想情况下,这对中的第一个将有一个介于 1-20 之间的数字,而第二个基本上是文本。示例 - {"This doesn't change":"2"},{"This doesn't change":"This changes"}, 但在某些情况下,这对中的第二个仅是 {"This doesn't change":"This changes"}。查看文档链接
  • @maryongubo 你能展示一下它的外观吗?
  • 虽然这可能是一个独特的案例,但我希望@kishkin 的回答可以对某人有所帮助。 =ARRAYFORMULA( SPLIT( TRANSPOSE( SPLIT( REGEXREPLACE( TEXTJOIN( ",", True, A2:A ), "(?:\{""yellow and red"":""(\d*)""\},)?\{""yellow and red"":""(.*?)""\},?", "$1♥$2♠" ), "♠" ) ), "♥", True, False ) )
  • 不得不使用[^"]:=ARRAYFORMULA( SPLIT( TRANSPOSE( SPLIT( REGEXREPLACE( TEXTJOIN( ",", True, A1:A ), "\{""[^""]*"":""([^""]*)""\},?(?:\{""[^""]*"":""(\d*)""\},?)?", "$1♥$2♠" ), "♠" ) ), "♥", True, False ) )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2017-12-24
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多