【问题标题】:Transforming several data points found in one column to multiple columns将一列中的多个数据点转换为多列
【发布时间】:2021-01-05 22:22:30
【问题描述】:

https://imgur.com/a/dgAkFNC

我的输入都在一列中。每个数据点包含的信息是从:,到:,主题:,消息:等。我想将数据点的这些不同信息分成几列。我做的第一部分是使用 textjoin 函数来组合一个数据点的所有信息。然后我使用 mid 函数将它们分成几列。

我的问题出现在两件事上:(1)输入中的主题部分和消息部分可以有几行/几行,但我需要将它们包含在输出的一个单元格中。 (2) 我们有几个数据点,所以如果有更简单/更快的方法来做到这一点,它也会有所帮助。我可以采取哪些最佳方法来解决这些问题,或者我可能会被引导到正确的方向来处理这些问题。这个问题在 Excel/Google 表格中更容易解决吗?

编辑:这是一个可重现的示例:https://docs.google.com/spreadsheets/d/10LoIjP5P0hshjrXuhTfpmhuafkvqZFvMBGJnJrTvejs/edit?usp=sharing

Edit2:我的 2 个代码用于生成我想要的结果,但仅用于第一个数据点。

=Textjoin(" ", TRUE, A1:A22,)
=MID(B5,SEARCH("FROM: ",B5)+LEN("FROM: "),SEARCH(" TEL#:",B5)-SEARCH("FROM: ",B5)-LEN("FROM: "))

有一件事我忘了提,每个数据点都以 (#)LogIn 开头

例如:第一个数据点以“(1)LogIn”开头 第二个数据点以“(2)Login”开头。虽然括号内的 # 不会是从 1 到 n,因为每天 # 都会再次从“1”开始,因为我的输出是结合几个月的数据

编辑3: 主题和消息内容都有可变的行数。它总是至少有 1 行,但没有最大行数(这将取决于消息的长度,但我认为平均约为 5 行)

【问题讨论】:

  • 你好。如果你这样做reprex 帮助会更快。
  • 谢谢你的建议,对不起,我还是新手
  • 请将您的代码发布到问题中。
  • 欢迎来到 StackOverFlow,请借此机会参加 tour 并学习如何使用 How to Askformat codeminimal reproducible exampleLearn More
  • 样本表中的 SUBJECT 可能包含 1 或 2 行; MESSAGE 可能包含 1、2 或 3 行/单元格。这对你的真实情况是真实的吗?换句话说,SUBJECT 会运行超过 2 行吗?或者 MESSAGE 会运行超过 3 行吗?

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


【解决方案1】:

我有一个不太优雅的解决方案给你。我不知道这是否只是为了自动提取一些现有的电子邮件,作为一次性举措,或者这是否旨在用于持续处理传入的电子邮件。但是请查看样本表中的GKOutput

我在 A:B 中使用了两个辅助列。 A 列通过搜索“(#) LOGIN:”字符串提取每封电子邮件的第一行号。

然后 B 列对每封电子邮件唯一的所有行进行文本连接。不幸的是,这必须向下拖动,但是如果你用数字填充它旁边的一列(使用 SEQUENCE(999,1) 来表示 999 是你想要的多行),那么你可以双击单元格的右下角将其填充到底部。

这是B5中的公式:

=IFERROR(ArrayFormula(
    textjoin("~",1,
      indirect(if(A5:A<>"","Input!A"&A5&":A"& if(A6:A>0,(A6:A-1),"")
    )))),"")

这使用输出列 A 中的行结果来设置每个 TEXTJOIN 的范围,将其限制为一封特定电子邮件的行(在输入中)。 A5 是第一封电子邮件的第一行,A6 是第二封电子邮件,依此类推。 INDIRECT 用于动态构建所需的范围,作为文本字符串,但这意味着ARRAYFORMULA 正在申请TEXTJOIN 以连接一封电子邮件(来自输入列A),因此也无法再次向下工作输出 A 列以对下一封电子邮件执行相同的操作。

然后单元格 C5:J5 具有提取公式,以解析每封电子邮件的长文本字符串。我假设您提供的示例数据在预期格式方面是精确的,例如。 “主题:”和“消息:”将出现在每封电子邮件中。如果没有,这些可能需要调整。

这是第一个公式,用于提取 LOGIN 日期时间:

=IFERROR(ARRAYFORMULA(REGEXEXTRACT(B5:B,"^\(\d*\)LOGIN TIME: ([0-9-AMP\s:]*)")),"")

这个是针对主题的:

=IFERROR(ARRAYFORMULA(SUBSTITUTE(REGEXEXTRACT(B5:B,".*~SUBJECT: (.*)~MESSAGE: "),"~"," ")),"")

公式分解: 它查看 B 列每一行的电子邮件字符串,从 B5 开始。它搜索以“~SUBJECT:”开头的字符串,然后收集直到但不包括“~MESSAGE:”的所有文本。然后它使用SUBSTITUTE 用空格替换任何剩余的“~”(来自任何多行主题)。它需要ARRAYFORMULA 自动处理所有 B 列。

请注意,可能需要进行大量清理。第一个辅助列可以合并到 B 列中执行 TEXTJOINS 的公式中。而且我很确定有一种方法可以为 B 列执行数组公式,但我想不出。文本拆分可以合并为一个公式,但我将其分开,以便更清楚每个 REGEX 的作用。

【讨论】:

  • 非常感谢您解释用于实现代码的步骤/公式!我对谷歌表格还是新手,不幸的是,谷歌表格和谷歌数据工作室是我最近刚被聘用的工作中使用的主要技术(我上周刚开始)。我在以前的角色中主要使用 SQL/Tableau,所以虽然我知道如何存储数据库以及如何存储数据/如何将其与 tableau 结合以进行可视化,但我必须加快了解如何使用 google sheet/data工作室,因为从数据存储到可视化的所有内容都将在 google sheet/data stud 中完成
  • 这个特殊的任务是我每天都会收到一个 pdf 文件的电子邮件,我所做的只是复制并粘贴信息,这样我就可以将其复制到我们的谷歌工作表文件中,并且很可能只是手动添加到这个主工作表因为每天只有 1-3 个文件。当我从 pdf 文件复制到 google 表格时,结果就像我提供的示例表格中的那个一样。
  • 虽然我了解论坛和逻辑,但在尝试处理工作表中的数据时,我并不了解所有功能、来龙去脉和策略。您使用了哪些资源/指南来开始学习并最终成为电子表格大师?
  • 我在 googlesheets reddit wiki 中查找了 Ben Collins 的 8 门课程,价格为 700 美元,我想知道这是否涵盖了我需要知道的所有内容,以及我最终能否自己熟练以此作为我的知识基础。 700 美元现在对我来说太多了,所以我想确保这一切都是我需要的,因为在那之后我将无法负担任何其他费用。
【解决方案2】:

我发现它很复杂,无法用几句话回答。

这是我的解决方案: https://docs.google.com/spreadsheets/d/10LoIjP5P0hshjrXuhTfpmhuafkvqZFvMBGJnJrTvejs/copy

首先我标记了文件的结尾,以便更容易找到最后一条消息的结尾。刚刚在消息列表下方添加了 ***EOF 单元格

然后我使用正则表达式匹配提取登录时间。我把它从右边截取了 18 个字符。查询在这里用于删除空行。

对于 TO: FROM 和其他单行单元格,我使用类似的方法(只需删除 TO: 等,使用替换:

然后我找出第一个 SUBJECT: 从哪里开始。我需要一个行号: SUBJECT 结尾也是如此(它是 MESSAGE: 开始的地方)。

要确定 MESSAGE: 结束的行号,我检查存储在 B 列或文件末尾的下一个 LOGIN TIME 的位置: 这是这样的:

然后提取多行 SUBJECT 和 MESSAGE 内容非常容易,我为此使用了 OFFSET 函数:

【讨论】:

  • 非常感谢您的详细回复以及您所采取的每一步的分步说明和解释。我目前正在尝试自己理解逻辑,并且我认为我正在掌握它,我将尝试在我的数据中与其他用户推荐的其他方式一起实施此步骤。看起来向我建议的两个实现都给出了正确的结果,所以我会看看哪个对我当前的数据集更有效,但我肯定会在未来以不同的方式使用这两种实现来处理不同的数据。
  • 另外,如果可能的话,我能从上面的类似回复中获得您的建议吗:我对谷歌表格还是新手,不幸的是,谷歌表格和谷歌数据工作室是我刚刚完成的工作中使用的主要技术最近被聘用(我上周刚开始)。我在以前的角色中主要使用 SQL/Tableau,所以虽然我知道如何存储数据库以及如何存储数据/如何将其与 tableau 结合以进行可视化,但我必须加快了解如何使用 google 表格/数据工作室,因为从数据存储到可视化的一切都将在谷歌表格/数据工作室中完成
  • 虽然我了解论坛和逻辑,但在尝试处理工作表中的数据时,我并不了解所有功能、来龙去脉和策略。您使用了哪些资源/指南来开始学习并最终成为电子表格大师?
  • 我在 googlesheets reddit wiki 中查找了 Ben Collins 的 8 门课程,价格为 700 美元,我想知道这是否涵盖了我需要知道的所有内容,以及我最终能否自己熟练以此作为我的知识基础。 700 美元现在对我来说太多了,所以我想确保这一切都是我需要的,因为在那之后我将无法负担任何其他费用
  • 您好,很高兴您喜欢我的解决方案。如果您对此表示赞赏,请将我的答案标记为有用(答案左上角的箭头)。我使用电子表格工作了几年。我没有完成任何课程。我只是使用谷歌表格帮助,有时我会在这里或网络上的任何地方搜索解决方案。
猜你喜欢
  • 2017-12-01
  • 2020-02-07
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2022-11-17
  • 2019-11-23
  • 2017-08-14
相关资源
最近更新 更多