Powershell 将列添加到CSV会在第一条记录周围留下一个引号

Powershell 将列添加到CSV会在第一条记录周围留下一个引号,powershell,csv,Powershell,Csv,我使用CSV导入另一个PS脚本的哈希表;但是,我需要在CSV中添加一列,并用字符串FALSE填充该列 "Culture\\Cities_ArcGIS" "Culture\\Counties_ArcGIS" "Culture\\States_ArcGIS" 该脚本运行良好,但有一点除外:它在添加的列(“'FALSE'”)的第一个字符串周围保留单引号,如下所示: "Culture Data\\Cities_ArcGIS","'FALSE'" "Culture Data\\Counties_ArcGI

我使用CSV导入另一个PS脚本的哈希表;但是,我需要在CSV中添加一列,并用字符串
FALSE
填充该列

"Culture\\Cities_ArcGIS" "Culture\\Counties_ArcGIS" "Culture\\States_ArcGIS" 该脚本运行良好,但有一点除外:它在添加的列(
“'FALSE'”
)的第一个字符串周围保留单引号,如下所示:

"Culture Data\\Cities_ArcGIS","'FALSE'" "Culture Data\\Counties_ArcGIS","FALSE" "Culture Data\\States_ArcGIS","FALSE" “文化数据\\城市\u ArcGIS”,“假” “区域性数据\\countries\u ArcGIS”,“FALSE” “区域性数据\\表示\u ArcGIS”,“假”
如何防止新列中的第一个字符串周围出现单引号?

由于您不想处理文件中的数据,我们可以将文件视为纯文本,只需在每行末尾添加字符串
,“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" “文化\\城市\u ArcGIS” “文化\\县\u ArcGIS” “区域性\\状态\u ArcGIS” 和输出:

"Culture Data\\Cities_ArcGIS","FALSE" "Culture Data\\Counties_ArcGIS","FALSE" "Culture Data\\States_ArcGIS","FALSE" “区域性数据\\Cities\u ArcGIS”,“假” “区域性数据\\countries\u ArcGIS”,“FALSE” “区域性数据\\表示\u ArcGIS”,“假”
若要解决计算列的问题,只需向其添加名称

import-csv test.csv | select  *, @{Name="FALSE"; Expression={"FALSE"}}

虽然只是将“FALSE”作为字符串附加是一个更好的主意。

问题似乎是您的CSV文件没有任何标题

以下是如何读取没有标题的CSV文件(假设您知道有多少列):

现在,您已经导入了数据,保留了第一行,并给出了所有列的名称,因此它们被视为自定义对象数组上的属性

您已经知道如何添加新属性/列:

$data = $data | Select-Object *, @{Name='NewColumn';Expression={$false}} 
上面我使用了
$false
而不是
'false'
,但这里没有什么区别,两者都将在最终的CSV中创建相同的输出

最后,您需要将新数据输出到CSV。要做到这一点,您需要一种方法来创建一个没有标题的CSV文件。没有
-NoHeader
选项,因此这里的诀窍是将
导出Csv
切换为
转换为Csv
,从而创建内存中的Csv;然后使用
Select Object-Skip 1
跳过数组中的第一项(即标题行),然后使用
Set Content
将此数据保存到文件中:

$data | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content -Path $csvFile -Force

注意:在简单性和性能方面更好。提供此答案是为了显示更友好的CSV方法;如果您想将数据更像是一个真正的CSV(例如,使用现有列中的数据/类似的东西),而不仅仅是处理文件中的字符串。

您的输出文件不是CSV,它不会使用逗号分隔列(或具有标题)。。。您能提供输入文件的示例吗?为了保护隐私,删除了所有标识数据(只是
xxxxxx
it out)。为了便于阅读,我将输出结构化为Excel格式。它实际上是一个CSV,在空格处使用逗号。Excel隐藏了文件结构和格式,因此使用原始数据对我们更好地理解正在发生的事情。谢谢你,James!您的解决方案实际上帮助我完善了我的脚本,并回答了我遇到的其他一些问题。我真的很感谢你的帮助!:)有时,我被Excel中的CSV文件的想法迷住了,忘记了它们只是一个文本文件。
$data = $data | Select-Object *, @{Name='NewColumn';Expression={$false}} 
$data | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content -Path $csvFile -Force