Странное поведение Powershell с помощью Import-CSV - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующий код powershell:

clear;
$importedIDs = (Import-Csv "testing.csv" -Delimiter ';').id;

Write-Host $importedIDs.Length;

for ($i=0; $i -lt $importedIDs.Length; $i++) {
  Write-Host $($importedIDs[$i]);
}

Цель состоит в том, чтобы прочитать только столбец id в CSV-файле, который выглядит следующим образом:

"created";"id"
"2018-04-04 21:03:01";"123456"
"2018-04-04 21:03:01";"123457"

При наличии двух или более строк результат будет таким, как ожидалось:

2
123456
123457

Однако, когда в файле csv есть только 1 строка (строка с идентификатором 123456), получается:

6
1
2
3
4
5
6

Желаемый результат будет:

1
123456

Может кто-нибудь объяснить, почему это происходит и как я могу это исправить? Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

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

Вместо использования цикла for для циклического прохождения каждого элемента в массиве, где «элемент» может ссылаться на строку в массиве строк или символ в строке, вы можете использовать цикл foreach и цикл по элементам в массиве, как это. foreach не будет обрабатывать строку как массив символов

clear;
$importedIDs = (Import-Csv "testing.csv" -Delimiter ';').id;

Write-Host $importedIDs.Length;

foreach ($importedID in $importedIDs) {
  Write-Host $($importedID);
}
0 голосов
/ 07 мая 2018

Если в csv есть несколько строк, вы получите массив строк. Один элемент массива на строку. Поэтому индекс применяется к строкам. Если есть только одна строка, вы не получите массив, содержащий одну строку, как вы, вероятно, ожидаете. Вы получаете одну строку вместо. При использовании индекса для строки powershell обрабатывает строку как массив символов и поэтому возвращает только один символ.

...