推荐一首纯音乐: http://music.163.com/#/album/36141316/
Good Night - Delos
今天接着讲powershell平时文件操作中的另一个经常需要用到的类型:CSV
csv一般用来批量导入/导出数据的时候使用,比如创建用户,获取用户信息,系统信息… 而且主流数据库都支持csv格式,可以无缝对接。其一般默认以逗号,为分隔符,以第一行为表头。当然你也可以指定特殊的分隔符和表头。
常见命令
以下为powershell自带的csv相关命令:(NOTE:我有时候为了省事会写cmdlets的alias,你可以用Get-Help alias查看其对应的全称和用法. 如下查询则为: "Get-Help gcm")
ConvertFrom-Csv/Import-Csv
这2个cmdlets都是试图读取csv格式的数据,主要区别ConvertFrom-Csv接受的是一个对象,而Import-Csv接受的是文件。
它们对于非标准csv格式数据会有不同的处理方式,如下试图读取txt文本转化为csv:
ConvertTo-Csv/Export-Csv
这2个cmdlets都是试图转化非csv格式数据到csv格式,ConvertTo-Csv返回的是一个对象,而Export-Csv是保存到文件中。这里需要提一点的就是我们在powershell console当中看到的cmdlets打印到屏幕的data只是很有限的信息,而ConvertTo-Csv/Export-Csv是会将对象的全部数据转化的。
参考链接
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertfrom-csv?view=powershell-6
https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Utility/Import-Csv?view=powershell-6
https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Utility/ConvertTo-Csv?view=powershell-6
https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Utility/Export-Csv?view=powershell-6
PSCustomObject HashTable & CSV
我们之前讲哈希表的时候,大家有没有发现其看起来很像csv的数据格式。
但是如果你试图将其转化为csv,你会发现数据格式完全不是我们在console看到那些数据:
这个时候我们就可以用PSCustomObject来实现上面的需求(powershell V3.0之前请用PSObject,其实还可以用别的方法,这个后面会专门写篇文章来讲)
所以我们在需要使用hashtable而又同时需要涉及到其与csv的交互,请使用这种方式。
获取未知csv的有序表头
当我们处理csv数据时,表头是关键的信息,在不知道表头的情况下,对csv数据的处理基本寸步难行,那么如何获取它呢?
目前powershell没有直接类似.Header的这种属性供你直接访问,我们只能通过间接的手段获取。一开始我想到的是用下面的方法获取:
但是这只能解决常规或者说默认情况下的csv数据,如果遇到一些奇怪格式的csv,比如表头或者数据本身就包含双引号或者分隔符(当然一般情况下不会这样,但是我们的代码肯定要保证任何情况下都能work才行。)而且上一种方法,用cat去获取表头进行了一次IO操作,后面用ipcsv读取又进行了一次IO操作,造成了不必要的开销。
23-weird_format_csv
后来面向google编程后查到了下面的方法:
这个我们成功的获取到了表头,并能够通过表头获取到对应的属性值。而且只进行了一次IO操作。至于psobject在这里什么一次,后续会有专门的讲解,大家先了解这种使用方法即可。大家有什么更好的方法也可以和我说。
领取专属 10元无门槛券
私享最新 技术干货