Powershell Изменить данные в столбце CSV, который не имеет заголовков - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно изменить столбец CSV, в котором нет заголовков.

Вот мои тестовые данные с заголовками:

data.csv:

order|color|shape
1|green|square
1|red|rectangle

А вот что я использовал, чтобы изменить первый столбец на 0.

$ImportedCSV = Import-CSV data.csv -Delimiter '|'
$NewCSV = Foreach ($Entry in $ImportedCsv) {
    Switch ($Entry."order") {
        1 {$Entry."order" = "0"}
    }
    $Entry
}
$NewCSV | Export-CSV done.csv -Delimiter '|' -NoTypeInformation

(Get-Content -Path done.csv ).Replace('"','') | Set-Content -Path done.csv

В результате получилось следующее:

order|color|shape
0|green|square
0|red|rectangle

В моем файле data.csv не будет заголовков для начала.

Может ли "Switch ($ Entry." Order ")" использовать номера столбцов вместо имени заголовка?
Итак, что-то вроде "Столбец 1", а не "order"?

Пожалуйста, не упоминайте о простом добавлении заголовков, а затем удалите заголовки, когда закончите.
В конце мне нужно изменить данные столбца на основе номера столбца, а не имени заголовка.

Итак ... замените ($ Entry. "Order") на что?

($ Entry.Column 1) = нет
($ Entry.Column-1) = нет

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

В случае, если разделитель известен и уникален (не входит в данные столбца в кавычках)

Вы можете получить количество столбцов

$delim = '|'
$Cols = (get-Content .\data.csv|select -first 1).split($delim).Count

и автоматически применять пронумерованный заголовок

$csv = Import-Csv .\data.csv -Delim $delim -Header @(1..$Cols)

> $csv

1 2      3
- -      -
7 purple square
8 gold   star
9 blue   triangle

Управление столбцами в ForEach

$csv | ForEach-Object { $_.1 = 0 }

> $csv

1 2      3
- -      -
0 purple square
0 gold   star
0 blue   triangle

А затем сохранить, удалить кавычки и заголовок, если необходимо.

0 голосов
/ 10 ноября 2018

Предположим, у вас есть:

data_noheader.csv

7|green|square
8|red|rectangle
9|blue|triangle

И вы хотите изменить зеленый квадрат (в первом ряду) на фиолетовый, а элемент, где col0 - 8, на золотую звезду.

Изменится несколько вещей:

  1. Явно установите заголовок с помощью -Header, чтобы первая строка не считалась заголовком.
  2. Редактировать $NewCSV вместо того, чтобы составлять его с помощью ForEach (это не требуется, но делает код более легким для понимания и работы)
  3. Вместо зацикливания ForEach и просмотра имени столбца, строка выбирается явно для вещей, которые вы хотите изменить в фактической строке.
  4. Для вещей, которые вы хотите изменить в зависимости от значения столбца, используйте шаблон, аналогичный тому, который вы использовали ранее, и просто проверьте значение.
  5. Снять заголовок с помощью Select-Object -Skip 1
$NewCSV = Import-CSV data_noheader.csv -Delimiter '|' -Header @("col0", "col1", "col2")
$NewCSV[0].col1 = "purple" # Set based on the actual row position
ForEach ($Entry in $NewCSV) {
    If ($Entry.col0 -Eq "8") { # Modify data in other columns in a row based on the value of a particular column
        $Entry.col1 = "gold"
        $Entry.col2 = "star"
    }
}
$NewCSV | Export-CSV done_noheader.csv -Delimiter '|' -NoTypeInformation

(Get-Content -Path done_noheader.csv ).Replace('"','') | Select-Object -Skip 1 | Set-Content -Path done_noheader.csv

Результат в done_noheader.csv теперь будет:

7|purple|square
8|gold|star
9|blue|triangle
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...