2017-08-02 112 views
0

我在具有csv文件的S3存储桶上有一个触发器。我正在尝试编写一个node.js lambda函数来将csv文件加载到dynamodb表中。 我的文件就像下面将csv转换为dynamodb json格式

Speed, San Diego, 35,0,0 
Air, Houston, 32,0,0 
Air, Chicago, 35,0,0 

我的文件没有一个头,但我需要使用以下

Gauge: Speed, City: San Diego, Value:35, temp1: 0, temp2: 0 

等关键valueslike拥有它,我基本上只是试图让这到dynamodb json格式,一旦我把它变成这种格式,我可以加载它,但我一直没能找到任何示例脚本在线。有没有人有一个如何将原始数据转换为dynamodb json格式的例子?

我已经看到了数据管道的职位,但我正在寻找一个节点/ js的方法将这些数据转换为DDB JSON

回答

1

可以解析CSV内容到使用csv-parse NPM模块JavaScript数组。我正在使用版本1.2.0,同步选项,但它应该适用于更高版本。

const parse = require('csv-parse/lib/sync'); 

function parseCsv(data, header) { 
    // remove spaces in front of data 
    data = data.replace(/\s*,\s*/g, ","); 
    // add new line between header & data 
    data = `${header}\n${data}`; 

    return parse(data, {columns: true}); 
} 

var csv = 
`Speed, San Diego, 35,0,0 
Air, Houston, 32,0,0 
Air, Chicago, 35,0,0`; 

// comma separate your header 
var header = "Gauge,City,Value,temp1,temp2"; 


// #TEST 
var ddbArray = parseCsv(csv, header); 

console.log(JSON.stringify(ddbArray, 0, 2)); 
0

您可以使用csvtojson你的CSV数据转换成JSON对象在你的lambda函数。

这里有一个快速和肮脏的例子,你得到的想法:

var AWS  = require('aws-sdk'), 
 
    Promise = require('bluebird'), 
 
    csv  = require('csvtojson'), 
 
    uuid = require('uuid/v4'); 
 

 

 
AWS.config.setPromisesDependency(Promise); 
 

 
var save = (items) => { 
 
    var dynamodb = new AWS.DynamoDB.DocumentClient(); 
 
    var params = { 
 
     RequestItems: { 
 
      'MyDynamoDBTable': items 
 
     } 
 
    } 
 

 
    return dynamodb.batchWrite(params).promise(); 
 
} 
 

 
var data = 
 
"Speed, San Diego, 35,0,0 \n \ 
 
Air, Houston, 32,0,0 \n \ 
 
Air, Chicago, 35,0,0"; 
 

 
var items = []; 
 

 
csv({noheader: true}) 
 
    .fromString(data) 
 
    .on("csv", (row) => { 
 
     console.log(row); 
 
     
 
     var item = { 
 
      PutRequest: { 
 
       Item: { 
 
        id: uuid(), 
 
        gauge: row[0], 
 
        city : row[1], 
 
        value: row[3], 
 
        temp1: row[4], 
 
        temp2: row[5] 
 
       } 
 
      }    
 
     }; 
 

 
     items.push(item); 
 
    }) 
 
    .on('done',() => { 
 
     save(items) 
 
      .then((result) => console.log(result)) 
 
      .catch((error) => console.error(error)); 
 
    });