我试图读取一个文件夹中的多个csv,并尝试替换一些不需要的字符,并将其保存到另一个文件夹中的相同名称的另一个csv中。
我尝试使用foreach
循环和ForEach-Object
循环来动态生成目标文件名
#CSV's in folder (ABC.csv, DEF.csv)
param ( [String] $Filename))
$SourceFolderPath = Get-Childitem "C:\data\"
$DestinationFolderPath = "C:\data\cleaned\"
$Source = $SourceFolderPath + $FileName
$Destination = $DestinationFolderPath + $Filename
ForEach ($f in $SourceFolderPath) {$F}
{
Import-Csv $f | ForEach-Object -Begin { $writeHeader = $True } {
if ($writeHeader) { $writeHeader = $False; $_.psobject.properties.Name -join ',' }
$_.psobject.properties.Value -replace ',', '' -replace '"', '' -join ','
} | set-Content $Destination
}
如果我手动传递$FileName = "ABC.csv"
,则代码正在运行。但是我需要它为文件夹中的所有文件动态地执行此操作。
答案 0 :(得分:0)
因此,您希望从包含的逗号和
中清除所有列数据
还要从生成的csv文件中删除所有双引号?
我建议为参数字符串定义默认值,
因此,如果需要,您 可以提供其他值,但不必这样做。
该脚本暂时将分隔符更改为竖线|
,
因此这不应出现在文件内容中。
## Q:\Test\2019\08\27\SO_57678154.ps1
param ( [String] $Filename = '*.csv',
[String] $SourceDir = 'C:\Data\',
[String] $TargetDir = 'C:\Data\cleaned\'
)
ForEach ($csvFile in Get-ChildItem -Path $SourceDir -Filter $Filename){
(Import-Csv $csvFile |
ConvertTo-Csv -NoTypeInformation -Delimiter '|') -replace '[,"]' -replace '\|',',' |
Set-Content (Join-Path $TargetDir $csvFile.Name)
}