CSV(逗号分隔值)是一种以纯文本文件存储数据的方式。它是一种共享结构化信息的有效方法,类似于电子表格。它是一种通用格式,被众多办公和数据库应用程序所支持。
CSV这个术语还有其他含义,例如,"字符分离值"、"逗号分隔文件 "等。
在本指南中,我们将演示如何在PowerShell中以CSV格式导出数据。
CSV文件结构
CSV格式遵循一个非常简单的结构。任何CSV文件都有".csv "作为文件扩展名。在这里,我生成了一个样本CSV文件,包含
$ cat sample.csv
我们可以看到,每一行都包含几个由逗号分隔的数值。一个CSV文件可以包含多少个条目是没有限制的。
结构的简单性是关键特征。CSV格式的设计使得它可以很容易地被用来将数据导出到其他程序中。其结果也是人类可读的,可以使用任何文本编辑器查看。像MS Excel、Calc等办公软件也默认支持CSV。
从PowerShell导出到CSV
PowerShell是一种强大的外壳和脚本语言。它支持许多基本和高级功能,包括将各种数据导出为CSV格式。
与其他的shell类似,PowerShell有自己的一套命令,称为cmdlets。要导出到CSV,PowerShell有一个专门的cmdletExport-CSV。它把一个对象作为输入,并把它导出到一个CSV文件。
由于结构简单,它也可以使用Set-Contentcmdlet来实现。然而,它需要你手动定义CSV结构。使用Export-CSV可以大大减少工作量。
Export-CSV的帮助页面将显示所有支持的命令。
$ help Export-CSV
一个实际的例子是导出运行进程的列表。它在某些调试/监控的情况下是很有用的。为了得到进程的列表,我们将使用cmdletGet-Process。
$ Get-Process
现在,用管道将输出转为Export-CSV。
$ Get-Process | Export-CSV -Path /home/viktor/Desktop/processes.csv
这里,标志"-Path "描述了保存生成的CSV文件的位置。要检查CSV文件的内容,使用cmdletGet-Content。
$ Get-Content /home/viktor/Desktop/processes.csv
自定义定界符
对于任何CSV文件,使用逗号(,)作为分隔符是标准的。然而,在某些情况下,你可能想把定界符改为逗号以外的东西。Export-CSV cmdlet支持为CSV文件设置一个自定义定界符。它可以是任何字符。
在下面的例子中,我们将使用分号(;)作为分界符。
$ Get-Process | Export-CSV -NoTypeInformation -Delimiter ";" -Path /home/viktor/Desktop/processes.csv
让我们检查该命令的输出。
$ Get-Content /home/viktor/Desktop/processes.csv
追加到现有的CSV文件
Export-CSVcmdlet支持向现有的CSV文件添加内容。它可以帮助将数据编入一个单一的数据库。
要追加,添加标志"-Append"。使用现有CSV文件的位置作为"-Path "的值。
$ Get-Process | Export-CSV -Append -Path /home/viktor/Desktop/processes.csv
选择要写入CSV的属性
让我们先快速看一下Get-Process的输出。
$ Get-Process
在这里,每一列都展示了关于当前运行的进程的某种类型的信息。每一列都代表相关进程的一个属性。到目前为止,我们一直在处理进程的所有属性(将它们转移到CSV文件中)。然而,并不是所有的属性对每一种情况都是必要的。
我们可以添加一个中间过滤器,只获得少数几个属性的选择。要做到这一点,我们要借助另一个cmdlet的帮助 选择-对象.
在下面的例子中,我们只输出进程名称(ProcessName)和ID(Id)。
$ Get-Process | Select-Object -Property ProcessName,ID | Export-CSV -NoTypeInformation -Path /home/viktor/Desktop/processes.csv
$ Get-Content /home/viktor/Desktop/processes.csv
不覆盖
如果不追加到现有文件,Export-CSV将默认覆盖现有文件。在许多情况下,这可能会导致重要的日志被无端删除。为了避免这种意外,我们可以告诉Export-CSV默认不覆盖现有文件。
要做到这一点,添加标志"-NoClobber"。
$ Get-Process | Export-CSV -NoClobber -Path /home/viktor/Desktop/processes.csv
正如你所看到的,它现在抛出一个错误,提到该文件已经存在。
覆写只读文件
默认情况下,只读文件不允许编辑。然而,我们可以使用PowerShell来强制编辑该文件。这个功能被直接嵌入到Export-CSV中。它的方法是将文件取消标记为只读,进行编辑,然后再次标记为只读。
要覆盖现有的只读文件,使用标志"-Force"。
$ Get-Process | Export-CSV -Append -Force -Path /home/viktor/Desktop/processes.csv
文件编码
对于文件编码,Export-CSV默认使用UTF-8。这是对所有文本文件的通用编码。然而,在特定情况下,不同的编码会更有意义。值得庆幸的是,Export-CSV支持定义特定的编码。
要指定一个特定的编码,使用标志"-Encoding"。
$ Get-Process | Export-CSV -Encoding <encoding> -Path /home/viktor/Desktop/processes.csv
这里有一个所有支持的编码格式的列表。
- ASCII
- Unicode
- UTF7
- UTF8
- UTF8BOM
- UTF8NoBOM
- UTF32
- BigEndianUnicode
最后的想法
PowerShell中的Export-CSV cmdlet是一个强大的工具,可以将信息导出为CSV格式。本指南演示了Export-CSV的一些方法。它也可以在PowerShell脚本中实现,以实现数据传输的自动化。它将结构化数据转换为更简单和用户可读的格式,很多应用程序都可以使用。