Добавление столбца в CSV оставляет одинарную кавычку вокруг первой записи - PullRequest
0 голосов
/ 07 декабря 2018

Я использую 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 голосов
/ 07 декабря 2018

Чтобы исправить проблему с вычисляемым столбцом, просто добавьте к нему имя

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

Хотя лучше добавить «FALSE» в виде строки.

0 голосов
/ 07 декабря 2018

Кажется, проблема в том, что в вашем 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 (например, использовать данные из существующих столбцов / подобные вещи), а не просто манипулировать строками в файлах.

0 голосов
/ 07 декабря 2018

Поскольку вы не хотите обрабатывать данные в файле, мы можем рассматривать файл как обычный текст и просто добавить строку ,"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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...