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 文件,包括由 Export-Csv
cmdlet 生成的文件。
可以使用 Import-Csv
cmdlet 的参数来指定列标题行和项分隔符,或指示 Import-Csv
将当前区域性的列表分隔符用作项分隔符。
还可以使用 ConvertTo-Csv
和 ConvertFrom-Csv
命令行小程序将对象转换为 CSV 字符串,并转换回来。 这些 cmdlet 与 Export-CSV
和 Import-Csv
cmdlet 相同,不同之处在于它们使用管道中的数据而不是文件。
如果 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
变量将管道向下发送到显示导入 CSV 字符串属性的 Get-Member
cmdlet。
$P
变量通过管道向下发送到 Format-Table
cmdlet 并显示对象。
示例 2:指定分隔符
此示例演示如何使用 cmdlet 的 Import-Csv
参数。
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 使用嵌套属性 TextInfo 和 ListSeparator 来获取当前区域性的默认列表分隔符。
Get-Process
cmdlet 将进程对象沿着管道发送到 Export-Csv
。
Export-Csv
cmdlet 将进程对象转换为 CSV 字符串,并将字符串保存在 Processes.csv 文件中。
UseCulture 参数使用当前文化的默认列表分隔符。
Import-Csv
cmdlet 从 Processes.csv 文件中导入 CSV 字符串。
示例 4:更改导入对象中的属性名称
此示例演示如何使用 的 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
变量包含替换以下默认值的自定义标头:HasMoreData、JobStateInfo、PSBeginTime、PSEndTime和 PSJobTypeName。
$A
变量使用 Get-Content
cmdlet 从 Jobs.csv 文件中获取 CSV 字符串。
$A
变量用于从文件中删除默认标头。
Out-File
cmdlet 将 Jobs.csv 文件的新版本保存在 $A
变量中。
Import-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 参数指定的属性名称包括 LinkId 和 TopicTitle。 对象存储在 $A
变量中。
Get-Member
cmdlet 显示标头参数中的属性名称。
Where-Object
cmdlet 使用包含别名的 TopicTitle 属性选择对象。
示例 6:导入缺少值的 CSV
此示例显示当 CSV 文件中的标头行包含 null 或空值时,PowerShell 中的 Import-Csv
cmdlet 如何响应。
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 weren't 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
Get-Content
cmdlet 将显示 Projects.csv
文件。 标头行缺少 ProjectName 和 Completed之间的值。
Import-Csv
cmdlet 导入 Projects.csv
文件并显示警告消息,因为 H1 是默认标头名称。
参数
-Delimiter
指定分隔 CSV 文件中属性值的分隔符。 默认值为逗号(,
)。
输入字符,如冒号(:
)。 若要指定分号(;
),请将它括在单引号中。 若要指定转义的特殊字符(如制表符 (`t
)),请用双引号将其括起来。
如果在文件中指定了一个不是实际字符串分隔符的字符,Import-Csv
将无法从 CSV 字符串中创建对象,并会返回完整的 CSV 字符串。
类型: | Char |
Position: | 1 |
默认值: | comma (,) |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Encoding
指定导入的 CSV 文件的编码。 默认值为 utf8NoBOM
。
此参数的可接受值如下所示:
-
ascii
:对 ASCII(7 位)字符集使用编码。 -
ansi
:对当前区域性的 ANSI 代码页使用编码。 此选项已在 PowerShell 7.4 中添加。 -
bigendianunicode
:使用大端字节序以 UTF-16 格式进行编码。 -
bigendianutf32
:使用大端字节序以 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 文档。
从 PowerShell 7.4 开始,可以使用 Ansi
参数的 值来传递当前区域性 ANSI 代码页的数字 ID,而无需手动指定它。
注意
UTF-7* 不再推荐使用。 从 PowerShell 7.1 起,如果为 utf7
参数指定 ,则会编写警告。
类型: | Encoding |
接受的值: | ASCII, BigEndianUnicode, BigEndianUTF32, OEM, Unicode, UTF7, UTF8, UTF8BOM, UTF8NoBOM, UTF32 |
Position: | Named |
默认值: | UTF8NoBOM |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Header
为导入的文件指定备用列标题行。 列标题确定由 Import-Csv
创建的对象的属性名称。
以字符分隔的列表的形式输入列标题。 不要将标头字符串括在引号中。 将每个列标题括在单引号中。
如果输入的列标题少于数据列,则剩余的数据列将被丢弃。 如果输入的列标题多于数据列,则使用空数据列创建其他列标题。
使用 Header 参数时,请从 CSV 文件中删除原始标头行。 否则,Import-Csv
从标题行中的项创建额外的对象。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-LiteralPath
指定要导入的 CSV 文件的路径。 与 Path 不同,LiteralPath 参数的值严格按照所键入的形式使用。 不会将任何字符解释为通配符。 如果路径包含转义字符,请将它括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。
类型: | String[] |
别名: | PSPath, LP |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-Path
指定要导入的 CSV 文件的路径。
还可以通过管道将路径传递给 Import-Csv
。
类型: | String[] |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-UseCulture
将当前区域性的列表分隔符用作项分隔符。 若要查找特定文化的列表分隔符,请使用以下命令:(Get-Culture).TextInfo.ListSeparator
。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
输入
可以通过管道将包含路径的字符串传递给此 cmdlet。
输出
此 cmdlet 返回 CSV 文件中的内容描述的对象。
备注
PowerShell 包含以下与 Import-Csv
相关的别名:
- 所有平台:
ipcsv
由于导入的对象是对象类型的 CSV 版本,PowerShell 类型格式条目无法识别和处理这些 CSV 版本,因此不能像处理非 CSV 版本那样格式化它们。
Import-Csv
命令的结果是构成类似表的自定义对象的字符串集合。 每行都是一个单独的字符串,因此可以使用对象的 Count 属性对表行进行计数。 列是对象的属性,行中的项是属性值。
列标题行确定了列数和列名称。 列名称也是对象的属性的名称。 第一行解释为列标题,除非使用 Header 参数指定列标题。 如果任何行的值超过标题行,则忽略其他值。
如果列标题行缺少值或包含 null 值或空值,则 Import-Csv
使用 H,并在缺失的列标题和属性名称之后添加一个数字。
在 CSV 文件中,每个对象由对象的属性值的字符分隔列表表示。 属性值通过使用对象的 ToString() 方法转换为字符串,因此它们由属性值的名称表示。
Export-Csv
不导出对象的方法。
Import-Csv
还支持 W3C 扩展日志格式。 以哈希字符(#
)开头的行被视为注释并被忽略,除非注释以 #Fields:
开头,并且包含列名的分隔列表。 在这种情况下,cmdlet 使用这些列名称。 这是 Windows IIS 和其他 Web 服务器日志的标准格式。 有关详细信息,请参阅 扩展日志文件格式。