我需要在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
}
我确定还有一些较短的方法可以执行我的某些行,只是现在不查找。 ;-)
答案 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
会阻止输出中包含类型信息的附加标题行。