当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 基础知识:导航 CSV 文件

作者:精品下载站 日期:2024-12-14 06:21:26 浏览:13 分类:玩电脑

PowerShell 基础知识:导航 CSV 文件


在本教程中,我们将深入探讨使用 PowerShell 处理 CSV 文件的基本知识,涵盖您在现实世界中可能遇到的各种场景。本指南将帮助系统管理员和 IT 专业人员有效地管理数据,展示 PowerShell 在处理不同类型的 CSV 文件方面的强大功能和灵活性。

为了做好准备,让我们创建一个简单的 CSV 文件来使用。

@(
	[pscustomobject]@{
		FirstName = 'Joe'
		LastName = 'Jones,Barrett'
		Address = '453 1st St'
		City = 'Phoenix'
		State = 'AZ'
	},
	[pscustomobject]@{
		FirstName = 'Jose'
		LastName = 'Melindez'
		Address = '5663 Main St'
		City = 'Atlanta'
		State = 'GA'
	}
) | Export-Csv -Path ~Employees.csv

并使用 Get-Content 阅读它。

Get-Content -Path ~Employees.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

没什么太奇特的,只是一个包含几个虚构员工的 CSV 文件。需要注意的一些事项稍后会派上用场;请注意,此 CSV 文件使用逗号作为字段分隔符和引号。引号将每个字段值括起来,因此您甚至可以在字段值内部使用分隔符(本例中为逗号),如“Jones-Barrett”示例。那是一个领域。

另外,请注意我使用了 Get-Content cmdlet。这个 cmdlet 并不智能;它默认读取一个文本文件,并将内容作为字符串数组输出。让我们检查一下 Get-Content 为每个 CSV 行返回的对象类型。

Get-Content -Path ~Employees.csv | Get-Member

[玩转系统] PowerShell 基础知识:导航 CSV 文件

您会看到它返回一个简单的字符串。实际上,它是一个字符串数组。如果我使用不太常见的一元运算符来阻止 PowerShell 展开数组......

,(Get-Content -Path ~Employees.csv) | Get-Member

[玩转系统] PowerShell 基础知识:导航 CSV 文件

您可以看到 Get-Content 返回一个对象数组,在本例中是字符串。由于有左括号和右括号,它是一个数组。

如果我查看单个对象,您会发现它只是 CSV 文件的整行,包括逗号和引号。

Get-Content -Path ~/Employees.csv | Select-Object -First 1

[玩转系统] PowerShell 基础知识:导航 CSV 文件

对于每个 CSV 文件行,我们需要对象,而不是原始字符串。我想要将字段作为对象属性的对象。为此,我可以使用 Import-Csv cmdlet。

Import-Csv -Path ~/Employees.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

看起来好多了。它智能解析了整个CSV文件,将CSV文件中的标题行转换为对象属性名称,并将字段值作为属性值。现在让我们检查一下对象类型。

Import-Csv -Path ~/Employees.csv | Get-Member

[玩转系统] PowerShell 基础知识:导航 CSV 文件

您现在可以看到输出对象类型为 System.Management.Automation.PSCustomObject ;不仅仅是一个字符串。 Import-Csv cmdlet 知道 CSV 文件的结构,并且能够将其转换为一组 PSCustomObject。

这是您可能会遇到的另一种类型的 CSV 文件。

Get-Content -Path ~Employees-withcommasnoquotes.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

注意到区别了吗?没有引号,请注意第二行Jones,Barrett。这个逗号实际上是乔名字的一部分。 Barrett 值不是他的地址。

仅供参考:我使用以下代码创建了该 CSV 文件:

@(
	[pscustomobject]@{
		FirstName = 'Joe'
		LastName = 'Jones,Barrett'
		Address = '453 1st St'
		City = 'Phoenix'
		State = 'AZ'
	},
	[pscustomobject]@{
		FirstName = 'Jose'
		LastName = 'Melindez'
		Address = '5663 Main St'
		City = 'Atlanta'
		State = 'GA'
	}
) | Export-Csv -Path ~Employees.csv

(Get-Content -Path ~Employees.csv).replace('"','') | Set-Content -Path ~Employees-withcommasnoquotes.csv

让我们看看 Import-Csv 如何处理这个问题。

Import-Csv -Path ~Employees-withcommasnoquotes.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

那是不对的。 LastName 字段右侧的所有字段值都是错误的。 Import-Csv 使用其名称中的逗号作为字段分隔符。这就是引号发挥作用的地方。引号定义了整个字段,分隔符告诉 Import-Csv 字段在哪里结束和开始。

让我们换个话题,现在介绍您可能会遇到的一种场景。回想一下我之前提到的,CSV 技术上应该具有用逗号分隔的字段。好吧,有时您会发现“CSV”文件具有不同的分隔符(例如制表符)。默认情况下,Import-Csv cmdlet 不喜欢这样。

例如,我这里有一个 CSV 文件...

Import-Csv ~/Employeeswithtabs.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

事情看起来不太对劲。 Import-Csv 尚未将每一行转换为对象。那是因为它正在寻找逗号作为字段分隔符。如果我查看这个文件...

Get-Content ~/Employeeswithtabs.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

您会看到字段是用制表符而不是逗号分隔的。幸运的是,有一个快速解决办法。只需使用 Delimiter 参数即可。

Import-Csv ~/Employeeswithtabs.csv -Delimiter "`t"

[玩转系统] PowerShell 基础知识:导航 CSV 文件

现在输出看起来好多了。 Import-Csv 现在正在寻找制表符作为字段分隔符而不是逗号,并且正在正确解析 CSV 文件。

为了完善这个演示,我们现在再介绍一个场景;没有标题的 CSV。也许您从某个古老的 HR 数据库中收到了一个 CSV 文件,其中没有看起来像这样的标题。

Get-Content -Path ~Employees-noheaders.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

当您尝试使用 Import-Csv 读取 CSV 时,会发生这种情况。

Import-Csv -Path ~Employees-noheaders.csv

[玩转系统] PowerShell 基础知识:导航 CSV 文件

Import-Csv 没有与值关联的字段名称,因此它使用顶行作为标题并使它们成为属性名称。这是不对的。您可以修改 CSV 并以这种方式添加标头,但我总是更喜欢尽可能保持文件不变。要使 Import-Csv 具有有效标头,请使用 Header 参数。

Import-Csv -Path ~Employees-noheaders.csv -Header 'FirstName','LastName','Address','City','State'

[玩转系统] PowerShell 基础知识:导航 CSV 文件

好多了!当您使用 Header 参数并指定逗号分隔列表时,Import-Csv 使用从左到右的该组值作为字段名称,而不是字段名称的第一行CSV 文件。此参数允许您解析没有标题的 CSV 文件,而无需修改原始文件。

您现在应该能够获得使用 PowerShell 读取 CSV 文件的更好体验!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯