首页 > 解决方案 > 根据服务名称创建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 个字符。

在这种情况下,请告诉我如何创建带有服务名称的工作表,使其保持在限制范围内。

标签: powershell

解决方案


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”

推荐阅读