根据日期字段从特定时间间隔获取 JSON 个文件
Get JSON files from particular interval based on date field
我有很多 json 文件,其结构如下所示:
{
key1: 'val1'
key2: {
'key21': 'someval1',
'key22': 'someval2',
'key23': 'someval3',
'date': '2018-07-31T01:30:30Z',
'key25': 'someval4'
}
key3: []
... some other objects
}
我的目标是仅获取日期字段来自某个时期的这些文件。
例如从 2018-05-20 到 2018-07-20。
我不能根据创建这些文件的日期,因为所有这些都是在一天内生成的。
也许可以使用 sed 或类似程序?
这样试试:
查找在线转换器。 (例如:https://codebeautify.org/json-to-excel-converter#)并将 Json 转换为 CSV
用 Excel 打开 CSV 文件
过滤您的数据
幸运的是,这种格式的日期可以作为字符串进行比较。您只需要一些东西来解析 JSON,例如Perl:
perl -l -0777 -MJSON::PP -ne '
$date = decode_json($_)->{key2}{date};
print $ARGV if $date gt "2018-07-01T00:00:00Z";
' *.json
-0777
使 perl 吞噬整个文件而不是逐行读取它们
-l
向 print
添加换行符
$ARGV
包含当前处理文件的名称
参见 JSON::PP for details. If you have JSON::XS or Cpanel::JSON::XS,您可以切换到它们以加快处理速度。
我必须修复输入(将 '
替换为 "
,添加逗号等)以使解析器满意。
如果您的文件实际上包含有效的 JSON,则可以使用 jq 在一行中完成任务,例如:
jq 'if .key2.date[0:10] | (. >= "2018-05-20" and . <= "2018-07-31") then input_filename else empty end' *.json
这只是一个例子。 jq 有日期处理函数来处理更复杂的需求。
处理准JSON
如果您的文件包含准JSON,那么您可以将jq 与JSON 整流器结合使用。如果您的样本具有代表性,那么 hjson
可以使用,例如
for f in *.qjson
do
hjson -j $f | jq --arg f "$f" '
if .key2.date[0:7] == "2018-07" then $f else empty end'
done
我有很多 json 文件,其结构如下所示:
{
key1: 'val1'
key2: {
'key21': 'someval1',
'key22': 'someval2',
'key23': 'someval3',
'date': '2018-07-31T01:30:30Z',
'key25': 'someval4'
}
key3: []
... some other objects
}
我的目标是仅获取日期字段来自某个时期的这些文件。 例如从 2018-05-20 到 2018-07-20。 我不能根据创建这些文件的日期,因为所有这些都是在一天内生成的。 也许可以使用 sed 或类似程序?
这样试试:
查找在线转换器。 (例如:https://codebeautify.org/json-to-excel-converter#)并将 Json 转换为 CSV
用 Excel 打开 CSV 文件
过滤您的数据
幸运的是,这种格式的日期可以作为字符串进行比较。您只需要一些东西来解析 JSON,例如Perl:
perl -l -0777 -MJSON::PP -ne '
$date = decode_json($_)->{key2}{date};
print $ARGV if $date gt "2018-07-01T00:00:00Z";
' *.json
-0777
使 perl 吞噬整个文件而不是逐行读取它们-l
向print
添加换行符
$ARGV
包含当前处理文件的名称
参见 JSON::PP for details. If you have JSON::XS or Cpanel::JSON::XS,您可以切换到它们以加快处理速度。
我必须修复输入(将 '
替换为 "
,添加逗号等)以使解析器满意。
如果您的文件实际上包含有效的 JSON,则可以使用 jq 在一行中完成任务,例如:
jq 'if .key2.date[0:10] | (. >= "2018-05-20" and . <= "2018-07-31") then input_filename else empty end' *.json
这只是一个例子。 jq 有日期处理函数来处理更复杂的需求。
处理准JSON
如果您的文件包含准JSON,那么您可以将jq 与JSON 整流器结合使用。如果您的样本具有代表性,那么 hjson 可以使用,例如
for f in *.qjson
do
hjson -j $f | jq --arg f "$f" '
if .key2.date[0:7] == "2018-07" then $f else empty end'
done