Google 工作表 - 转置和查询
Google Sheets - Transpose & Query
我们有一个比较大的数据集,在下面的“当前格式”中大约有 26K 行和 24 列。但是,我们正在尝试将其重新格式化为下面所需的格式。我认为我们可能只需要 Transpose 和 Query 来实现这一点,但我们对任何实现它的方法持开放态度。
如有任何关于如何重新格式化的建议,我们将不胜感激。
JAK,要处理的数据很多。在没有访问实际 sheet 和数据的情况下尝试编写公式总是很困难。也就是说,SPLIT/JOIN combos 会超过那么多数据的字符限制。但从理论上讲,以下公式可行(假设您的实际数据是示例的扩展并从 A1:Y.
运行
=ArrayFormula({"ID","Value","Qty"; QUERY({VLOOKUP(MOD(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)-1,COUNTA(A:A))+2,{ROW(A:A),A:A},2),HLOOKUP(ROUNDUP(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)/COUNTA(A:A))+1,{COLUMN(A1:Y1);A1:Y1},2),
VLOOKUP(MOD(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1,2)-2,COUNTA(A:A))+2,{ROW(A2:A),B2:Y},ROUNDUP(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)/COUNTA(A:A))+1)
},"SELECT Col1, Col2, Col3 WHERE Col3 IS NOT NULL ORDER BY Col1 Asc")})
如果您想在单独的 sheet 中进行设置,则需要编辑整个公式中的每个范围,以包含原始数据所在的 sheet 的名称.
有关此公式的更多基础和解释:https://www.benlcollins.com/spreadsheets/unpivot-in-google-sheets
使用:
=ARRAYFORMULA({"ID", "Value", "Qty";
IFERROR(SPLIT(FLATTEN(IF(B3:D="",,A3:A&"♦"&B2:D2&"♦"&B3:D)), "♦"))})
您可以尝试下载 .csv 格式的 sheet 并制作一个程序来读取数据并进行必要的更改,不确定您是否熟悉编程......有几种语言可以用来实现这一点,我已经在 C 中做过类似的事情。它不是很难。
您可以打开文件、读取数据、处理更改并保存在另一个 .csv 中。请记住,csv 文件只是一个用逗号分隔的 .txt 文件。
int main(int argc, char** argv) {
FILE *file;
FILE *file2;
char Linha[100];
char *result;
int i;
file = fopen("YourSheet.csv", "rt");
file2 = fopen("YourNewSheet.csv", "w");
i = 1;
while (!feof(file))
{
// reads a line
result = fgets(Linha, 100, file);
if (result)
fprintf(file2, "%s", result);
i++;
}
fclose(file);
fclose(file2);
return 0;
}
原来可以这么简单,我们也可以使用google查询SQL特征:
Excel Table:
A B
1 Qty | 200
2 Stock | QUESS
3 Start | 8/24/2019
4 End | 8/23/2020
5 Today | 8/23/2021
公式:
=query(Transpose(Sheet6!A1:B5),"select *" )
输出:
Qty | Stock | Start | End | Today
200 | QUESS | 8/24/2019 | 8/23/2020 | 8/23/2021
我们有一个比较大的数据集,在下面的“当前格式”中大约有 26K 行和 24 列。但是,我们正在尝试将其重新格式化为下面所需的格式。我认为我们可能只需要 Transpose 和 Query 来实现这一点,但我们对任何实现它的方法持开放态度。
如有任何关于如何重新格式化的建议,我们将不胜感激。
JAK,要处理的数据很多。在没有访问实际 sheet 和数据的情况下尝试编写公式总是很困难。也就是说,SPLIT/JOIN combos 会超过那么多数据的字符限制。但从理论上讲,以下公式可行(假设您的实际数据是示例的扩展并从 A1:Y.
运行=ArrayFormula({"ID","Value","Qty"; QUERY({VLOOKUP(MOD(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)-1,COUNTA(A:A))+2,{ROW(A:A),A:A},2),HLOOKUP(ROUNDUP(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)/COUNTA(A:A))+1,{COLUMN(A1:Y1);A1:Y1},2),
VLOOKUP(MOD(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1,2)-2,COUNTA(A:A))+2,{ROW(A2:A),B2:Y},ROUNDUP(SEQUENCE(COUNTA(A:A)*COUNTA(A1:Y1),1)/COUNTA(A:A))+1)
},"SELECT Col1, Col2, Col3 WHERE Col3 IS NOT NULL ORDER BY Col1 Asc")})
如果您想在单独的 sheet 中进行设置,则需要编辑整个公式中的每个范围,以包含原始数据所在的 sheet 的名称.
有关此公式的更多基础和解释:https://www.benlcollins.com/spreadsheets/unpivot-in-google-sheets
使用:
=ARRAYFORMULA({"ID", "Value", "Qty";
IFERROR(SPLIT(FLATTEN(IF(B3:D="",,A3:A&"♦"&B2:D2&"♦"&B3:D)), "♦"))})
您可以尝试下载 .csv 格式的 sheet 并制作一个程序来读取数据并进行必要的更改,不确定您是否熟悉编程......有几种语言可以用来实现这一点,我已经在 C 中做过类似的事情。它不是很难。 您可以打开文件、读取数据、处理更改并保存在另一个 .csv 中。请记住,csv 文件只是一个用逗号分隔的 .txt 文件。
int main(int argc, char** argv) {
FILE *file;
FILE *file2;
char Linha[100];
char *result;
int i;
file = fopen("YourSheet.csv", "rt");
file2 = fopen("YourNewSheet.csv", "w");
i = 1;
while (!feof(file))
{
// reads a line
result = fgets(Linha, 100, file);
if (result)
fprintf(file2, "%s", result);
i++;
}
fclose(file);
fclose(file2);
return 0;
}
原来可以这么简单,我们也可以使用google查询SQL特征:
Excel Table:
A B
1 Qty | 200
2 Stock | QUESS
3 Start | 8/24/2019
4 End | 8/23/2020
5 Today | 8/23/2021
公式:
=query(Transpose(Sheet6!A1:B5),"select *" )
输出:
Qty | Stock | Start | End | Today
200 | QUESS | 8/24/2019 | 8/23/2020 | 8/23/2021