使用PowerShell拆分单列CSV文件,每行生成独立文件
问题:拆分CSV文件为单个文本文件
我有一个从Excel导出的CSV文件,仅含一列(Column1)、约2000行,Column2为空。需要用PowerShell拆分该文件,让每行Column1的内容生成一个独立文件,最终得到2000个文件。
输入CSV示例
Column1,Column2 "1939 value 1 ", "1939 Mc value 2 ", "1941 value 3 ", "1941 value 4 ", "1941 value 5
期望输出
每个文件包含原引号内的文本(保留或去除引号均可),示例如下:
File 1: 1939 value 1 File 2: 1939 Mc value 2 File 3: 1941 value 3 File 4: 1941 value 4 File 5: 1941 value 5
尝试过的代码(未生效)
$InputFilePath = "C:\elisabetta.csv" $SplitByColumnName = "Column1" #Enter ColumnName here on basis of which you want to split. $data = Import-Csv $InputFilePath | Select -ExpandProperty $SplitByColumnName -Unique $a = $data | select ForEach ($i in $a) { $FinalFileNamePath = "C:\carlo\" + $i + ".CSV" #This is where you would keep the splitted files. Import-Csv $InputFilePath | where {$_.$SplitByColumnName -eq $i } | Export-Csv $FinalFileNamePath -NoTypeInformation }
问题分析
你的代码存在几个关键问题:
- 使用
-Unique参数会合并重复内容的行,导致生成的文件数量远小于实际行数 Export-Csv会生成CSV格式文件,而非你需要的纯文本内容- 直接用
$i(即Column1的内容)作为文件名,内容中的换行、空格等字符会导致文件名无效 - 循环内重复执行
Import-Csv,效率极低且容易出错
解决方案
可行的PowerShell代码
$InputFilePath = "C:\elisabetta.csv" $OutputDir = "C:\carlo" # 确保输出目录存在,不存在则创建 if (-not (Test-Path -Path $OutputDir)) { New-Item -ItemType Directory -Path $OutputDir | Out-Null } # 一次性导入CSV数据 $csvRows = Import-Csv -Path $InputFilePath # 遍历每一行生成独立文件 for ($rowIndex = 0; $rowIndex -lt $csvRows.Count; $rowIndex++) { # 获取Column1的内容,可选去除首尾引号 $content = $csvRows[$rowIndex].Column1 -replace '^"|"$', '' # 生成安全的文件名(用索引避免非法字符和重复) $fileName = "File_$($rowIndex + 1).txt" $fullFilePath = Join-Path -Path $OutputDir -ChildPath $fileName # 将内容写入文件,指定UTF8编码避免乱码 $content | Out-File -FilePath $fullFilePath -Encoding UTF8 }
代码说明
- 先检查输出目录,不存在则自动创建,避免路径错误
- 一次性导入所有CSV数据,避免循环内重复读取文件,提升效率
- 用行索引生成文件名,彻底避免内容中的非法字符导致的文件名问题
- 可选去除内容首尾的引号(如果需要保留引号,删除
-replace '^"|"$', ''即可) - 使用
Out-File写入纯文本内容,符合你的输出需求 - 指定UTF8编码,防止中文或特殊字符出现乱码
内容的提问来源于stack exchange,提问作者Diana Persico
相关产品推荐
相关产品推荐

