【发布时间】:2016-08-24 02:45:35
【问题描述】:
我有一个包含以下提取行的 csv 文件:
“员工 ID”、“名字”、“姓氏”、“位置”、“部门”、“电话号码”、“电子邮件”
"000001 ","abc ","def ","Loc1"," "," ","name1@company.com "
"000023 ","ghi ","jkl ","Loc2"," "," ","name2@company.com "
"000089","mno","pqr","Loc2","","","name3@company.com"
如何保留引号并排序并保存为 csv 文件?
我有以下 powershell 源脚本,它适用于列没有双引号的 csv 文件:
Get-Content $Source -ReadCount 1000 |
ConvertFrom-Csv -Delimiter $Delimiter |
Sort-Object -Property $NamesOfColumns -Unique |
ForEach-Object {
# Each of the values in $ColumnValueFormat must be executed to get the property from the loop variable ($_).
$values = foreach ($value in $ColumnValueFormat) {
Invoke-Expression $value
}
# Then the values can be passed in as an argument for the format operator.
$ShowColsByNumber -f $values
} |
Add-Content $Destination;
$Source、$Delimiter、$NamesOfColumns 和 $ColumnValueFormat 是动态给出或构建的。
$ColumnValueFormat 带有未引用的 csv 文件包含:
$_.EmployeeID.Trim()
$_.FirstName.Trim()
$_.LastName.Trim()
$_.Location.Trim()
$_.Department.Trim()
$_.TelephoneNo.Trim()
$_.Email.Trim()
$ColumnValueFormat 带引号的 csv 文件包含:
$_."EmployeeID".Trim()
$_."FirstName".Trim()
$_."LastName".Trim()
$_."Location".Trim()
$_."Department".Trim()
$_."TelephoneNo".Trim()
$_."Email".Trim()
问题似乎是基于 $ColumnValueFormat 将列标题放在双引号中。 (如果我删除它们,我不确定 cmdlet 的内部是否会在处理行时识别列标题)
我有两个问题:
- 用双引号括起来的列标题。问题似乎是基于
$ColumnValueFormat将列标题放在双引号中,因为它不处理行。 (如果我删除双引号,那么它在处理行时无法识别列标题)。 - 我在最后一分钟遇到的另一个问题是,如果最后一列是空白的,它会认为它是一个空值,并且当
Invoke-Expression $value执行时(其中$value包含$_.Email.Trim()的最后一列表达式 - 在未引用的 CSV 文件上) 它会爆炸。如果我尝试将语句放在 try/catch 块中,它只会忽略它,最后一列不会添加到$values数组中并再次炸弹。
【问题讨论】:
-
你想用你的脚本实现什么?
-
感谢您的回复。只需处理 CSV 文件,无论 CSV 文件的列是否有双引号,以及最后一列是否包含空白,因为它看到一个回车以允许包含 $_.Email.Trim( ) 表达式来执行,因此它可以在 $values 数组中放置一个额外的元素,该数组包含一个空白(由 ForEach 循环的完成分配)。
标签: powershell