2017-01-06 3 views
-1

У меня есть файл с слишком много объектов данных в формате JSON следующего вида:Сплит JSON файла объекты в несколько файлов

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "type": "Feature", 
     "properties": {}, 
     "geometry": { 
     "type": "Polygon", 
     "coordinates": [ 
      [ 
      [ 
       -37.880859375, 
       78.81903553711727 
      ], 
      [ 
       -42.01171875, 
       78.31385955743478 
      ], 
      [ 
       -37.6171875, 
       78.06198918665974 
      ], 
      [ 
       -37.880859375, 
       78.81903553711727 
      ] 
      ] 
     ] 
     } 
    }, 
    { 
     "type": "Feature", 
     "properties": {}, 
     "geometry": { 
     "type": "Polygon", 
     "coordinates": [ 
      [ 
      [ 
       -37.6171875, 
       78.07107600956168 
      ], 
      [ 
       -35.48583984375, 
       78.42019327591201 
      ], 
      [ 
       -37.880859375, 
       78.81903553711727 
      ], 
      [ 
       -37.6171875, 
       78.07107600956168 
      ] 
      ] 
     ] 
     } 
    } 
    ] 
} 

Я хотел бы разделить большой файл таким образом, что каждый из особенностей объекта будет иметь свой собственный файл, содержащий объект своего типа и объект (координаты). По сути, я пытаюсь получить многие из них:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "type": "Feature", 
     "properties": {}, 
     "geometry": { 
     "type": "Polygon", 
     "coordinates": [ 
      [ 
      [ 
       -37.6171875, 
       78.07107600956168 
      ], 
      [ 
       -35.48583984375, 
       78.42019327591201 
      ], 
      [ 
       -37.880859375, 
       78.81903553711727 
      ], 
      [ 
       -37.6171875, 
       78.07107600956168 
      ] 
      ] 
     ] 
     } 
    } 
    ] 
} 
+0

Вы дали свою цель, но то, что вы просите? Точный JavaScipt для этого? – drkibitz

+0

Что со всеми случайными тегами ... они должны использоваться, чтобы сузить решения ... выбрать что-то ... –

ответ

0

Я не проверял этот код должным образом. Но должен предоставить вам некоторое представление о том, как вы можете решить эту проблему, упомянутую выше

var json = { 
 
     "type": "FeatureCollection", 
 
     "features": [ 
 
      { 
 
      "type": "Feature", 
 
      "properties": {}, 
 
      "geometry": { 
 
       "type": "Polygon", 
 
       "coordinates": [ 
 
       [ 
 
        [ 
 
        -37.880859375, 
 
        78.81903553711727 
 
        ], 
 
        [ 
 
        -42.01171875, 
 
        78.31385955743478 
 
        ], 
 
        [ 
 
        -37.6171875, 
 
        78.06198918665974 
 
        ], 
 
        [ 
 
        -37.880859375, 
 
        78.81903553711727 
 
        ] 
 
       ] 
 
       ] 
 
      } 
 
      }, 
 
      { 
 
      "type": "Feature", 
 
      "properties": {}, 
 
      "geometry": { 
 
       "type": "Polygon", 
 
       "coordinates": [ 
 
       [ 
 
        [ 
 
        -37.6171875, 
 
        78.07107600956168 
 
        ], 
 
        [ 
 
        -35.48583984375, 
 
        78.42019327591201 
 
        ], 
 
        [ 
 
        -37.880859375, 
 
        78.81903553711727 
 
        ], 
 
        [ 
 
        -37.6171875, 
 
        78.07107600956168 
 
        ] 
 
       ] 
 
       ] 
 
      } 
 
      } 
 
     ] 
 
     } 
 
     $(document).ready(function(){ 
 
     var counter = 1; 
 
     json.features.forEach(function(feature){ 
 
      var data = {type: json.type, features: [feature]} 
 
      var newJson = JSON.stringify(data); 
 
      var blob = new Blob([newJson], {type: "application/json"}); 
 
      var url = URL.createObjectURL(blob); 
 
      var a = document.createElement('a'); 
 
      a.download = "feature_" + counter + ".json"; 
 
      a.href  = url; 
 
      a.textContent = "Download feature_" + counter + ".json"; 
 
      counter++; 
 
      document.getElementById('feature').appendChild(a); 
 
      document.getElementById('feature').appendChild(document.createElement('br')); 
 
     }); 
 
     });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="feature"></div>

0

Вот решение требует только один вызов jq и один из awk, предполагая, что вход находится в файле (input.json) и о том, что N-й компонент должен быть записан в файл /tmp/file$N.json, начиная с N = 1:

jq -c '.features = (.features[] | [.]) ' input.json | 
    awk '{ print > "/tmp/file" NR ".json"}' 

альтернатива awk здесь будет split -l 1.

Если вы хотите, чтобы каждый из выходных файлов, чтобы быть «довольно отпечатанных», затем с помощью оболочки, такие как Баш, вы могли бы (за счет п дополнительных вызовов JQ) пишут:

N=0 
jq -c '.features = (.features[] | [.])' input.json | 
    while read -r json ; do 
    N=$((N+1)) 
    jq . <<< "$json" > "/tmp/file${N}.json" 
done 

Каждый из дополнительных вызовов jq будет быстрым, поэтому это может быть приемлемым.

0

решения PowerShell (требуется PowerShell v3 или более новая версия):

$i = 0 
Get-Content 'C:\path\to\input.json' -Raw | 
    ConvertFrom-Json | 
    Select-Object -Expand features | 
    ForEach-Object { 
    $filename = 'C:\path\to\feature{0:d5}.json' -f ($i++) 

    $properties = [ordered]@{ 
     type  = 'FeatureCollection' 
     features = $_ 
    } 

    New-Object -Type PSObject -Property $properties | 
     ConvertTo-Json -Depth 10 | 
     Set-Content $filename 
    }