准备一个 csv 文件,将一个单元格中的数据拆分为多行以获取数百条记录

Preparing a csv file splitting data in one cell into multiple lines for hundreds of records

我从系统中提取了一个 .csv 数据,该数据以下列格式设置,无法更改提取内容,但我想在将数据加载到 Google [=42 之前转换数据=]、MS Access 数据库或 SQL 服务器数据库。很可能 Google Sheets 将用作概念证明,生产元素位于 SQL 服务器数据库中。

id 07/02/2022 08/02/2022 09/02/2022 10/02/2022 11/02/2022
1 / \ / \ M \ / \ / \
2 / \ / \ M \ / \ / \
3 I02 I02 / \ I02 I02 U \ U \
4 I01 M M M / \ / \ / \
5 / \ / \ / \ / \ / \

每一列的第一个标记是上午标记,最后一个标记是下午标记。即对于 04/02/2022 的记录 3,AM 标记为 U,PM 标记为 \

该文件每周将超过 300 行,因此最终文件应包含大约 1500 行(300 行 x 每周 5 天)

每个结果单元格将始终有两个值记录在每个单元格中,由 space 分隔,即 /[space]\ 或 M[space]\ 将提取数据每周一次,headers 列的日期 link 到一周中的某一天,周一到周五。

为了在管道中进一步进行数据分析,我需要拆分数据,所以我最终得到类似下面的内容(仅复制我的主数据的前两行):

Primary ID id Date Period Mark
1 1 07/02/2022 AM /
2 1 07/02/2022 PM |
3 1 08/02/2022 AM /
4 1 08/02/2022 PM |
5 1 09/02/2022 AM M
6 1 09/02/2022 PM |
7 1 10/02/2022 AM /
8 1 10/02/2022 PM |
9 1 11/02/2022 AM /
10 1 11/02/2022 PM |
11 2 07/02/2022 AM /
12 2 07/02/2022 PM |
13 2 08/02/2022 AM /
14 2 08/02/2022 PM |
15 2 09/02/2022 AM M
16 2 09/02/2022 PM |
17 2 10/02/2022 AM /
18 2 10/02/2022 PM |
19 2 11/02/2022 AM /
20 2 11/02/2022 PM |

我按照本主题中的说明使用查询、拆分和展平的数组公式生成以下输出

使用这个公式:

=ARRAYFORMULA(QUERY({"Student", "Date","Mark"; IFERROR(SPLIT(FLATTEN(IF(Master!A2:T="",,Master!A2:A&"♦"&Master!I1:M1&"♦"&Master!I2:M)), "♦"))}, "where Col1 > 0", 1))
id Date Mark
1 07/02/2022 /|
1 08/02/2022 /|
1 09/02/2022 M|

我遇到的问题是尝试为 AM/PM 元素创建重复行。它本身作为一个元素存在,只能通过文本元素在单元格中的位置来归属(第一个元素 AM,第二个元素 PM)

Here is a shared sheet 以及您的问题的可能解决方案。

它使用 SPLIT()/FLATTEN() 技术,但您需要一个嵌套版本才能使其与您的布局一起使用。

这是完整的公式,但这个示例更容易理解,并且会无限期保留。使用一个公式(包括 headers)完成所有操作并不重要,因为这是概念验证。

=ARRAYFORMULA(QUERY(IFERROR(SPLIT(FLATTEN(FLATTEN(OP.Data!A2:A100&"|"&OP.Data!B1:1&"|")&{"AM|","PM|"}&SPLIT(FLATTEN(OP.Data!B2:100)," ")),"|",0,0)),"where Col1 is not null and Col2 is not null"))