簡體   English   中英

node.js - 在 http 獲取請求 (API) 中使用 .csv 文件中的值

[英]node.js - use values from a .csv file in an http get request (API)

我一直在研究我的問題,研究得越多,我就越困惑。

我需要使用 node.js 將來自 API 的信息合並到現有的 .csv 文件中並輸出一個新的 .csv 文件。 現有的 .csv 文件有四列,包括一個 accountId。 從 API 返回的數據將包含一個 accountId 列和兩個不在現有 .csv 文件中的附加列。 新的 .csv 文件需要包含四個現有列和兩個新列。

到目前為止,這是我的代碼:

console.log('Running merge');

const csv = require('csv-parser');
const fs = require('fs');
const json2csv = require('json2csv');
const axios = require('axios');

let dataArray = [];

fs.createReadStream('input - input.csv')
    .pipe(csv())
    .on('data', function (data) {
        // data.employee = 'employee';
        // console.log("data: " + data);
        // var accountId = data.accountId;
        // console.log("accountId = " + accountId);
    
        dataArray.push(data);
    })
    .on('end', function() {
        // console.log('data.accountId: ' + data.accountId);
        var result = json2csv.parse({ data: dataArray, fields: Object.keys(dataArray[0]) });
        fs.writeFileSync('employeeFile.csv', result);
});

我在編寫代碼時做的第一件事是添加data.employee = "employee"行,以驗證當我編寫新的 .csv 文件時,新列是否在其中。 那奏效了。 我的下一個目標,也是我遇到麻煩的地方,是檢索 accountId,以便我可以在標注中使用它。

我曾期望能夠做到以下幾點:

.on('data', function (data) {
    var accountId = data.accountId;
    // console.log("accountId = " + accountId);
    axios.get('https://company.callout.io/v1/accounts/' + accountId)
        .then(function (response) {
            // figure out what I need to do from there
        }

但是當我執行 console.log 時,我會打印出 accountId ,每個值都為 undefined 。

我確實讀到這可能是由於 JavaScript 的異步性質,我想也許我應該將標注放在 createReadStream 函數的.on(end)部分。 所以我嘗試了你看到的帶有data.accountId的 console.log ,但我收到了一個錯誤,即data is not defined. 我的錯誤是數據現在在 dataArray 中。 我一直試圖弄清楚如何從數組中檢索 accountId 的值,但我被卡住了。 我嘗試了以下方法:

.on('end', function() {
    let accountId = 'accountId';
    for(accountId in dataArray) {
        if (dataArray.hasOwnProperty(accountId)) {
            console.log('Account Id is ' + dataArray[accountId]);
        }
    }

但我得到的只是 7 行Account Id is [object Object]

我也試過:

.on('end', function() {
    let accountIdArray = dataArray.map(accountId => {
        return dataArray['accountId']; //tried accountId with and without quotes
    });
    console.log('Account Ids are ' + accountIdArray);

但我最終得到的Account Ids are ,,,,,,

我真的被困在這一點上。 任何幫助將不勝感激。

編輯

這是我要使用的示例 .csv 文件:

Account ID,Account Name,First Name,Created On
12345,lexcorp,Lex,1/12/2011
8172,latveriaembassy,Victor,11/19/2014
1924,brotherhood,Max,2/29/2012
222222,leagueofassassins,Ra's,3/1/2012
48213,kingpin,Wilson,7/7/2015
918299,oscorp,Norman,4/29/2014
88888,dococt,Otto,8/8/2013

以下是從服務返回的數據示例:

{
    "account_id": 12345,
    "status": "good",
    "created_on": "2011-01-12"
}

服務返回中的“created_on”必須位於名為 Status Set On 的列下,因為現有 .csv 文件中已經有一個 Created On 列。

請注意,我得到的 .csv 文件只是一個“快樂”的文件。 我的代碼將針對許多 .csv 文件運行,這些文件可能包含負帳號、缺失值以及我必須通過錯誤編碼捕獲的其他內容。 關鍵是,我不能根據給定的文件中的內容“硬編碼”任何東西。

如果您像這樣更改代碼,使用括號表示法訪問帳戶 ID,您應該會得到所需的結果。

fs.createReadStream('input - input.csv')
    .pipe(csv())
    .on('data', function (data) {
        console.log("data: ", data);
        var accountId = data['Account ID'];
        console.log("accountId = " + accountId);
        dataArray.push(data);
    })
    .on('end', function() {
        let accountIdArray = dataArray.map(account => account['Account ID'])
        console.log('Account Ids are ' + accountIdArray);
    });

一旦您在單獨的變量中擁有帳戶 ID,無論是在 .on('data', callback 還是 .on('end', callback 中,您都應該能夠根據需要進行 axios 調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM