windows - Powershell Mærkelig adfærd med Import-CSV

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har følgende powerhell kode:


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

Write-Host $importedIDs.Length;

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


Målet er at kun læse id-kolonnen i csv-filen, der ser sådan ud:


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


Når der er to eller flere rækker, er outputen som forventet:


2
123456
123457


Men når der kun er 1 række i csv-filen (række med id 123456), er outputen:


6
1
2
3
4
5
6


Ønsket output ville være:


1
123456


Kan nogen forklare, hvorfor dette sker, og hvordan kan jeg rette op på dette?
Enhver hjælp er værdsat

Bedste reference


Hvis der er flere rækker i csv, får du en række strings. Et array-element pr. Række. Derfor gælder indekset for rækkerne. Hvis der kun er en række, får du ikke et array indeholdende en streng, som du sandsynligvis ville forvente. Du får en enkelt streng i stedet. Når du bruger et indeks på en streng, behandler powerhell strengen som en række tegn og returnerer derfor kun en char.

Andre referencer 1


Du kan let omskrive dit script for at omgå problemet beskrevet af J. Bergmann.


I stedet for at bruge en for loop til at løbe gennem hvert element i arrayet, hvor et 'element' kan referere til en streng i et streng-array eller et tegn i en streng, kan du bruge en foreach loop og loop gennem elementer i et array som dette. foreach vil ikke behandle en streng som et tegnrækkefølge


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

Write-Host $importedIDs.Length;

foreach ($importedID in $importedIDs) {
  Write-Host $($importedID);
}