我有一个很大的数据表,我想将其转换为 json,并且不确定像 jq、mlr 或类似的工具是否能够执行这样的任务,而不必求助于我糟糕的 awk 技能。
样本表:
Balance_sheet for AAPL:
2023-09-30 2022-09-30 2021-09-30 2020-09-30
Treasury Shares Number 0.0 NaN NaN NaN
Ordinary Shares Number 15550061000.0 15943425000.0 16426786000.0 16976763000.0
首选输出:
{
"Balance_sheet for AAPL": {
"Treasury Shares Number": {
"2023-09-30": "0.0",
"2022-09-30": "NaN",
"2021-09-30": "NaN",
"2020-09-30": "NaN"
},
"Ordinary Shares Number": {
"2023-09-30": "15550061000.0",
"2022-09-30": "15943425000.0",
"2021-09-30": "16426786000.0",
"2020-09-30": "16976763000.0"
}
}
}
以下格式也可以使用,但不太理想:
{
"Balance_sheet for AAPL": {
"2023-09-30": {
"Treasury Shares Number": "0.0",
"Ordinary Shares Number": "15550061000.0"
},
"2022-09-30": {
"Treasury Shares Number": "NaN",
"Ordinary Shares Number": "15943425000.0"
},
"2021-09-30": {
"Treasury Shares Number": "NaN",
"Ordinary Shares Number": "16426786000.0"
},
"2020-09-30": {
"Treasury Shares Number": "NaN",
"Ordinary Shares Number": "16976763000.0"
}
}
}
有谁知道完成此任务的明智方法?
我会用
perl
:请注意,由于 JSON 对象是 perl 关联数组的表示,因此其中成员的顺序将是随机的。
canonical
您可以通过设置标志 ( )来获得一致的顺序JSON::PP->new->pretty->canonical->encode(\%j)
,其中每个对象的成员都按键排序。如果 JSON 对象中的字段顺序反映表中的顺序很重要(如 中所述)
perldoc JSON::PP
,您可以将这些数组与不同类型的哈希绑定,以使用类似的方法来保留顺序Tie::Hash::Indexed
(libtie-hash-indexed-perl
Debian 软件包)是提供有序哈希的几个此类模块之一。如果这很重要,则对于更接近您期望的格式(具有 4 个空格缩进并且 s 之后但不是之前的空格)的格式,
:
请替换pretty
为indent->indent_length(4)->space_after
(indent_length(2)
forjq
-style Pretty-printing)。使用任何 POSIX awk:
如果您需要处理多个“资产负债表”块,那么只需添加以下内容:
紧接该
sub()
行下方,例如给出以下输入:这个脚本:
将产生以下输出:
使用Raku(以前称为 Perl_6)
上面是用 Raku(Perl 编程语言家族的成员)编写的答案。鉴于OP发布的“资产负债表”测试文件有限,“预处理”表也相应受到限制,并且可能是定制的。因此,用于将数据整理为标准格式的前几行代码应被解释为赋予 Raku 语言的“风味”,而不是代表处理所有“资产负债表”的方法。
JSON::Fast
在命令行上加载。$a
标量,trim
-ming 去掉尾随空格。slurp
将文件的剩余部分放入内存中, b )。在前面添加"Date"
字符串 c )。将所有内容分解为lines
, d )。每个都line
被map
输入,以便:e )。subst
它% " "
由单字符空格分隔字母(在替换部分中,空格trans
替换为_
下划线,从而纠正行标签)。然后最后f )。数据根据剩余的\s+
空白进行分割,并且该表存储在@a
数组中。@a
表[Z]
经过“zip”转换,使得行变成列,反之亦然(参见下面的示例)。%h
声明了一个哈希值。%()
创建包含键值对的匿名哈希,每对都以日期(行标签)作为每个相应数据列数值的键(此处,索引删除“标签”配对)。b ). 添加另一个级别,适当的“共享”标签成为匿名哈希值的关键。转换为键/值的“共享”列被编辑为哈希值。[1..*]
%()
append
%h
$a
添加回,并且转换此(现在是多级)最终散列表,添加命名参数,然后输出。%h
to-json()
:sorted-keys
put
输入示例:
转换后的示例输入表
[Z]
(减去“Balance_Sheet”标题行):最终
JSON
输出:https://raku.land/cpan:TIMOTIMO/JSON::Fast
https://docs.raku.org/language/hashmap
https://docs.raku.org/
https://raku.org