我正在使用CSV导入另一个PS脚本的哈希表;但是,我需要在CSV中添加一列,并使用字符串FALSE
填充该列。
"Culture\\Cities_ArcGIS" "Culture\\Counties_ArcGIS" "Culture\\States_ArcGIS"
(Import-Csv U:\To_Delete\Layer_search\WB_layers-mod.csv) |
Select-Object *,@{Expression={'FALSE'}} |
Export-Csv U:\To_Delete\Layer_search\WB_layers-mod.csv -NoTypeInformation
此脚本除了以下几点以外,效果很好:它在添加的列("'FALSE'"
)中的第一个字符串周围留下单引号,如下所示:
"Culture Data\\Cities_ArcGIS","'FALSE'" "Culture Data\\Counties_ArcGIS","FALSE" "Culture Data\\States_ArcGIS","FALSE"
如何在新列的第一个字符串周围保持单引号?
答案 0 :(得分:2)
由于您不想处理文件中的数据,我们可以将文件视为纯文本,只需将字符串,"FALSE"
添加到每一行的末尾即可。
(Get-Content U:\To_Delete\Layer_search\WB_layers-mod.csv) |
foreach {$_ + ',"FALSE"'} |
Set-Content U:\To_Delete\Layer_search\WB_layers-mod.csv
这将花费:
"Culture\\Cities_ArcGIS" "Culture\\Counties_ArcGIS" "Culture\\States_ArcGIS"
并输出:
"Culture Data\\Cities_ArcGIS","FALSE" "Culture Data\\Counties_ArcGIS","FALSE" "Culture Data\\States_ArcGIS","FALSE"
答案 1 :(得分:2)
问题似乎是您的CSV文件没有任何标题。
这里是读取不带标题的CSV文件的方法(假设您知道有多少列):
$csvFile = 'U:\To_Delete\Layer_search\WB_layers-mod.cs'
$headers = 'Column1' #add column headers here as needed; e.g. 'Column1','Column2','etc.'
$data = Import-CSV -Path $csvFile -Header $headers
您现在已经导入了数据,保留了第一行,并为所有列指定了名称,以便将它们视为自定义对象数组上的属性。
您已经知道如何添加新的媒体资源/列:
$data = $data | Select-Object *, @{Name='NewColumn';Expression={$false}}
在上述示例中,我使用的是$false
而不是'False'
,但是在这里没什么区别,两者都会在最终的CSV中创建相同的输出。
最后,您需要将新数据输出到CSV。为此,您需要一种创建不带标题的CSV文件的方法。没有-NoHeader
选项,因此这里的窍门是将Export-Csv
切换为ConvertTo-CSV
,从而创建内存中CSV;然后使用Select-Object -Skip 1
跳过数组中的第一项(标题行),然后使用Set-Content
将这些数据持久保存到文件中:
$data | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content -Path $csvFile -Force
NB:James's Answer在简单性和性能方面更好。提供此答案是为了显示一种更加CSV友好的方法;如果您想将数据更像是真正的CSV(例如,使用现有列中的数据或类似的东西),而不仅仅是处理文件中的字符串。
答案 2 :(得分:0)
要解决计算列的问题,只需在其中添加名称
import-csv test.csv | select *, @{Name="FALSE"; Expression={"FALSE"}}
尽管仅将“ FALSE”作为字符串附加是一个好主意。