0

我有很多 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 或类似的程序?

4

3 回答 3

1

幸运的是,这种格式的日期可以作为字符串进行比较。你只需要一些东西来解析 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。如果您有JSON::XSCpanel::JSON::XS,则可以切换到它们以加快处理速度。

为了让解析器满意,我必须修复输入(替换'为、添加逗号等)。"

于 2018-08-06T11:52:35.127 回答
1

单行完成该任务,例如:

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
于 2018-09-14T16:17:50.313 回答
-2

试试这样:

  1. 查找在线转换器。(例如:https://codebeautify.org/json-to-excel-converter#)并将 Json 转换为 CSV

  2. 使用 Excel 打开 CSV 文件

  3. 过滤您的数据

于 2018-08-06T11:47:47.273 回答