将csv数据直接写入节点js中的azure blob
Posted
技术标签:
【中文标题】将csv数据直接写入节点js中的azure blob【英文标题】:Write csv data to directly to azure blob in node js 【发布时间】:2021-06-13 15:16:00 【问题描述】:我想使用 csv-writer 创建一个 CSV 文件,并将该 csv 上传到 azure blob,我可以创建 csv,将其存储在本地系统上,然后从本地读取并使用 azure-storage 上传到 blob npm。但是我不想在本地文件系统上创建/存储 CSV(因为我在 Prod 上遇到了一些问题),有没有办法创建 CSV 并直接提供给 azure blob 存储,而不将 csv 写入本地文件系统。
一些代码供参考
const csvWriter = createCsvWriter(
path: `__dirname/$blobName`,
header: [
id: "id", title: "name" ,
],
);
await csvWriter
.writeRecords(csvData)
.then(() => console.log("file successfully written"));
一旦在本地创建了这个 csv,使用 fs 模块从那里读取它,然后使用“blobService.createBlockBlobFromStream”函数上传到 blob。
您能否建议我如何直接将 azure blob 存储路径提供给 csvWriter?或者还有其他方法可以实现吗?
【问题讨论】:
你试过this吗? 实际上没有,但这怎么可能相关呢?我正在使用 csv-writer 包,它需要创建 csv 的路径,我想将其直接上传到 azure blob 存储。能详细点吗? 【参考方案1】:请尝试下面的代码。
const BlobServiceClient, StorageSharedKeyCredential = require('@azure/storage-blob');
const createCsvStringifier = require('csv-writer').createObjectCsvStringifier;
const accountName = 'account-name';
const accountKey = 'account-key';
const container = 'container-name';
const blobName = 'text.csv';
const csvStringifier = createCsvStringifier(
header: [
id: 'name', title: 'NAME',
id: 'lang', title: 'LANGUAGE'
]
);
const records = [
name: 'Bob', lang: 'French, English',
name: 'Mary', lang: 'English'
];
const headers = csvStringifier.getHeaderString();
const data = csvStringifier.stringifyRecords(records);
const blobData = `$headers$data`;
const credentials = new StorageSharedKeyCredential(accountName, accountKey);
const blobServiceClient = new BlobServiceClient(`https://$accountName.blob.core.windows.net`, credentials);
const containerClient = blobServiceClient.getContainerClient(container);
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
const options =
blobHTTPHeaders:
blobContentType: 'text/csv'
;
blockBlobClient.uploadData(Buffer.from(blobData), options)
.then((result) =>
console.log('blob uploaded successfully!');
console.log(result);
)
.catch((error) =>
console.log('failed to upload blob');
console.log(error);
);
这段代码中有两件事:
如果您不想将数据写入磁盘,请使用createObjectCsvStringifier
。
使用@azure/storage-blob
节点包而不是azure-storage
包,因为前者是较新的包,而后者已被弃用。
更新
这是使用azure-storage
包的代码。
const azure = require('azure-storage');
const createCsvStringifier = require('csv-writer').createObjectCsvStringifier;
const accountName = 'account-name';
const accountKey = 'account-key';
const container = 'container-name';
const blobName = 'text.csv';
const csvStringifier = createCsvStringifier(
header: [
id: 'name', title: 'NAME',
id: 'lang', title: 'LANGUAGE'
]
);
const records = [
name: 'Bob', lang: 'French, English',
name: 'Mary', lang: 'English'
];
const headers = csvStringifier.getHeaderString();
const data = csvStringifier.stringifyRecords(records);
const blobData = `$headers$data`;
const blobService = azure.createBlobService(accountName, accountKey);
const options =
contentSettings:
contentType: 'text/csv'
blobService.createBlockBlobFromText(container, blobName, blobData, options, (error, response, result) =>
if (error)
console.log('failed to upload blob');
console.log(error);
else
console.log('blob uploaded successfully!');
console.log(result);
);
【讨论】:
感谢这在本地对我有用,但是当我在 azure 上部署解决方案时,它遇到了一些问题:未处理的拒绝:Promise Promisevar maxBufferLength = require("buffer").constants.MAX_LENGTH;
。我不知道为什么。您在 Azure 中的哪个位置运行代码 - Function、WebApp 还是其他?
你可能想在这里创建一个新问题:github.com/Azure/azure-sdk-for-js/issues。
当然谢谢,它有帮助,同样的实现可以在“azure-storage”包的帮助下完成吗?我试图将上面的代码转换为使用“azure-storage”包,但不能,你能帮我解决这个问题吗?
更新了我的答案并使用azure-storage
包提供了示例代码。不确定当代码在 Azure 中运行时是否会遇到相同的错误。 HTH。以上是关于将csv数据直接写入节点js中的azure blob的主要内容,如果未能解决你的问题,请参考以下文章
Azure 数据工厂将数据流映射到 CSV 接收器导致零字节文件
如何使用 fast-csv 将特殊字符写入节点中的 csv 文件