2015-02-07 53 views
0

我有一个巨大的json文件保存在本地,围绕700MB。我无法处理它。将一个巨大的json文件分解成单独的文件

是否有可能将其分成10个单独的文件夹,但每个文件都有一个完整的JSON注意有一个JSON有一个文件的前一半,另一个到下一个?

+0

这部分有点令人困惑......“每个文件都有一个完整的json记录,json有一个文件的前半部分,另一个文件到下一个文件”。你可以补口吗?此外,文件的结构和你想要做的事情一旦分裂,可能会发挥怎样的作用,或者它是否可以分裂。 – 2015-02-07 16:28:55

+0

@DerekMcCraeNorton感谢您的评论。这里是我尝试脱离http://werobots.io/wp-content/uploads/2014/08/Kickstarter_Kickstarter.json_.zip的文件,如果你打开它,你必须从开始和结束删除一些行,因为它是清楚的JSON,如果你不删除他们 – user3456789 2015-02-07 16:36:10

+0

当然,我可以reword:我的意思是,JSON有一个结构,当我试图根据线或体积来分离我的文件时,JSON例如可能有6个值并将其分开3值转到第一个文件,其他3转到第二个文件,这样json就会丢失全部信息。 – user3456789 2015-02-07 16:38:35

回答

1

JSON文件的结构允许进行简单的切片:它包含几个“项目”块(确切地说是7097)。这些“项目”是最高级别,并且包含不同数量的单个项目。

在这些接缝线处撕开大文件是相当容易的,有几行Perl会这样做(Perl因为它可用于多种操作系统并且很容易处理大文件):

#!/usr/bin/perl 
use strict; 
my $flag = 0; 
my $count = 0; 
my $start = "Kickstarter_Kickstarter_"; 
my $ending = "_.jison"; 
my $filename = ""; 
open (FILE, '<', 'Kickstarter_Kickstarter.json') 
         or die "file opening failed: $!"; 
while (<FILE>) { 
    if (/"projects": \[/){ 
     if($flag == 0){ 
      $flag = 1; 
      $filename = $start.$count.$ending; 
     open (CHUNK, '>>', $filename) 
        or die "file opening failed: $!"; 
     print STDOUT "Writing a chunk to ".$filename."\n"; 
     $count++; 
     print CHUNK "{ ".$_; 
     next; 
     } 
    if ($flag == 1){ 
      close (CHUNK) or die "file closing failed: $!"; 
      $flag = 0; 
     } 
    } 
    if(tell(CHUNK) != -1){ 
     print CHUNK $_ unless /^\,{/; 
    } 

close (FILE) or die "file closing failed: $!"; 

(只会工作,为这个特定的文件!)

这将会把每这些“项目”块的变成自己的,编号的文件。你可以用它来做你想做的事情(例如把它们放到十个文件夹中),但我会建议使用你最熟悉的JSON解析器并为这些文件建立索引,即:选择一个或多个条目(例如:id,名称,目标,created_it等),并为每个条目创建一个文件,以便将条目与单个文件连接起来。这样你只需要搜索这些小文件而不是整个堆。

我还没有检查过,但有些条目可能有多个出现(例如:你可能会发现几个人叫史密斯),所以简单的元组很可能不会这样做。

相关问题