如何修改PowerShell脚本实现每行CSV数据生成独立JSON文件
问题:为CSV中每个人生成独立JSON文件
我现有一段PowerShell脚本,可读取CSV文件的每一行并将数据存入PsCustomObject,当前会生成一个名为“Kevin Jessica.json”的文件,包含所有数据。但我希望为每个人生成单独的JSON文件。
示例CSV文件(whatever3.csv):
Name,Language,State Kevin,Powershell,Texas Jessica,C,NewYork
当前脚本:
$csvData = Import-Csv -Path "C:\Users\user1\Downloads\whatever3.csv" $fileNames = $csvData.Name | Select -Unique $DestinationDir = "C:\Users\user1\Downloads\sample" $customheader = "MyClass" $all = $csvData | ForEach-Object { $val = $_ | Select-Object * [PsCustomObject]@{ $customheader = @($val) } | ConvertTo-Json | Add-Content -Path "$DestinationDir\$fileNames.json" }
期望输出:两个独立文件Kevin.json和Jessica.json,各自包含对应人员的JSON数据结构。
解决方案
修改后的脚本如下:
$csvData = Import-Csv -Path "C:\Users\user1\Downloads\whatever3.csv" $DestinationDir = "C:\Users\user1\Downloads\sample" $customheader = "MyClass" # 确保目标目录存在,不存在则创建 if (-not (Test-Path -Path $DestinationDir)) { New-Item -ItemType Directory -Path $DestinationDir | Out-Null } $csvData | ForEach-Object { # 以当前行的Name值作为文件名 $fileName = "$($_.Name).json" $filePath = Join-Path -Path $DestinationDir -ChildPath $fileName # 构造自定义对象并转换为JSON,覆盖写入对应文件 [PsCustomObject]@{ $customheader = @($_) } | ConvertTo-Json | Set-Content -Path $filePath -Encoding utf8 }
关键修改说明
- 移除了错误的
$fileNames变量:原脚本中该变量会将所有Name值拼接成一个字符串,导致生成错误命名的文件。 - 遍历每一行时直接使用当前行的
$_.Name作为文件名,确保每个人对应独立文件。 - 用
Set-Content替代Add-Content:避免重复运行脚本时追加内容,保证每个文件只保留对应人员的最新数据。 - 添加目录检查:自动创建不存在的目标目录,避免路径错误。
- 使用
Join-Path拼接路径:比手动拼接字符串更安全,避免路径分隔符问题。
内容的提问来源于stack exchange,提问作者B Lee
相关产品推荐
相关产品推荐

