删除CSV文件中列左右的空格

sg3maiej  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(165)

我有一个用例如下:用户维护具有数千行的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"

这非常接近于期望的输出。有没有一种方法可以不带双引号地输出结果?

6psbrbz9

6psbrbz91#

我推荐的面向对象方法是使用Import-Csv读取CSV,然后枚举并更新每个对象的每个属性值:

(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

什么可能适用于您的情况,但我不建议:

(Get-Content path\to\csv.csv -Raw) -replace '(?m)(^|(?<=,))\s+|\s+($|(?=,))' |
    Set-Content path\to\csv.csv

Regex的详细信息:https://regex101.com/r/p4UdqO/3

相关问题