我有以下来自 powershell 逐行 foreach 的文本:
get-content C:\temp\data.txt | where-object {$_}
output:
usuario nombre dni instalacion sede
dni JOSE 45 grupo: SI MURCIA
dni ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI BARCELONA
dni M. PILAR 65 grupo: SI ALBOX
dni M. PAZ 75 grupo: SI MADRID
dni FLOREN 57 grupo: SI MADRID
我怎样才能将其插入到 Excel 中,以便经常使用 Excel.Application 对象插入它,而不必放置 powershell 的精确列和行,如下所示:
答案1
根据我的评论。这是处理此清理方法的一个例子。
我在用Powershell 变量压缩显示写入变量的内容并输出到屏幕,以便立即查看结果是否成功或失败。不需要包含该功能。
Clear-Host
@'
usuario nombre dni instalacion sede
dni JOSE 45 grupo: SI MURCIA
dni ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI BARCELONA
dni M. PILAR 65 grupo: SI ALBOX
dni M. PAZ 75 grupo: SI MADRID
dni FLOREN 57 grupo: SI MADRID
'@ | Out-File -FilePath 'D:\Temp\UserList.txt'
# Clean-up by planned property and replace with comma
Clear-Host
(
$ExcelReport = (Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|[ ]+(?=\d)', ',' -Replace 'dni\s', 'dni,' -replace '\sgrupo:', ',grupo:' -replace 'SI\s', 'SI,' |
ConvertFrom-Csv |
Format-Table -AutoSize
)
# Results
<#
usuario nombre dni instalacion sede
------- ------ --- ----------- ----
dni JOSE 45 grupo: SI MURCIA
dni ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI BARCELONA
dni M. PILAR 65 grupo: SI ALBOX
dni M. PAZ 75 grupo: SI MADRID
dni FLOREN 57 grupo: SI MADRID
#>
# More succinctly - Clean-up by specific space removal and replace with a comma
Clear-Host
(
$ExcelReport = (Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' |
ConvertFrom-Csv |
Format-Table -AutoSize
)
# Results
<#
usuario nombre dni instalacion sede
------- ------ --- ----------- ----
dni JOSE 45 grupo: SI MURCIA
dni ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI BARCELONA
dni M. PILAR 65 grupo: SI ALBOX
dni M. PAZ 75 grupo: SI MADRID
dni FLOREN 57 grupo: SI MADRID
#>
# Convert to true CSV
$ExcelReport = (Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' |
Select-Object -Skip 1 |
ConvertFrom-Csv -Delimiter ',' -Header usuario, nombre, dni, instalacion, sede
# Results
<#
usuario : dni
nombre : JOSE
dni : 45
instalacion : grupo: SI
sede : MURCIA
usuario : dni
nombre : ANGEL
dni : 45
instalacion : grupo: SI
sede : ALMERIA
usuario : dni
nombre : MARIA
dni : 56
instalacion : grupo: SI
sede : BARCELONA
usuario : dni
nombre : M. PILAR
dni : 65
instalacion : grupo: SI
sede : ALBOX
usuario : dni
nombre : M. PAZ
dni : 75
instalacion : grupo: SI
sede : MADRID
usuario : dni
nombre : FLOREN
dni : 57
instalacion : grupo: SI
sede : MADRID
#>
<#
THus enableing member dot refreenceing of properties. for leverageing as needed
in any tool that can read/use CSV files.
#>
$ExcelReport.Count
# Results
<#
6
#>
$ExcelReport |
Select-Object -Property usuario, nombre
# Results
<#
usuario nombre
------- ------
dni JOSE
dni ANGEL
dni MARIA
dni M. PILAR
dni M. PAZ
dni FLOREN
#>
$ExcelReport.sede
# Results
<#
MURCIA
ALMERIA
BARCELONA
ALBOX
MADRID
MADRID
#>
更新:
根据我的评论 - 这就是您应该使用的。同样,您可以使用您选择的任何文件名。
# Make avaialbe for import into MSExcel
(Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' |
Out-File -FilePath 'D:\Temp\UserList.csv' -Force
Get-Content -Path 'D:\Temp\UserList.csv'
# Results
<#
usuario,nombre,dni,instalacion,sede
dni,JOSE,45,grupo: SI,MURCIA
dni,ANGEL,45,grupo: SI,ALMERIA
dni,MARIA,56,grupo: SI,BARCELONA
dni,M. PILAR,65,grupo: SI,ALBOX
dni,M. PAZ,75,grupo: SI,MADRID
dni,FLOREN,57,grupo: SI,MADRID
#>
Import-Csv -Path 'D:\Temp\UserList.csv' |
Format-Table -AutoSize
# Results
<#
usuario nombre dni instalacion sede
------- ------ --- ----------- ----
dni JOSE 45 grupo: SI MURCIA
dni ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI BARCELONA
dni M. PILAR 65 grupo: SI ALBOX
dni M. PAZ 75 grupo: SI MADRID
dni FLOREN 57 grupo: SI MADRID
#>
Start-Process -FilePath 'Excel' -ArgumentList 'D:\Temp\UserList.csv'
更新
通过 COM 调用 Excel,无需像上图所示创建单独的 CSV 文件或使用变量
Add-Type -AssemblyName System.Drawing,
PresentationCore,
PresentationFramework,
System.Windows.Forms,
Microsoft.VisualBasic
[System.Windows.Forms.Application]::EnableVisualStyles()
(Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' |
Set-Clipboard
$MSExcel = New-Object -ComObject excel.application
$MSExcel.visible = $True
[Microsoft.VisualBasic.Interaction]::AppActivate((Get-Process -Name 'Excel').MainWindowTitle)
$NewWorksheet = $MSExcel.Workbooks.Add()
$Worksheet = $NewWorksheet.Worksheets.item(1)
$Worksheet.activate()
$Worksheet.Paste()
然后使用功能区上 MSEcel 数据选项卡上的内置 MSExcel 文本到列功能。
您也可以添加其他代码来执行此操作
更新
根据我上次关于了解 MSExcel COM 及其用途的评论。你只需要这些行
$xlRange = $Worksheet.usedrange
$xlColA = $Worksheet.range("A1").EntireColumn
$xlColrange = $Worksheet.range("A1")
$xlDelimited = 1
$xlTextQualifier = -4142
$xlTextFormat = 2
$xlColA.texttocolumns($xlRange,$xlDelimited,$xlTextQualifier,$true,$false,$true,$true,$false)
$Worksheet.columns.autofit()
***始终更新您自己的问题。请不要用您的进一步问题来更新提供的答案,因为这不利于人们正确理解。
更新答案意味着您正在尝试改进答案。
一旦超出了评论部分允许的范围,您需要更新您的问题或将对话移至您想要继续对话的人的“聊天部分”。***
根据您的列表评论进行更新
如果它来自列表,那么您可以执行此操作来清理该数据集,其余代码将是相同的。
('usuario nombre dni instalacion sede
dni JOSE 45 grupo: SI MURCIA
dni ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI BARCELONA
dni M. PILAR 65 grupo: SI ALBOX
dni M. PAZ 75 grupo: SI MADRID
dni FLOREN 57 grupo: SI MADRID' -replace '\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ','`
-replace 'usuario nombre dni, instalacion sede', 'usuario,nombre,dni,instalacion,sede').Trim() |
Set-Clipboard