在CSV中添加列会在第一条记录周围留下单引号

时间:2018-12-07 14:21:06

标签: powershell csv

我正在使用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"

如何在新列的第一个字符串周围保持单引号?

3 个答案:

答案 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”作为字符串附加是一个好主意。