将大型的JSON文件拆分,并设置输出文件的名称。

2024-09-30 20:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

一个JSON文件中有12000行以上的对象:

{
     "System": "2334", 
     "Id": "AP64531346-2016055553824", 
     "dtis": "106165099", 
     "Type": "Up",
     ... (in total, 112 lines per record)
}
{
     "System": "873", 
     "Id": "AP24531346-20160676553824", 
     "dtis": "1261699", 
     "Type": "Up",
     ... (in total, 112 lines per record)
}

我想把大文件分成小文件,每个小文件有一个入口(112行),并将每个文件的名称设置为“Id”的值,我的意思是分别以AP64531346-201605553824.txt和AP24531346-20160676553824为例。在

我尝试了GNU分割,但无法将每个文件的名称设置为Id plus.txt。在

^{pr2}$

有什么建议吗?在


Tags: 文件intxt名称idtyperecordsystem
3条回答

分两个步骤:首先使用

split -l 112 ../bigfile.csv

现在有了名为xaaxab等的文件,我假设这些是目录中唯一的文件。现在可以循环它们,提取Id并重命名它们:

^{pr2}$

grep -o只提取匹配项,并使用零宽度的“look-behind”来获取Id行。仅当使用Perl regex引擎(-P)时,才可以使用环顾。-m 1在第一个匹配之后停止,这样当您知道第一个匹配足够好时,就不会遍历整个文件。在

当每个块没有112行时,这当然会严重中断,因为proper solution会解析文件。

听起来好像您希望将每个JSON文档放在自己的文件中。您可以使用JSON::XS的增量解析器来实现这一点。在

use JSON::XS qw( );

my $json = JSON::XS->utf8->new();

local $/ = \(1024*1024)
while (<>) {
   for my $obj ($json->incr_parse($_)) {
      my $id = $obj->{Id};
      open(my $fh, '>', $id . ".txt")
         or die $!;
      print($fh $json->encode($obj));
   }
}

任务的一般方法(即不假设输入文件中的JSON实体流,只假设它们是有效的JSON实体)如以下“一行代码”所示:

jq -cr '"\(.Id)\t\(.)"' | awk -F\\t '{print $2 > "/tmp/"$1".json"}'

这使用“JSON query”(jq)命令行处理器,这在许多平台上都可用。在

如果您希望每个新文件都能很好地打印出来,那么您也可以在第二步中使用jq,例如:

^{pr2}$

相关问题 更多 >