如何将AWS DynamoDB数据完美导出为适用于Excel的CSV格式
解决DynamoDB导出CSV格式异常问题
你的问题根源在于最后把生成好的CSV字符串又用JSON.stringify()处理了一遍,导致整个内容被包裹在引号里,换行符也被转义成\r\n的文本形式,而非实际的换行效果。
修复步骤
直接移除JSON.stringify()调用,把生成的CSV字符串直接赋值给body即可:
// 替换这行 // body = JSON.stringify(csv); // 改成 body = csv;
完整修改后的代码
const AWS = require("aws-sdk"); AWS.config.update({ region: "us-east-1"}) const dynamo = new AWS.DynamoDB.DocumentClient({apiversion: "2012-08-10"}); exports.handler = async (event, context) => { let body; const headers = { "Content-Type": "text/csv", 'Content-disposition': 'attachment; filename=testing.csv' }; var params = { KeyConditionExpression: 'dataId = :id', ExpressionAttributeValues: { ':id': event.pathParameters.id, }, TableName: "Table1", }; const queryResult = await dynamo.query(params).promise(); //----------------------------------- // convert json to csv const items = queryResult.Items; // 处理空结果,避免报错 if (!items || items.length === 0) { body = ""; return { body, headers }; } const replacer = (key, value) => value === null ? '' : value; const header = Object.keys(items[0]); const csv = [ header.join(','), ...items.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(',')) ].join('\r\n'); body = csv; return { body, headers, }; };
额外说明
- Lambda返回的
body如果是字符串类型,且你已经设置了Content-Type: text/csv,无需再用JSON.stringify()处理,否则会把CSV转为JSON格式的字符串输出。 - 新增空结果判断,避免查询不到数据时
items[0]引发的报错。
批量导出替代方案
如果需要批量导出整张表的数据到CSV,不用自行维护Lambda代码的话,可以用Amazon Athena连接DynamoDB表,编写SQL查询后直接将结果导出为CSV格式到S3,效率更高且无需额外代码开发。
内容的提问来源于stack exchange,提问作者Hyacinth
相关产品推荐
相关产品推荐

