【发布时间】:2022-11-23 23:42:01
【问题描述】:
我想将 AWS DynamoDB 数据下载到 Excel 以允许我在本地处理数据。但是,我还没有得到完美的 CSV 格式的数据。
我做了什么:我使用一个 Node.js 应用程序,它在 AWS Lambda 服务中运行以连接到 DynamoDB 数据库。此外,我可以从DynamoDB查询数据,然后将其转换为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",
};
body = await dynamo.query(params).promise();
//-----------------------------------
// convert json to csv
const items = body.Items
const replacer = (key, value) => value === null ? '' : value
const header = Object.keys(items[0])
let csv = [header.join(','),
...items.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(','))
].join('\r\n')
body = JSON.stringify(csv);
return {
body,
headers,
};
};
上述解决方案有效,但输出并不完美;下面显示了一个示例(请注意,有三列:relativeHumidity、waterTemperature 和 airTemperature):
"relativeHumidity,waterTemperature,airTemperature\r\n26.123206154221034,21.716873058693757,23.859491598934557\r\n26.966163183232673,18.09642888420125,21.47952617547989\r\n33.79030978475366,18.995791668472204,17.451627574004128\r\n40.6641803491319,19.89060168145951,17.61247262137161"
但是,我想要一个如下所示的输出:
相对湿度、水温、空气温度 26.123206154221034,21.716873058693757,23.859491598934557 26.966163183232673,18.09642888420125,21.47952617547989 33.79030978475366,18.995791668472204,17.451627574004128 40.6641803491319,19.89060168145951,17.61247262137161
我将不胜感激有关如何实现这一目标的任何指南。请注意,我已经尝试过this,但数据正在以 json 格式导出到 S3。
【问题讨论】:
-
\r\n行结尾如何给您带来问题? -
只需根据
\n拆分,它就会给你一个字符串数组。 -
@jarmod 我不希望
\r\n成为检索到的数据的一部分。相反,我希望将其替换为实际的新行。 -
但是您的代码是通过
join('\r\n')明确执行此操作的。如果您只喜欢\n,是什么阻止了您进行更改? -
您是否简单地尝试过
join('\n')然后返回 { body: csv, headers }`(没有尝试对 CSV 内容进行 JSON 化)?
标签: node.js json csv aws-lambda amazon-dynamodb