powershell - 根据服务名称创建excel工作表名称
问题描述
下面是我使用Export-Excel" cmdlet 合并的 4 个 csv 文件。
C:\Script\sum_prod-ild-ne-as1-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__eKommerceExtensions__eKommerceExtensions.csv
C:\Script\sum_prod-ild-ne-as1-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__T1T2_Reweighting__T1T2_ReweightingExtensions.csv
C:\Script\sum_prod-ild-ne-as2-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__eKommerceExtensions__eKommerceExtensions.csv
C:\Script\sum_prod-ild-ne-as2-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__T1T2_Reweighting__T1T2_ReweightingExtensions.csv
如果您注意到这里,同一服务器有 2 个文件(prod-ild-ne-as1,prod-ild-ne-as2),因为文件名的下一部分是服务名(例如 Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__eKommerceExtensions__eKommerceExtensions)。
工作表名称应基于服务名称,以便一项服务的所有服务器数据将位于一张工作表中,依此类推。因此,在我编写了一个在服务名称较小时运行良好的代码之前(例如 check_cpu、check_eth0)
foreach ($csv in $csvs)
{
$Content = @()
$name = $csv
$pos = $name.IndexOf("-")
$leftPart = $name.Substring(0, $pos)
$rightPart = $name.Substring($pos+1)
$pos = $rightPart.IndexOf(".")
$leftPart = $rightPart.Substring(0, $pos)
$leftPart
$Content = Import-Csv -Path $csv
$TimeNow = Get-Date
$Current_Time = $TimeNow.ToUniversalTime().ToString("yyyyMMdd-HHmm")
$Content | Export-Excel -Path "$scriptPath\Combind_Data_$Current_Time.xlsx" -WorksheetName $leftPart -Append
但是由于服务名称很长,因此 Excel 不允许使用服务名称创建工作表,因为限制为 31 个字符。
在这种情况下,请告诉我如何创建带有服务名称的工作表,使其保持在限制范围内。
解决方案
Excel 工作表名称不仅受其长度的限制,而且还有您不能使用的字符。
该名称在单个工作簿中必须是唯一的。
工作表名称不能超过 31 个字符。
您可以使用所有字母数字字符,但不能使用以下特殊字符:
\ / * ? : [ ]
您可以在名称中使用空格、下划线 (_) 和句点 (.) 作为单词分隔符。
考虑到这一点,这是正则表达式的工作:
$csvFiles = 'C:\Script\sum_prod-ild-ne-as1-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__eKommerceExtensions__eKommerceExtensions.csv',
'C:\Script\sum_prod-ild-ne-as1-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__T1T2_Reweighting__T1T2_ReweightingExtensions.csv',
'C:\Script\sum_prod-ild-ne-as2-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__eKommerceExtensions__eKommerceExtensions.csv',
'C:\Script\sum_prod-ild-ne-as2-Proc_mem-check_extender-__ldmodels__Demo_TakeHome_HH_P__T1T2_Reweighting__T1T2_ReweightingExtensions.csv'
$today = (Get-Date).ToUniversalTime()
foreach ($csvPath in $csvFiles) {
# combine the distinctice part of the server name (a1 or a2) with the distinctive
# part of the service name (i.e. the stuff between the last underscore and the .csv extension)
# take out all invalid characters and remove doubled underscores
$sheetName = $csvPath -replace '^.+-(as[12])-.+_(\w+)\.csv', '$1_$2' -replace '[\\/*?:[\]]+', '_'
# make sure the sheetname does not exceed the 31 character limit
if ($sheetName.Length -gt 31) { $sheetName = $sheetName.Substring(0, 31) }
$target = Join-Path -Path $PSScriptRoot -ChildPath ('Combind_Data_{0:yyyyMMdd-HHmm}.xlsx' -f $today)
Import-Csv -Path $csvPath | Export-Excel -Path $target -WorksheetName $sheetName -Append
}
使用上面的文件名示例,工作表将被命名:
as1_eKommerceExtensions as1_ReweightingExtensions as2_eKommerceExtensions as2_ReweightingExtensions
正则表达式详细信息:
^ 在字符串的开头断言位置 . 匹配任何不是换行符的单个字符 + 一次到无限次,尽可能多次,按需回馈(贪婪) - 从字面上匹配字符“-” ( 匹配下面的正则表达式并将其匹配捕获到反向引用编号 1 as 从字面上匹配字符“as” [12] 匹配列表“12”中存在的单个字符 ) - 从字面上匹配字符“-” . 匹配任何不是换行符的单个字符 + 一次到无限次,尽可能多次,按需回馈(贪婪) _ 从字面上匹配字符“_” ( 匹配下面的正则表达式并将其匹配捕获到反向引用编号 2 \w 匹配作为“单词字符”的单个字符(字母、数字等) + 一次到无限次,尽可能多次,按需回馈(贪婪) ) \。匹配字符“.” 字面上地 csv 从字面上匹配字符“csv”
推荐阅读
- javascript - 带有 ng-packagr 的 Angular 4 组件库
- laravel - 117/5000 上传文件到 cpanel 中的 public_html
- c# - Entity Framework Core 如何先实现代码?
- android - com.google.firebase:firebase-database:16.0.1 问题
- python - 无法加载张量流
- android - 单选按钮仅在 android studio 中被选中
- android - 像 Snapchat 回忆一样向上滑动
- c# - 使用 Azure KeyVault 和 Visual Studio 管理用户机密不适用于 ASP .Net Core
- amazon-redshift - 使用临时表缓存查询结果
- python - 如何在 QTableWidget 中绘图