解析多个文件以在gulp

时间:2015-09-11 15:01:17

标签: javascript node.js gulp

在gulp中,我有多个文件可以解析为对象数组;然后我想将所有这些数组合并为一个,并根据组合数组输出单个文件。

file1 parsed into array1
file2 parsed into array2
file3 parsed into array3
combinedArray = array1 + array2 + array3
combinedArray used to generate outputFile

我不确定如何使用gulp将三个数组合并为一个数组 - 我想我想减少或折叠流元素。

鉴于这些功能,你会怎么写呢?

  • parseFile(file)返回数据对象数组
  • createFile(objects)从数据对象数组中生成文件对象

我确信这很简单,但我不会猜测正确的搜索条件来找到答案。对节点不太熟悉......

这个问题的一个人为例子就是有几个文件充满了名字;从每个文件中提取以“B”开头的名称;然后输出以“B”开头的以字母为单位,重复数据删除的名称列表。因此,它不仅仅是文件的连接,它将解析为数据结构并将数据结构合并为一个,然后根据组合输出文件。

2 个答案:

答案 0 :(得分:1)

你必须进入一些有趣的插件...... 我在下面实现了您的“B-names”要求:

在第一步中,我将每个输入文件的内容转换为一个JSON字符串,其中所有“B”名称都作为键,“true”作为值(像Set一样工作,消除了重复)。

在第二步中,我将所有文件“缩减”为一个文件。 (这有点像函数式编程中的“减少”)。每个文件的内容从JSON转换回对象,并且所有键都合并到一个最终对象中(同样消除了文件之间的重复)。 “reduce”中的最后一步将它们从最终对象中拉出来,对它们进行排序,然后将它们全部放入一个名为“b_names”的文件中。

(此代码为Coffeescript)

gulp = require 'gulp'
transform  = (require 'gulp-insert').transform
reduce_file = require 'gulp-reduce-file'

gulp.task 'parse_and_merge', ->
    gulp.src 'names*', cwd:'./input'
        .pipe transform (contents,file)->
            b_names = {}
            for b_name in contents.match /B\w+/igm
                b_names[b_name] = true
            return JSON.stringify b_names
        .pipe gulp.dest 'output' # not required, but maybe informative
        .pipe reduce_file 'b_names',
        (file,memo)->
            this_nameset = JSON.parse(file.contents)
            for key,val of this_nameset
                memo[key] = true
            return memo
        ,(memo)->
            b_names = Object.keys(memo)
            b_names.sort()
            return b_names.join('\n')
        ,{}
        .pipe gulp.dest 'output'



names1:
  John
  Bob
  Charles

names2:
  Joe
  Buster
  Michael

names3:
  Jacob
  Barack
  Keith
  Bob
  Bob

b_names:
  Barack
  Bob
  Buster

答案 1 :(得分:0)

这是我到目前为止所提出的问题,但如果有人能提供更好的答案,我很高兴接受它。感谢Arnelle Balane指向事件流的指针。

es = require "event-stream"
reduce = require "stream-reduce"

asyncParseFile = (file, callback) ->
  stuff = parseFile(file)
  callback(null, stuff)

asyncCreateFile = (stuff, callback) ->
  file = createFile(stuff)
  callback(null, file)

gulp.src myfiles
 .pipe(es.map(asyncParseFile))
 .pipe(reduce(arrayConcat, []))
 .pipe(es.map(asyncCreateFile))
 .pipe(savefile())