将不同的数据附加到csv文件中的每一行的末尾

时间:2020-01-10 18:23:24

标签: powershell

我需要在text / csv文件的标题末尾添加文本,然后在标题下方的每一行末尾添加其他文本(日期)。添加文本部分效果很好,但导出到csv的效果不理想。

预期输出为(粗体为添加的文本);
“文件夹名称”,“文件”,“文件夹”,“大小”,“注释” ,“ ReportDate”
“ \\服务器\共享\文件夹”,“ 2,029,756”,“ 819,527”,“ 1,785,490,958,735”,“” ,“ 1/10/2020”

相反,我得到了;
“长度”
“ 61”
“ 74”
“ 88”
“ 118”

$Path = "C:\temp\"
$files = Get-ChildItem $Path -filter '*.csv'
ForEach ($file in $files)
{
    $datetmp = $file.PSChildName.Substring(0,10)
    $datetmp = $datetmp.split("_")
    $date = $datetmp[1] + "/" + $datetmp[2] + "/" + $datetmp[0]

    $Fullpath = $Path + $file

    [System.Collections.ArrayList]$content = Get-Content $Fullpath #| %{"$_," + $date}
    $rptinsert = @()

    for ($i=0; $i -lt ($content.Count); $i++)
    {
        if ($i -eq 0)
        {
            $rptinsert += $content[$i] + ",""ReportDate"""
        }
        else
        {
            $rptinsert += $content[$i] + ",`"$date`""
        }
    }


    $Report = $Path + $file.PSChildName.Substring(0, 10) + "-FileSizes2.csv"
    $rptinsert | Export-Csv -path $Report -Encoding ascii -NoTypeInformation
    }

我确定还有一些较短的方法可以执行我的某些行,只是现在不查找。 ;-)

1 个答案:

答案 0 :(得分:2)

要按预期使用Export-Csv,需要输入带有属性/值对的对象。您正在串起管道。字符串的唯一属性是Length。我将使用Import-Csv来读取文件,修改返回的值,然后使用Export-Csv输出更改后的对象。以下是可以使用的蓝图:

$Path = "C:\temp\"
$files = Get-ChildItem $Path -filter '*.csv'
Foreach ($file in $files) {
    $datetmp = $file.Name.Substring(0,10).Split('_')
    $date = $datetmp[1],$datetmp[2],$datetmp[0] -join '/'
    $content = Import-Csv $file | Add-Member -MemberType NoteProperty -Name 'ReportDate' -Value $date -PassThru
    $content | Export-Csv -Path ($Path + $file.Name.Substring(0, 10) + "-FileSizes2.csv") -NoType
}

Import-Csv的输出是自定义对象的集合,这些自定义对象的属性名称与CSV文件的标题行匹配。由于 它会出现 ,因此您希望将相同的值添加到CSV文件的每一行中,因此您只需运行一个Add-Member命令即可​​。如果每行需要不同的值,那么您将需要遍历每行并运行Add-Member命令。

Add-Member允许向对象添加不同的成员类型。对于您的情况,您想添加一个带有值的NoteProperty类型。

对一个CSV内容的更新完成后,您可以将这些结果传送到Export-Csv中。 -NoType会阻止输出中包含类型信息的附加标题行。