PowerShell Export-Csv 否 Headers
PowerShell Export-Csv No Headers
我正在尝试在 PowerShell 脚本中使用 Export-Csv
创建多个没有 headers 的 CSV 文件。我已经阅读了一些关于使用 Select-Object -Skip 1
技巧的帖子,但我还没有成功地处理我的代码。这是我尝试称呼它的方式:
$DataSet.Tables[0] | Select-Object -Skip 1 |
Export-Csv -NoTypeInformation -Path "C:$($csvname[$i])_$timer.csv"
这是我的完整功能代码:
function Run-Query {
Param([string[]]$queries,[string[]]$csvname)
Begin {
$SQLServer = 'myserver'
$Database = 'mydatabase'
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $Database; Integrated Security = True"
$timer = (Get-Date -f yyyy-MM-dd)
} # End Begin
Process {
# Loop through each query
for ($i = 0; $i -lt $queries.Count; $i++) {
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
# Use the current index ($i) to get the query
$SqlCmd.CommandText = $queries[$i]
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
# Use the current index ($i) to get the sheetname for the CSV
$DataSet.Tables[0] | Export-Csv -NoTypeInformation -Path "C:$($csvname[$i])_$timer.csv"
}
} # End Process
End {
$SqlConnection.Close()
}
} # End function run-query.
#Entery Query
$queries = @()
$queries += @'
SELECT * FROM table2
'@
$queries += @'
SELECT * FROM table1
'@
#List of CSV file names.
$csvname = @()
$csvname += 'file1'
$csvname += 'file2'
Run-Query -queries $queries -csvname $csvname
这是一种将 CSV 输入 objects 输出为 tab-separated 数据而无需 headers 的方法:
function ConvertTo-Tsv {
param(
[parameter(ValueFromPipeline=$true)]
[Object[]] $Object
)
process {
foreach ( $objectItem in $Object ) {
($objectItem.PSObject.Properties | Select-Object -ExpandProperty Value) -join "`t"
}
}
}
然后您可以执行以下任一操作:
Import-Csv "inputfile.csv" | ConvertTo-Tsv
或
$data = Import-Csv "inputfile.csv"
ConvertTo-Tsv $data
您误解了 CSV 在 PowerShell 中的工作方式。假设您有一个包含以下内容的 CSV 文件:
foo,bar,baz
A,1,2
B,3,4
通过 Import-Csv
导入该 CSV 文件将为您提供 2 objects,其中属性 foo
、bar
和 baz
填充了来自每个数据行。使用 JSON 符号,object 的列表将如下所示:
[
{
"foo": "A",
"bar": "1",
"baz": "2"
},
{
"foo": "B",
"bar": "3",
"baz": "4"
}
]
Export-Csv
的作用基本相同,只是相反。我将 objects 作为输入并将它们的属性值写入 CSV 的字段。这些字段由第一个 object Export-Csv
接收的属性决定。如果在后续 object 中缺少这些属性之一,则会将 NULL 值写入相应字段。如果后续的 object 具有第一个 object 没有的其他属性,它们将被忽略。
将 Select-Object -Skip 1
与 Import-Csv
或 Export-Csv
一起使用是没有用的,因为通常您不想跳过任何输入或输出 object(否则你会丢失数据)。
但是,还有另外两个类似于 Import-Csv
和 Export-Csv
的 cmdlet,它们读写字符串而不是文件:ConvertFrom-Csv
和 ConvertTo-Csv
。 Import-Csv
基本上是 Get-Content
和 ConvertFrom-Csv
的组合,而 Export-Csv
基本上是 ConvertTo-Csv
和 Set-Content
的组合。
那么,Select-Object -Skip 1
在这里发挥什么作用呢?当您通过 ConvertTo-Csv
将 object 输入转换为 CSV 并跳过字符串输出的第一行时,您实际上从输出文本中删除了 header 行,这是您无法做到的Export-Csv
.
示范:
PS C:\> $data = @()
PS C:\> $data += [PSCustomObject]@{"foo"="A"; "bar"="1"; "baz"="2"}
PS C:\> $data += [PSCustomObject]@{"foo"="B"; "bar"="3"; "baz"="4"}
PS C:\> $data | Format-Table -Auto
foo bar baz
--- --- ---
A 1 2
B 3 4
PS C:\> $data | ConvertTo-Csv -NoType
"foo","bar","baz"
"A","1","2"
"B","3","4"
PS C:\> $data | ConvertTo-Csv -NoType | Select-Object -Skip 1
"A","1","2"
"B","3","4"
将输出通过管道传输到 Set-Content
,您就得到了 header 更少的 CSV 文件。
$DataSet.Tables[0] |
ConvertTo-Csv -NoType |
Select-Object -Skip 1 |
Set-Content "C:$($csvname[$i])_$timer.csv"
我正在尝试在 PowerShell 脚本中使用 Export-Csv
创建多个没有 headers 的 CSV 文件。我已经阅读了一些关于使用 Select-Object -Skip 1
技巧的帖子,但我还没有成功地处理我的代码。这是我尝试称呼它的方式:
$DataSet.Tables[0] | Select-Object -Skip 1 |
Export-Csv -NoTypeInformation -Path "C:$($csvname[$i])_$timer.csv"
这是我的完整功能代码:
function Run-Query {
Param([string[]]$queries,[string[]]$csvname)
Begin {
$SQLServer = 'myserver'
$Database = 'mydatabase'
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $Database; Integrated Security = True"
$timer = (Get-Date -f yyyy-MM-dd)
} # End Begin
Process {
# Loop through each query
for ($i = 0; $i -lt $queries.Count; $i++) {
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
# Use the current index ($i) to get the query
$SqlCmd.CommandText = $queries[$i]
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
# Use the current index ($i) to get the sheetname for the CSV
$DataSet.Tables[0] | Export-Csv -NoTypeInformation -Path "C:$($csvname[$i])_$timer.csv"
}
} # End Process
End {
$SqlConnection.Close()
}
} # End function run-query.
#Entery Query
$queries = @()
$queries += @'
SELECT * FROM table2
'@
$queries += @'
SELECT * FROM table1
'@
#List of CSV file names.
$csvname = @()
$csvname += 'file1'
$csvname += 'file2'
Run-Query -queries $queries -csvname $csvname
这是一种将 CSV 输入 objects 输出为 tab-separated 数据而无需 headers 的方法:
function ConvertTo-Tsv {
param(
[parameter(ValueFromPipeline=$true)]
[Object[]] $Object
)
process {
foreach ( $objectItem in $Object ) {
($objectItem.PSObject.Properties | Select-Object -ExpandProperty Value) -join "`t"
}
}
}
然后您可以执行以下任一操作:
Import-Csv "inputfile.csv" | ConvertTo-Tsv
或
$data = Import-Csv "inputfile.csv"
ConvertTo-Tsv $data
您误解了 CSV 在 PowerShell 中的工作方式。假设您有一个包含以下内容的 CSV 文件:
foo,bar,baz A,1,2 B,3,4
通过 Import-Csv
导入该 CSV 文件将为您提供 2 objects,其中属性 foo
、bar
和 baz
填充了来自每个数据行。使用 JSON 符号,object 的列表将如下所示:
[
{
"foo": "A",
"bar": "1",
"baz": "2"
},
{
"foo": "B",
"bar": "3",
"baz": "4"
}
]
Export-Csv
的作用基本相同,只是相反。我将 objects 作为输入并将它们的属性值写入 CSV 的字段。这些字段由第一个 object Export-Csv
接收的属性决定。如果在后续 object 中缺少这些属性之一,则会将 NULL 值写入相应字段。如果后续的 object 具有第一个 object 没有的其他属性,它们将被忽略。
将 Select-Object -Skip 1
与 Import-Csv
或 Export-Csv
一起使用是没有用的,因为通常您不想跳过任何输入或输出 object(否则你会丢失数据)。
但是,还有另外两个类似于 Import-Csv
和 Export-Csv
的 cmdlet,它们读写字符串而不是文件:ConvertFrom-Csv
和 ConvertTo-Csv
。 Import-Csv
基本上是 Get-Content
和 ConvertFrom-Csv
的组合,而 Export-Csv
基本上是 ConvertTo-Csv
和 Set-Content
的组合。
那么,Select-Object -Skip 1
在这里发挥什么作用呢?当您通过 ConvertTo-Csv
将 object 输入转换为 CSV 并跳过字符串输出的第一行时,您实际上从输出文本中删除了 header 行,这是您无法做到的Export-Csv
.
示范:
PS C:\> $data = @() PS C:\> $data += [PSCustomObject]@{"foo"="A"; "bar"="1"; "baz"="2"} PS C:\> $data += [PSCustomObject]@{"foo"="B"; "bar"="3"; "baz"="4"} PS C:\> $data | Format-Table -Auto foo bar baz --- --- --- A 1 2 B 3 4 PS C:\> $data | ConvertTo-Csv -NoType "foo","bar","baz" "A","1","2" "B","3","4" PS C:\> $data | ConvertTo-Csv -NoType | Select-Object -Skip 1 "A","1","2" "B","3","4"
将输出通过管道传输到 Set-Content
,您就得到了 header 更少的 CSV 文件。
$DataSet.Tables[0] |
ConvertTo-Csv -NoType |
Select-Object -Skip 1 |
Set-Content "C:$($csvname[$i])_$timer.csv"