2016-08-24 64 views
2

以下是這種情況:我試圖將2,089個JSON文件合併到一個JSON文件中。它們都位於名爲「貸方」的目錄中。gulp-merge-json:忽略輸入文件?

我已經嘗試了幾個Python腳本,但現在我想使用名爲gulp-merge-json的gulp模塊(現在推薦多於一次)。

我運行gulp任務,加載時間表明它真正處理所有2000多個文件(與我剛剛測試的3個工作相比);但是我的結果文件只包含來自單個文件的JSON數據。 Odder仍然(也許是對解決方案的一種暗示)是正在使用的文件標題爲999.json。這些文件全部命名爲x.json,其中1 < x < 2,090。

我沒有看到任何在數據中引起這個錯誤的東西。文件999在其他方面似乎並不特別,除了它顯然具有最高的總結標題值。

夠了;這裏是代碼:

gulp.src('/Users/me/Documents/lenders/*.json') 
.pipe(merge('combined.json')) 
.pipe(gulp.dest('/Users/me/Documents/LendersData')); 

把它放在一個具有所有正確安裝的依賴項的gulp文件中,並且它運行。簡單地說,這個過程(假設)使用json指定的glob來獲取貸方目錄中的所有文件,創建一個名爲LendersData的目錄,並將combined.json文件放入其中。

有沒有人有這種飲料模塊的經驗?我不知道爲什麼需要花費相當可觀的時間來運行任務,根據我輸入的數據量(以千兆字節爲單位)進行判斷,然後只留下999.json中的數據。謝謝!

編輯:我的3個JSON文件的測試不起作用。寫入輸出文件的1.json,2.json和3.json中唯一的文件是3.json。現在,這是一個指示器,只有腳本讀取的最後一個文件才被複制。在999.json的全部嘗試的情況下,如果以特定方式排序,那可能是列出的最後一個文件。我以爲我的glob會處理目錄中的每一個文件?

下面是的一個例子,我的意思是合併兩者。假設我們有兩個文件,1.json和2.json;

1.json:

{ 
    "header":{ 
     "total":2,"page":1,"date":"2016-08-01T17:29:57Z","page_size":1}, 
    "lenders": [ 
     {"lender_id":"matt","name":"Matt"} 
    ] 
} 

而且2.json:

{ 
    "header":{ 
     "total":2,"page":2,"date":"2016-08-01T17:30:57Z","page_size":1}, 
    "lenders": [ 
     {"lender_id":"sarah","name":"Sarah"} 
    ] 
} 

合併結果:

{ 
    "lenders": [ 
     {"lender_id":"matt","name":"Matt"}, 
     {"lender_id:"sarah","name":"Sarah"} 
    ] 
} 

(我知道彈出標題是一個額外的要求,但不這樣做會導致無效的JSON)

+0

我剛剛測試它,它適用於我(或至少我如何預期它)。雖然我不確定你想要什麼輸出。 「合併」是什麼意思?該gulp插件會覆蓋匹配鍵。例如,如果您有兩個JSON文件,第一個包含「{」值「:1」,第二個包含「{」值「:2}」,則合併它們的輸出將僅爲「{」值「: 2}'(因爲第二個替換了公共鍵「值」)。因此,如果所有的JSON輸入文件都具有_exactly_相同的鍵,則應該期望輸出與最後一個文件相同。 – MadScone

+0

如果你可以發佈'1.json'和'2.json'的例子以及期望的輸出,它應該更清楚你正在嘗試做什麼。 – MadScone

+0

感謝MadScone,這解釋了很多。所以讀取的最後一個文件是999.json,它在輸出數據中有最後的發言權。 我的意思是合併創建一個文件,其中包含所有1.json以及2.json作爲單個有效的JSON文件。 我意識到可能會進行進一步的編輯,例如彈出無關頭文件。但是,如果我合併2,089個json文件,那麼我的意思是我希望將他們所有的個人數據整理到一個源文件中。我有更多的想法來處理這個單獨的文件(把它變成一個SQL文件)。 感謝您的迴應! – Typhon

回答

0

根據您的上次更新進行編輯。這應該做到這一點:

var gulp = require('gulp'); 
var combine = require('gulp-jsoncombine'); 

function combineFiles (files) { 

    var lenders = []; 
    for (var file in files) { 
     if (files.hasOwnProperty(file) && files[file].hasOwnProperty('lenders')) { 
     lenders.push(files[file].lenders); 
     } 
    } 

    var result = {lenders: [].concat.apply([], lenders)}; 
    return new Buffer(JSON.stringify(result)); 
} 

gulp.task('default', function() { 

    return gulp.src('lenders/*.json') 
     .pipe(combine('combined.json', combineFiles)) 
     .pipe(gulp.dest('LendersData')); 

});