【发布时间】:2023-04-05 18:37:01
【问题描述】:
我有一个 .csv 文件,其中包含超过 1000 条我工作的公司前雇员的条目,我正在尝试按员工将其拆分为可以插入电子邮件模板的格式。更糟糕的是,许多(但不是全部)员工有不止一个条目,并且 .csv 包含大量信息,这对于我将向其发送电子邮件的人来说是完全不必要的。理想情况下,我想排除这些列,但我遇到了很多困难。在我看来,format-table 将是我需要的 cmdlet,但我不能 100% 确定。到目前为止,我已经尝试过:
import-csv C:\filepath\xx.csv | format-table -groupby (key value)
它确实返回了按我想要的方式组织的信息,但是我不知道如何从那里拆分信息,所以我只能发送特定员工的信息。如前所述,这还包括相当多的无关信息。我也试过:
import-csv C:\filepath\xx.csv | format-table -groupby (key value) -property (properties I want,separated by commas)
但是,这仍然返回相同的无关信息。我还尝试使用 foreach 循环遍历 .csv,将我想要的信息存储在变量中,然后将这些变量存储在一个数组中,然后将该数组通过管道传输到格式表中,这会导致一团糟。我还尝试将 .csv 放入按我想要的键值分组的哈希表中,但这会导致其余信息被放入字符串中。我相信我应该能够使用正则表达式拆分这个字符串,但是我对正则表达式一点也不熟悉,也不知道从哪里开始。在这一点上,我很困惑。任何帮助将不胜感激。
编辑
在遵循@4c74356b41 的建议(对此我非常感谢)之后,我能够输出仅包含相关信息的表格列表。但是,我仍然无法将此表列表拆分为我需要的单个表。我目前有一个 .txt 文件,我将其用作模板,我想为各个用户添加表格。到目前为止,我已经成功使用 get-content 来检索 .txt 的内容,-replace 从原始 .csv 中的信息(例如名称、经理等)替换模板上的其他几个字段,然后输出-文件将编辑后的模板存储到临时文件中,然后将其作为草稿保存到 Outlook。我试图在前一个 foreach 循环中添加另一个 foreach 循环,以将表添加到模板中,但这会返回带有“Microsoft.PowerShell.Commands.Internal.Format.FormatStartData”行的模板来代替表。它还为每个条目创建一个草稿,而不仅仅是为每个唯一用户 ID 创建一个草稿。这是我到目前为止的所有代码:
$olFolderDrafts = 16
$ol = New-Object -comObject Outlook.Application
$ns = $ol.GetNameSpace("MAPI")
$file= import-csv H:\filepath\term_rep.csv
$data= import-csv H:\filepath\term_rep.csv | select-object "Inactive Emp Name","User ID","Loc","Equipment Descr","Tag Number","Serial Number"
$table= $data | Format-Table -GroupBy "User ID"
foreach($i in $file)
{$user = $i | select-object -expandproperty "Inactive Emp Name"
$uid= $i | select-object -expandproperty "User ID"
$manager = $i | Select-Object -expandproperty "Manager"
$loc= $i | select -ExpandProperty "Loc"
$tagnum= $i | select -ExpandProperty "Tag Number"
$sernum= $i | select -ExpandProperty "Serial Number"
$path="C:\filepath\term_email.txt"
$newpath = [system.io.path]::GetTempFileName()
(Get-content $path) -replace "USER_NAME",$user `
-replace "USER_ID",$uid | out-file $newpath
foreach($id in $table){
(Get-Content $newpath) -replace "EQUIPMENT_LIST", $id | out-file $newpath
}
$subject="Equipment for user $uid"
$body= get-content $newpath
$mail = $ol.CreateItem(0)
$mail.To = $manager
$mail.CC = $null
$mail.Subject = $subject
$mail.Body = $body -join "`n"
$mail.save()}
【问题讨论】:
-
那是另一个问题,但通常他们在这里遇到的问题是在使用
Format-Table格式化数据后尝试对数据进行操作。格式化任何东西都应该是管道中的最后一个操作 -
我不同意这是一个单独的问题。我最初的问题是如何以有用的格式格式化和分离这个 .csv 中的信息。您的建议对格式化部分很有帮助,但对分离没有帮助。
-
事实上,他是对的,有点。我认为这是一个糟糕的措辞选择。不是你的错,但“格式”这个词在 PowerShell 中是一种特殊的词,因为它指的是用于格式化数据以进行演示的许多 cmdlet,而不是用于进一步使用。
Import-CSV的本质是创建一个可用于创建电子邮件的表。Format-Tablecmdlet 只是以人类易于使用的格式显示该表。如果您想捕获并进一步使用该点之后的数据,您真的需要停止使用Format-Table。 -
如果我的问题误导了我,我深表歉意,我对 powershell 还是很陌生。如果有更好的方法,我很乐意停止与 Format-Table 的斗争并以另一种方式来做。
-
@TheMadTechnician 我编辑了问题的标题以更好地适应。如果我应该进行任何其他编辑以使问题更准确,请告诉我:)
标签: powershell csv powershell-5.0