代码之家  ›  专栏  ›  技术社区  ›  Heather

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

  •  2
  • Heather  · 技术社区  · 7 年前

    我使用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 回复  |  直到 7 年前
        1
  •  2
  •   henrycarteruk    7 年前

    由于您不想处理文件中的数据,我们可以将文件视为纯文本,只需添加字符串 ,"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"
    
        2
  •  2
  •   JohnLBevan    7 年前

    问题似乎是您的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
    

    James's Answer 在简单性和性能方面更好。提供此答案是为了显示更友好的CSV方法;如果您希望将数据更像一个真正的CSV(例如,使用现有列中的数据/诸如此类的内容),而不仅仅是操作文件中的字符串。

        3
  •  0
  •   Mike Twc    7 年前

    若要解决计算列的问题,只需向其添加名称

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

    推荐文章