2016-10-13 82 views
0

我解析一堆csv文件與節點使用node-csv。我有數百個需要解析的文件,但是,我需要爲每個文件添加一個標題行,以便使用解析器中的'columns'選項。 columns選項將每一行解析爲一個對象,並將標題行用作對象鍵,但是爲了使此選項起作用,您當然需要標題行。如何使用node-csv將標題行添加到CSV文件?

通過查看文檔,我的直覺告訴我我應該能夠通過添加行的轉換函數來管道節點流,但是我很難在不改變現有數據的情況下進行這項工作。文件。

這是我在想什麼,但我該如何寫一行到'零'列?

let createStream = function() { 
    let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'}); 
    let parser = csv.parse({columns: true}); 
    let transform = csv.transform(function(record, doneTransform){ 
          //check if first zero row, 
          //Add header column. 
          doneTransform(); 
        }); 
    return stream.pipe(transform).pipe(parser); 
}; 

    createStream().on('data', function(transaction){ 
     //do stuff with object data 
    }); 

回答

2

真正的解決方案:

let createStream = function() { 
    let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'}); 
    let parser = csv.parse({skip_empty_lines: false, auto_parse: true, columns: header}); 
    return stream.pipe(parser); 
}; 

createStream().on('data', function(transaction){ 
     q.push(transaction); 
}); 
+0

感謝您將這個解決方案。我同意你的看法,這是一個更好的解決方案。 – calbear47

0

我解決了這個問題,有點不同。讓我解釋。

首先,我上面的初始嘗試沒有奏效,因爲它錯誤地使用了Transform和Parse包。你可以單獨使用它們,正如包裝所暗示的那樣,但是如果你決定一起使用它們,正確的用法要求你首先解析你的CSV,然後轉換它......因此,我的上面的嘗試在到達時是死的。其次,一旦我退出了使用標題的要求,我意識到我真正想要的是具有正確的鍵/值對的對象,這導致我試圖自己轉換數據,而不是依靠「專欄」選項爲我做到這一點。

這導致了我的結果:如果我可以保證每個記錄的順序和列數,那麼可以在兩個數組中使用變換函數中的相應數據構建一個對象。

下面是代碼:

let createStream = function() { 
    let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'}); 
    let parser = csv.parse({skip_empty_lines: false, auto_parse: true}); 
    let transform = csv.transform(function(record, doneTransform){ 
        let newObject = _.zipObject(header, record); 
        doneTransform(null, newObject); 
        }); 
    return stream.pipe(parser).pipe(transform); 
}; 

createStream().on('data', function(transaction){ 
     q.push(transaction); 
}); 

「標題」是我希望配對與我從CSV解析對應的值的按鍵陣列。

我正在使用lodash的zipObject函數來創建兩個數組的對象。你可以在這裏找到:zipObject

希望這可以幫助有人找到他們的解決方案時,他們的CSV文件沒有標題。

相關問題