2015-02-07 117 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等),併爲每個條目創建一個文件,以便將條目與單個文件連接起來。這樣你只需要搜索這些小文件而不是整個堆。

我還沒有檢查過,但有些條目可能有多個出現(例如:你可能會發現幾個人叫史密斯),所以簡單的元組很可能不會這樣做。

相關問題