使用PowerShell将CSV的Days列拆分至对应星期列的需求
PowerShell处理CSV星期时间拆分方案
问题描述
需要将第三方工具导出的空格分隔类CSV数据中的Days字段拆分,按星期(Mon-Sun)分配到独立列,无论原始数据中星期的顺序如何。
解决脚本
# 定义固定顺序的星期列表 $weekDays = 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' # 读取输入文件,跳过表头后拆分每一行的FQDN和Days $devices = Get-Content -Path '.\input.txt' | Select-Object -Skip 1 | ForEach-Object { $parts = $_ -split '\s{2,}', 2 [PSCustomObject]@{ FQDN = $parts[0].Trim() Days = $parts[1].TrimEnd('; ') } } # 处理每个设备的时间数据,生成目标格式对象 $output = $devices | ForEach-Object { $device = $_ # 初始化所有星期的时间为空字符串 $dayTimes = @{} $weekDays | ForEach-Object { $dayTimes[$_] = '' } # 拆分每个星期的时间条目 $dayEntries = $device.Days -split ';\s*' foreach ($entry in $dayEntries) { if (-not $entry) { continue } # 匹配标准格式:星期 + 时间 if ($entry -match '^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s+(.*)$') { $day = $matches[1] $times = $matches[2].Trim() $dayTimes[$day] = $times } # 处理异常格式(如"Sat Fri 00:00-08:45"),提取正确星期和时间 elseif ($entry -match '(Sat|Sun)\s+(Fri)\s+(.*)$') { $targetDay = $matches[1] $times = $matches[3].Trim() $dayTimes[$targetDay] = $times } } # 构建包含所有星期列的输出对象 $outputProps = @{ FQDN = $device.FQDN } foreach ($day in $weekDays) { $outputProps[$day] = $dayTimes[$day] } [PSCustomObject]$outputProps } # 控制台输出对齐结果 $output | Format-Table -AutoSize # 导出为制表符分隔的文件(避免时间中的逗号干扰) # $output | Export-Csv -Path '.\output.tsv' -NoTypeInformation -Delimiter "`t"
关键说明
- 数据读取:使用正则
\s{2,}拆分多个空格分隔的FQDN和Days字段,适配原始数据格式。 - 异常处理:针对原始数据中
Sat Fri、Sun Fri的错误格式,提取正确星期对应的时间。 - 格式修正(可选):如果需要修正
00:00-:08:45这类时间格式错误,可在赋值$times后添加:$times = $times -replace '-:', '-0' - 输出选项:控制台用
Format-Table保证对齐;导出文件建议用TSV(制表符分隔),避免时间中的逗号破坏CSV格式。
内容的提问来源于stack exchange,提问作者majan
相关产品推荐
相关产品推荐

