准备一个 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"))
我从系统中提取了一个 .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"))