【问题标题】:Import-Csv Powershell导入-CSV Powershell
【发布时间】:2017-10-13 11:37:13
【问题描述】:

代码:

$Computers = Import-Csv -Path C:\temp\Computers.csv
write-host $Computers

CSV 文件(其中 US-1 为 A1,US-2 为 A2,依此类推)

US-1
US-2
US-3
US-4

我相信 Import-Csv 导入不正确,因为 Write-Host $Computers 给了我这个:

@{US-1=US-2} @{US-1=US-3} @{US-1=US-4}

但是如果 $Computers 是这样分配的:

$Computers = "US-1", "US-2", "US-3", "US-4"

输出正确:

US-1 US-2 US-3 US-4

因此,为了方便起见,我需要从 CSV 导入,但要以正确的方式保存每个计算机名称,不带括号或符号。这使得在我的程序的其余部分中使用计算机名称非常困难。

编辑:如上所述,我已经正确格式化了 csv,现在是这样的:

Computers,
US-1
US-2
US-3
US-4

现在得到输出:

@{Computers=US-1} @{Computers=US-2} @{Computers=US-3} @{Computers=US-4}

【问题讨论】:

  • 奇怪的输出。 $Computers 是什么数据类型?
  • 默认数据类型,很可能是字符串,不确定。如果我为堆栈溢出创建的整个测试程序,你会看到什么
  • 发布您的 CSV 文件样本
  • $Computers.gettype() 的输出是什么?
  • Import-csv 将第一条记录解释为标题,而您希望它是数据。因此,它将 csv 数据解码为一个字段,命名为 US-1。请参阅下面 Jeff Zeitlin 的回答。

标签: powershell csv


【解决方案1】:

简单的 CSV

创建您的 CSV (computers.csv):

Computer
US-1
US-2
US-3

导入您的 CSV:

$computers = Import-Csv Computers.csv

访问您的价值观:

Write-Host $computers # This results to something like this: @{Computers=US-1} @{Computers=US-2} @{Computers=US-3} @{Computers=US-4}
# This is perfectly fine. It's all of your computer-objects

访问每个值:

write-host $computers[n] # replace n with your index, starting at 0 to n-1
write-host $computers[1] # results in US-2

如果只对计算机感兴趣,您可以这样做:

write-host $computers.Computer # restults in US-1 US-2 US-3 US-4

同样适用于更大的 CSV:

Computers, OperatingSystem
US-1, Windows
US-2, Linux
US-3, SomeOtherUnix
US-4, MacOS

导入您的 CSV:

$computers = Import-Csv Computers.csv

访问您的价值观:

Write-Host $computers # This results to something like this: 
# @{Computers=US-1; OperatingSystem=Windows} @{Computers=US-2; OperatingSystem=Linux} @{Computers=US-3; OperatingSystem=SomeOtherUnix} @{Computers=US-4; OperatingSystem=MacOS}
# This is perfectly fine. It's all of your computer-objects

访问每个值:

write-host $computers[n] # replace n with your index, starting at 0 to n-1
write-host $computers[1] # results in 

Computers OperatingSystem
--------- ---------------
US-1      Windows

如果只对计算机/操作系统感兴趣,您可以这样做:

write-host $computers.Computers # restults in US-1 US-2 US-3 US-4
write-host $computers.OperatingSystem # restults in US-1 US-2 US-3 US-4

等等... :)

【讨论】:

  • comp 是什么意思?我稍后也会使用 for each 循环,所以我不能引用单个计算机
  • nvm,想通了,我的脚本现在运行良好,谢谢!
  • 我的错!我将 $comp 作为我的脚本变量,其中包含 $computers。为了便于阅读,我将编辑我的帖子。
【解决方案2】:

您的 CSV 文件格式不正确;它没有标题行。要么重新生成文件,使其具有标题行,要么使用 -Header 参数到 Import-CSV

一旦您拥有格式正确的 CSV(或使用手动提供的标头导入),您就可以将 $computers 引用为 PSObject 数组,其中每个 PSObject 都包含一个具有所提供名称的成员 - 对于例如,如果你使用了

$Computers = Import-CSV -Header "RegionName" -Path C:\TEMP\Computers.CSV

那么您可以将各个记录称为$Computers[$n].RegionName

修改原始问题后,访问数组中各个项目的正确方法是$Computers[$n].Computers。要按照最初的描述从文本文件中检索计算机,而不需要使用字段名称,请使用 Get-Content 而不是 Import-CSV

【讨论】:

  • 您好,我查看了有关创建 csv 标头的指南,现在我的 csv 文件如下所示:
  • 如果您更改了 CSV,但仍有问题,请更新您的问题以反映这一点 - 或提出新问题。
  • 是的,对不起,我在评论中按了新行并发布了它,我编辑了我的原始帖子
  • 标题“computer”是单数还是复数?
  • @WalterMitty - 您的选择,但您需要使用标题中使用的任何一个来引用它。您的示例将标题设为“计算机”,因此您必须在结果对象中引用该字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 2018-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多