我有一个用例如下:用户维护具有数千行的Excel文件,这些文件转换为CSV文件,然后使用BCP实用程序将数据加载到数据库表中。问题是数据包含空格,有时在字段的开头,有时在结尾,有时在开头和结尾。数据本身可以合法地在值中包含空格。在数据到达数据库后,不要在SQL代码中添加LTRIM(RTRIM(fieldname))
语句,因为这将是非常劳动密集型的,而不是执行Excel操作来清除空格,目标是对CSV文件运行Powershell脚本,以去除每个字段开头和结尾的空格。
以下是我目前为止的实验代码:
file.csv
SpacesOnLeft,SpacesOnRight,SpacesLeftAndRight,Normal
1,1 , 1 ,1
2,2 , 2 ,2
red clover,red clover , red clover ,red clover
RemoveSpaces.ps1
(Get-Content .\file.csv) |
foreach {
$_ -replace '"\s+|\s+"','"'
} | Out-File .\file.csv
PowerShell逻辑来自this post,但它没有像我期望的那样修改file.csv来删除CSV文件中每个字段开头和结尾的空格。我可能忽略了一些很简单的东西。为什么这个逻辑不更新file.csv?
编辑
圣地亚哥Squarzon的面向对象解决方案:
(Import-Csv path\to\csv.csv) | ForEach-Object {
foreach($property in $_.PSObject.Properties) {
$property.Value = $property.Value.Trim()
}
$_
} | Export-Csv path\to\csv.csv -NoTypeInformation
结果是:
"SpacesOnLeft","SpacesOnRight","SpacesLeftAndRight","Normal"
"1","1","1","1"
"2","2","2","2"
"red clover","red clover","red clover","red clover"
这非常接近于期望的输出。有没有一种方法可以不带双引号地输出结果?
1条答案
按热度按时间6psbrbz91#
我推荐的面向对象方法是使用
Import-Csv
读取CSV,然后枚举并更新每个对象的每个属性值:什么可能适用于您的情况,但我不建议:
Regex的详细信息:https://regex101.com/r/p4UdqO/3