使用powershell在csv单元格中的每个单词后放置逗号(,)

5lhxktic  于 2023-01-22  发布在  Shell
关注(0)|答案(1)|浏览(91)

我被要求使用powershell创建一个脚本,在csv单元格中的每个单词后放置逗号(,)。但是由于一些安全原因,实际的csv还没有与我共享。
我已经创建了一个测试csv并尝试将逗号每个单词后都有(,)(屏幕截图1)。我可以创建脚本,并且它100%正常工作(屏幕截图2)。然而,实际文件大小约为250 MB。我假设如果该文件有100s列,我是否必须像在foreach循环中提到的那样在脚本中提到每个列名?是否有简单的方法可以在不提到每个列名的情况下完成此任务?如有任何帮助,将不胜感激。下面是我的脚本,运行良好:

$csv = Import-Csv -Path C:\temp\test.csv
$outcsv = Read-Host "Enter the name of the output csv"     
$outfile  = "$env:USERPROFILE\Downloads" + "" + $outcsv + ".csv"
$data = @()

foreach ($item in $csv) {

        $col1 = $item.Name + ","
        $col2 = $item.Location  + ","
        $col3 = $item.Company  + ","
        $col4 = $item.Profile  + ","
        $col5 = $item.Shift  + ","

        $Properties = [ordered]@{
                'Name'      = $col1
                'Location'  = $col2
                'Company'   = $col3
                'Profile'   = $col4
                'Shift'     = $col5
        }
$data += New-Object -TypeName PSObject -Property $Properties
}

$data | Export-Csv -Path $outfile -NoTypeInformation

截图一:

带逗号(,)的屏幕截图2:

col17t5w

col17t5w1#

这是一种更简单的方法,可以通过访问对象的PSObject.Properties动态地处理逻辑。

$outcsv = Read-Host "Enter the name of the output csv"
if(-not [System.IO.Path]::GetExtension($outcsv)) {
    $outcsv = $outcsv + '.csv'
}
$outfile = Join-Path "$env:USERPROFILE\Downloads" -ChildPath $outcsv

Import-Csv -Path C:\temp\test.csv | ForEach-Object { $firstObject = $true } {
    if($firstObject) {
        # get the property names of the first object
        $properties = $_.PSObject.Properties.Name
        $firstObject = $false
    }

    # enumerate each property of the object
    foreach($property in $properties) {
        # update the value
        $_.$property = $_.$property + ','
    }

    # output the updated object
    $_
} | Export-Csv $outfile

相关问题