如何创建PowerShell Azure Function实现CSV转制表符分隔TXT文件
PowerShell Azure Function 实现Blob CSV转制表符TXT方案
前置准备
- 创建PowerShell 7.0+ 运行时的Azure Function(推荐选Runtime栈版本~4),触发器优先选Blob触发器,直接监控你存放
abc.csv的存储容器,文件匹配规则填*.csv,Logic App生成完CSV文件会自动触发函数,不用额外做Logic App到Function的调用配置。 - 给Function开启系统分配托管标识,到目标存储账号的访问控制(IAM)页面,给这个托管标识分配
存储Blob数据参与者角色,不用硬编码存储密钥。 - 打开Function的
requirements.psd1配置文件,取消Az.Storage模块的注释,保存后平台会自动安装依赖模块,不用手动上传。 - 给Function加输出Blob绑定,目标路径填对应容器下的
{name}.txt,也就是源文件叫abc.csv的话,自动生成abc.txt作为输出文件。
核心脚本(Function入口run.ps1)
using namespace System.IO using namespace Microsoft.WindowsAzure.Storage.Blob # 接收触发器传入的输入Blob流 param([Stream]$inputBlob, $TriggerMetadata) # 读取输入Blob的CSV内容,自动解析CSV结构,避免字段内逗号导致转换错误 $reader = New-Object StreamReader($inputBlob) $csvContent = $reader.ReadToEnd() | ConvertFrom-Csv $reader.Close() # 转换为制表符分隔格式,去掉多余的类型头信息 $tsvContent = $csvContent | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | Out-String # 直接推送到输出绑定的Blob,不需要手动写存储连接逻辑 Push-OutputBinding -Name outputBlob -Value ([MemoryStream]::new([Text.Encoding]::UTF8.GetBytes($tsvContent)))
可选:不用输出绑定、手动调用存储SDK的写法
如果需要自定义目标存储路径、或者跨存储账号操作,可以用托管标识直接拿存储客户端操作,不需要连接字符串:
# 拿到当前Function的托管标识凭证 $ctx = New-AzStorageContext -StorageAccountName "你的存储账号名" -UseConnectedAccount # 读取源Blob内容 $tempSourcePath = Join-Path $env:TEMP "abc.csv" Get-AzStorageBlobContent -Container "你的源容器名" -Blob "abc.csv" -Destination $tempSourcePath -Context $ctx -Force $csvContent = Import-Csv -Path $tempSourcePath # 转换格式后写入目标Blob $tsvTempPath = Join-Path $env:TEMP "abc.txt" $csvContent | Export-Csv -Path $tsvTempPath -Delimiter "`t" -NoTypeInformation -Encoding UTF8 Set-AzStorageBlobContent -File $tsvTempPath -Container "你的目标容器名" -Blob "abc.txt" -Context $ctx -Force # 清理临时文件 Remove-Item $tempSourcePath, $tsvTempPath -Force
注意事项
- 绝对不要用
(Get-Content xxx).Replace(',', "t")`这种简单替换的写法,只要CSV字段里有被双引号包裹的逗号(比如地址、备注类字段),转换后的文件会直接列错位。 - 处理超过100MB的大CSV文件时,不要把全量内容读进内存,改成逐行读取解析的流式逻辑,避免函数内存超限被强制终止。
- 函数应用的应用设置里别硬存存储连接字符串,用托管标识鉴权的方式,后续存储密钥轮换也不需要改函数配置。
- 如果需要保留Logic App主动调用的逻辑,把触发器换成HTTP触发器,在请求体里传入源Blob的容器名、文件名参数,替换脚本里的硬编码路径值就行。
兼容性提示:如果你的CSV带GBK等非UTF8编码,读取内容的时候给
StreamReader指定对应编码参数即可,默认是UTF8无BOM格式,适配绝大多数场景。
内容的提问来源于stack exchange,提问作者user13747070
相关产品推荐
相关产品推荐

