Import-Csv

从逗号分隔值 (CSV) 文件中的项创建类似表的自定义对象。

语法

Import-Csv
      [[-Delimiter] <Char>]
      [-Path] <String[]>
      [-Header <String[]>]
      [-Encoding <Encoding>]
      [<CommonParameters>]
Import-Csv
      [[-Delimiter] <Char>]
      -LiteralPath <String[]>
      [-Header <String[]>]
      [-Encoding <Encoding>]
      [<CommonParameters>]
Import-Csv
      [-Path] <String[]>
      -UseCulture
      [-Header <String[]>]
      [-Encoding <Encoding>]
      [<CommonParameters>]
Import-Csv
      -LiteralPath <String[]>
      -UseCulture
      [-Header <String[]>]
      [-Encoding <Encoding>]
      [<CommonParameters>]

说明

Import-Csv cmdlet 从 CSV 文件中的项创建类似表的自定义对象。 CSV 文件中的每个列将成为自定义对象的属性,行中的项将成为属性值。 Import-Csv 适用于任何 CSV 文件,包括 cmdlet 生成的 Export-Csv 文件。

可以使用 cmdlet 的参数 Import-Csv 指定列标题行和项分隔符,或者直接 Import-Csv 使用当前区域性的列表分隔符作为项分隔符。

还可以使用 ConvertTo-Csv cmdlet ConvertFrom-Csv 将对象转换为 CSV 字符串, (和后) 。 这些 cmdlet 与 Export-CSV cmdlet Import-Csv 相同,只是它们不处理文件。

如果 CSV 文件中的标题行条目包含空值或 null 值,PowerShell 将插入默认标题行名称并显示警告消息。

从 PowerShell 6.0 开始, Import-Csv 现在支持 W3C 扩展日志文件格式。

示例

示例 1:导入进程对象

此示例演示如何导出和导入进程对象的 CSV 文件。

Get-Process | Export-Csv -Path .\Processes.csv
$P = Import-Csv -Path .\Processes.csv
$P | Get-Member

TypeName: System.Management.Automation.PSCustomObject

Name                       MemberType   Definition
----                       ----------   ----------
Equals                     Method       bool Equals(System.Object obj)
GetHashCode                Method       int GetHashCode()
GetType                    Method       type GetType()
ToString                   Method       string ToString()
BasePriority               NoteProperty string BasePriority=8
Company                    NoteProperty string Company=Microsoft Corporation
...

$P | Format-Table

Name                   SI Handles VM            WS        PM        NPM    Path
----                   -- ------- --            --        --        ---    ----
ApplicationFrameHost   4  407     2199293489152 15884288  15151104  23792  C:\WINDOWS\system32\ApplicationFrameHost.exe
...
wininit                0  157     2199112204288 4591616   1630208   10376
winlogon               4  233     2199125549056 7659520   2826240   10992  C:\WINDOWS\System32\WinLogon.exe
WinStore.App           4  846     873435136     33652736  26607616  55432  C:\Program Files\WindowsApps\Microsoft.WindowsStore_11712.1001.13.0_x64__8weky...
WmiPrvSE               0  201     2199100219392 8830976   3297280   10632  C:\WINDOWS\system32\wbem\wmiprvse.exe
WmiPrvSE               0  407     2199157727232 18509824  12922880  16624  C:\WINDOWS\system32\wbem\wmiprvse.exe
WUDFHost               0  834     2199310204928 51945472  87441408  24984  C:\Windows\System32\WUDFHost.exe

Get-Process cmdlet 将进程对象向下发送到管道 Export-Csv。 该 Export-Csv cmdlet 将进程对象转换为 CSV 字符串,并将字符串保存在Processes.csv文件中。 该 Import-Csv cmdlet 从 Processes.csv 文件中导入 CSV 字符串。 字符串保存在变量中 $P 。 变量 $P 将管道向下 Get-Member 发送到显示导入的 CSV 字符串的属性的 cmdlet。 变量 $P 将管道 Format-Table 向下发送到 cmdlet 并显示对象。

示例 2:指定分隔符

此示例演示如何使用 cmdlet 的 Import-CsvDelimiter 参数。

Get-Process | Export-Csv -Path .\Processes.csv -Delimiter :
$P = Import-Csv -Path .\Processes.csv -Delimiter :
$P | Format-Table

Get-Process cmdlet 将 Export-Csv进程对象向下发送到管道。 该 Export-Csv cmdlet 将进程对象转换为 CSV 字符串,并将字符串保存在Processes.csv文件中。 分隔符参数用于指定冒号分隔符。 该 Import-Csv cmdlet 从 Processes.csv 文件中导入 CSV 字符串。 字符串保存在变量中 $P 。 将 $P 变量向下发送到 Format-Table cmdlet。

示例 3:指定分隔符的当前区域性

此示例演示如何将 Import-Csv cmdlet 与 UseCulture 参数配合使用。

(Get-Culture).TextInfo.ListSeparator
Get-Process | Export-Csv -Path .\Processes.csv -UseCulture
Import-Csv -Path .\Processes.csv -UseCulture

Get-Culture cmdlet 使用嵌套属性 TextInfoListSeparator 来获取当前区域性的默认列表分隔符。 该 Get-Process cmdlet 将 Export-Csv进程对象向下发送到管道。 该 Export-Csv cmdlet 将进程对象转换为 CSV 字符串,并将字符串保存在Processes.csv文件中。 UseCulture 参数使用当前区域性的默认列表分隔符。 该 Import-Csv cmdlet 从 Processes.csv 文件中导入 CSV 字符串。

示例 4:更改导入对象中的属性名称

此示例演示如何使用 Header 参数 Import-Csv 更改生成的导入对象中的属性名称。

Start-Job -ScriptBlock { Get-Process } | Export-Csv -Path .\Jobs.csv -NoTypeInformation
$Header = 'State', 'MoreData', 'StatusMessage', 'Location', 'Command', 'StateInfo', 'Finished', 'InstanceId', 'Id', 'Name', 'ChildJobs', 'BeginTime', 'EndTime', 'JobType', 'Output', 'Error', 'Progress', 'Verbose', 'Debug', 'Warning', 'Information'
# Delete the default header from file
$A = Get-Content -Path .\Jobs.csv
$A = $A[1..($A.Count - 1)]
$A | Out-File -FilePath .\Jobs.csv
$J = Import-Csv -Path .\Jobs.csv -Header $Header
$J

State         : Running
MoreData      : True
StatusMessage :
Location      : localhost
Command       : Get-Process
StateInfo     : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : a259eb63-6824-4b97-a033-305108ae1c2e
Id            : 1
Name          : Job1
ChildJobs     : System.Collections.Generic.List`1[System.Management.Automation.Job]
BeginTime     : 12/20/2018 18:59:57
EndTime       :
JobType       : BackgroundJob
Output        : System.Management.Automation.PSDataCollection`1[System.Management.Automation.PSObject]
Error         : System.Management.Automation.PSDataCollection`1[System.Management.Automation.ErrorRecord]
Progress      : System.Management.Automation.PSDataCollection`1[System.Management.Automation.ProgressRecord]
Verbose       : System.Management.Automation.PSDataCollection`1[System.Management.Automation.VerboseRecord]
Debug         : System.Management.Automation.PSDataCollection`1[System.Management.Automation.DebugRecord]
Warning       : System.Management.Automation.PSDataCollection`1[System.Management.Automation.WarningRecord]
Information   : System.Management.Automation.PSDataCollection`1[System.Management.Automation.InformationRecord]

Start-Job cmdlet 启动运行 Get-Process后台作业。 作业对象将管道 Export-Csv 向下发送到 cmdlet,并转换为 CSV 字符串。 NoTypeInformation 参数从 CSV 输出中删除类型信息标头,在 PowerShell v6 及更高版本中是可选的。 该 $Header 变量包含一个自定义标头,用于替换以下默认值: HasMoreDataJobStateInfoPSBeginTimePSEndTimePSJobTypeName。 该 $A 变量使用 Get-Content cmdlet 从 Jobs.csv 文件中获取 CSV 字符串。 该 $A 变量用于从文件中删除默认标头。 该 Out-File cmdlet 将Jobs.csv文件的新版本保存在变量中 $AImport-Csv该 cmdlet 导入Jobs.csv文件,并使用 Header 参数应用$Header变量。 该 $J 变量包含导入的 PSCustomObject ,并在 PowerShell 控制台中显示对象。

示例 5:使用 CSV 文件创建自定义对象

此示例演示如何使用 CSV 文件在 PowerShell 中创建自定义对象。

Get-Content -Path .\Links.csv

113207,about_Aliases
113208,about_Arithmetic_Operators
113209,about_Arrays
113210,about_Assignment_Operators
113212,about_Automatic_Variables
113213,about_Break
113214,about_Command_Precedence
113215,about_Command_Syntax
144309,about_Comment_Based_Help
113216,about_CommonParameters
113217,about_Comparison_Operators
113218,about_Continue
113219,about_Core_Commands
113220,about_Data_Section

$A = Import-Csv -Path .\Links.csv -Header 'LinkID', 'TopicTitle'
$A | Get-Member

TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
LinkID      NoteProperty string LinkID=113207
TopicTitle  NoteProperty string TopicTitle=about_Aliases

$A | Where-Object -Property TopicTitle -Like '*alias*'

LinkID TopicTitle
------ ----------
113207 about_Aliases

若要创建Links.csv文件,请使用输出中显示的 Get-Content 值。

Get-Content cmdlet 显示Links.csv文件。 该 Import-Csv cmdlet 导入Links.csv文件。 Header 参数指定属性名称 LinkIdTopicTitle。 对象存储在变量中 $A 。 该 Get-Member cmdlet 显示 Header 参数中的属性名称。 该 Where-Object cmdlet 使用包含别名TopicTitle 属性选择对象。

示例 6:导入缺少值的 CSV

此示例演示当 CSV 文件中的标头行包含 null 或空值时,PowerShell 中的 cmdlet 如何 Import-Csv 响应。 Import-Csv 替换缺少的标题行的默认名称,该行将成为返回的对象 Import-Csv 的属性名称。

Get-Content -Path .\Projects.csv

ProjectID,ProjectName,,Completed
13,Inventory,Redmond,True
440,,FarEast,True
469,Marketing,Europe,False

Import-Csv -Path .\Projects.csv

WARNING: One or more headers were not specified. Default names starting with "H" have been used in place of any missing headers.

ProjectID ProjectName H1      Completed
--------- ----------- --      ---------
13        Inventory   Redmond True
440                   FarEast True
469       Marketing   Europe  False

(Import-Csv -Path .\Projects.csv).H1

WARNING: One or more headers were not specified. Default names starting with "H" have been used in place of any missing headers.
Redmond
FarEast
Europe

若要创建Projects.csv文件,请使用示例 Get-Content 输出中显示的值。

Get-Content cmdlet 显示Projects.csv文件。 标题行缺少 ProjectNameCompleted 之间的值。 该 Import-Csv cmdlet 导入Projects.csv文件,并显示警告消息,因为 H1 是默认标头名称。 该 (Import-Csv -Path .\Projects.csv).H1 命令获取 H1 属性值并显示警告。

参数

-Delimiter

指定用于分隔 CSV 文件中的属性值的分隔符。 默认值为逗号 (,) 。

输入字符,例如冒号 (:) 。 若要指定分号 () ; 将其括在单引号中。 若要指定转义的特殊字符(如制表符 (`t) ),请将它括在双引号中。

如果在文件中指定除实际字符串分隔符以外的字符, Import-Csv 则无法从 CSV 字符串创建对象,并返回 CSV 字符串。

Type:Char
Position:1
Default value:comma (,)
Accept pipeline input:False
Accept wildcard characters:False

-Encoding

指定导入的 CSV 文件的编码。 默认值为 utf8NoBOM

此参数的可接受值如下所示:

  • ascii:使用 ASCII (7 位) 字符集的编码。
  • bigendianunicode:使用 big-endian 字节顺序以 UTF-16 格式编码。
  • bigendianutf32:使用 big-endian 字节顺序以 UTF-32 格式编码。
  • oem:对 MS-DOS 和控制台程序使用默认编码。
  • unicode:使用小端字节顺序以 UTF-16 格式编码。
  • utf7:采用 UTF-7 格式编码。
  • utf8:采用 UTF-8 格式编码。
  • utf8BOM:使用字节顺序标记 (BOM) 以 UTF-8 格式编码
  • utf8NoBOM:不使用字节顺序标记 (BOM) 以 UTF-8 格式编码
  • utf32:采用 UTF-32 格式编码。

从 PowerShell 6.2 开始, 编码 参数还允许 (注册代码页的数字 ID,例如 -Encoding 1251) 或已注册代码页的字符串名称 (,如 -Encoding "windows-1251") 。 有关详细信息,请参阅 Encoding.CodePage 的 .NET 文档。

备注

不再建议使用 UTF-7* 。 从 PowerShell 7.1 起,如果为 Encoding 参数指定utf7,则会编写警告。

Type:Encoding
Accepted values:ASCII, BigEndianUnicode, BigEndianUTF32, OEM, Unicode, UTF7, UTF8, UTF8BOM, UTF8NoBOM, UTF32
Position:Named
Default value:UTF8NoBOM
Accept pipeline input:False
Accept wildcard characters:False

-Header

为导入的文件指定备用列标题行。 列标题确定由 Import-Csv 创建的对象的属性名称。

以逗号分隔的列表的形式输入列标题。 不要将标头字符串括在引号内。 将每列标题括在单引号中。

如果输入的列标题少于数据列,则丢弃剩余的数据列。 如果输入的列标题多于数据列,则使用空数据列创建其他列标题。

使用 Header 参数时,从 CSV 文件中删除原始标题行。 否则, Import-Csv 从标题行中的项创建一个额外的对象。

Type:String[]
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-LiteralPath

指定要导入的 CSV 文件的路径。 与 Path 不同,LiteralPath 参数的值严格按照所键入的形式使用。 不会将任何字符解释为通配符。 如果路径包括转义符,请将其括在单引号中。 单引号指示 PowerShell 不要将任何字符解释为转义序列。

Type:String[]
Aliases:PSPath, LP
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-Path

指定要导入的 CSV 文件的路径。 还可以通过管道将路径传递给 Import-Csv

Type:String[]
Position:0
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-UseCulture

将当前区域性的列表分隔符用作项分隔符。 若要查找区域性的列表分隔符,请使用以下命令: (Get-Culture).TextInfo.ListSeparator

Type:SwitchParameter
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

输入

String

可以通过管道传递包含路径的 Import-Csv字符串。

输出

Object

此 cmdlet 返回 CSV 文件中的内容描述的对象。

备注

由于导入的对象是对象类型的 CSV 版本,因此无法识别这些对象,并且由格式化对象类型非 CSV 版本的 PowerShell 类型格式项进行格式化。

命令的结果 Import-Csv 是构成类似表的自定义对象的字符串集合。 每一行都是一个单独的字符串,因此可以使用对象的 Count 属性对表行进行计数。 这些列是对象的属性,行中的项是属性值。

列标题行确定了列数和列名称。 列名称也是对象的属性的名称。 第一行解释为列标题,除非使用 Header 参数指定列标题。 如果任何行具有的值多于标题行,则忽略额外的值。

如果列标题行缺少值或包含 null 或空值, Import-Csv 则使用 H 后跟缺失列标题和属性名称的数字。

在 CSV 文件中,通过以逗号分隔的对象属性值列表来表示每个对象。 属性值通过使用对象的 ToString () 方法转换为字符串,因此它们由属性值的名称表示。 Export-Csv 不导出对象的方法。

Import-Csv 还支持 W3C 扩展日志格式。 以注释 # 开头的行被视为注释,并且忽略,除非注释以 #Fields: 列名分隔列表开头。 在这种情况下,cmdlet 使用这些列名。 这是 Windows IIS 和其他 Web 服务器日志的标准格式。 有关详细信息,请参阅 扩展日志文件格式