【问题标题】:How to export filtered data from dynamodb to csv using nodejs?如何使用nodejs将过滤后的数据从dynamodb导出到csv?
【发布时间】:2019-09-26 09:40:22
【问题描述】:

我想将过滤后的数据从 dynamodb 导出到 csv。我有一个使用名称和 id 过滤数据的功能。现在我需要将过滤后的数据导出到 excel 中。我该如何解决这个问题?我见过这个 npm dynamodb-csv。但这并没有解决我的问题..

【问题讨论】:

    标签: node.js amazon-dynamodb


    【解决方案1】:

    我正在使用以下代码 sn-p 进行导出和导入:

    const AWS = require('aws-sdk');
    const dynamoDb = new AWS.DynamoDB.DocumentClient({ region: 'eu-central-1' });
    const READ_FROM_TABLE = "example-table-prod"
    const STORE_TO_TABLE = "example-table-dev"
    const fs = require('fs');
    
    async function loadAllResults() {
      var results = []
      var currentResults = await loadAdditionalResults()
      results = results.concat(currentResults.Items)
      while (currentResults.LastEvaluatedKey) {
        currentResults = await loadAdditionalResults(currentResults.LastEvaluatedKey)
        results = results.concat(currentResults.Items)
      }
      fs.writeFile("output.json", JSON.stringify(results, null, 2), () => {
        console.log(results.length)
      })
      return results
    }
    
    async function loadAdditionalResults(start) {
      console.log("Loading more results...")
      var params = {
        TableName: READ_FROM_TABLE,
      }
    
      if (start) {
        params.ExclusiveStartKey = start
      }
    
      return new Promise((resolve, reject) => {
        dynamoDb.scan(params, (error, result) => {
          if (error) {
            console.log(error);
            reject(error)
          } else if (result) {
            resolve(result)
          } else {
            reject("Unknown error")
          }
        })
      })
    }
    
    async function storeAllResults(results) {
      var count = 0
      for (result of results) {
        await storeItem(result)
        count++
        console.log("Stored " + count + " / " + results.length)
      }
    }
    
    async function storeItem(item) {
      const params = {
        TableName: STORE_TO_TABLE,
        Item: item
      };
    
      return new Promise((resolve, reject) => {
        dynamoDb.put(params, function (error, data) {
          if (error) {
            console.log(error);
            reject({ error: 'Could not create item' });
          }
          resolve("Stored");
        });
      });
    };
    
    async function main() {
      let results = await loadAllResults()
      storeAllResults(results)
    }
    
    
    main()
    

    随意使用对您有用的任何 sn-p。另请注意,您可以使用 https://www.npmjs.com/package/json2csv 将 json 转换为 csv

    【讨论】:

    • 这很棒 - 感谢分享。有关信息,使用 AWS 客户端,您还可以使用 return dynamoDb.scan(params).promise(); 直接获得承诺。
    【解决方案2】:

    我遇到了同样的问题,我使用上面的代码来解决我的问题。但我想从 DynamoDB 表中生成一个 CSV 文件。 谢谢@Carl Ambroselli,我修改了你的代码以获得我想要的结果。

    我在上面的代码中使用了“papaparse”并将我的 DynamoDB 记录转换为 CSV 格式。

    dynamodb-csv 包提到了限制,因为 CSV 列标题是根据 DynamoDB 表中的第一行确定的。

    我们可以在字段中传递列名来克服限制。

    const fs = require('fs');
    const async = require('async');
    const AWS = require('aws-sdk');
    const Papa = require("papaparse");
    
    
    const DYNAMODB_REGION = 'XXXXXXXX';
    
    AWS.config.update({
      accessKeyId: 'XXXXXXXXXXX',
      secretAccessKey: 'XXXXXXXXXX',
      region: 'XXXXXX',
    });
    
    const docClient = new AWS.DynamoDB.DocumentClient({
      region: DYNAMODB_REGION
    });
    
    
    const READ_FROM_TABLE = "tableName"
    
    main();
    
    async function loadAllResults() {
      var results = [];
      var currentResults = await loadAdditionalResults();
      results = results.concat(currentResults.Items);
    
      while (currentResults.LastEvaluatedKey) {
        currentResults = await loadAdditionalResults(currentResults.LastEvaluatedKey)
        results = results.concat(currentResults.Items)
      }
      return results;
    }
    
    async function loadAdditionalResults(start) {
      console.log("Loading more results..."+READ_FROM_TABLE)
      var params = {
        TableName: READ_FROM_TABLE,
        //Limit: 1000,
      }
    
      if (start) {
        params.ExclusiveStartKey = start
      }
    
      return new Promise((resolve, reject) => {
        docClient.scan(params, (error, result) => {
          if (error) {
            console.log(error);
            reject(error);
          } else if (result) {
            resolve(result);
          } else {
            reject("Unknown error");
          }
        })
      })
    }
    
    
    async function main() {
      let tableData = await loadAllResults();
      var csv = Papa.unparse(tableData);
      fs.createWriteStream('test.csv', { flags: 'w' }).write(csv);
    
      /*var csv = Papa.unparse({
        fields: ["id", "productName", "price", "quantity"],
        data: tableData
        });
      fs.createWriteStream('test.csv', { flags: 'w' }).write(csv);*/
    }
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2012-01-03
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多