PowerShell补全CSV中当月1日至当日的缺失日期空行
解决CSV文件补全当月1日至当前日期缺失日期行的问题
问题背景
现有CSV文件包含有序日期列,需要补全当月1日至当前日期之间所有缺失日期对应的空行。目前已能获取缺失日期,但无法在对应位置插入空行。
原代码
$f=(Get-Date -Day 1) $c=(Get-Date) $a=@() for($i=f;$i -lt $c;$i=$i.AddDays(1) { $a+=$i.ToString("yyyy-mm-dd") } $csv=Import-Csv -Path ${FilePath} -Header "Date","Token" $c=$csv[2..(csv.length-1)] | select "Date" $col=@() foreach($line in $c) { $properties=$line | Get-Member -MemberType Properties for($i=0;$i -lt $properties.Count;$i++) { $column=$properties[$i] $colvalue=$line | select -ExpandProperty $column.Name $col=$col+columnvalue } } $c= $a | ? {!($col -contains $_)}
原CSV内容
Name Date Token 2023-05-01 663 2023-05-02 522 2023-05-05 663 2023-05-07 636
当前输出(当日为5月7日)
2023-05-01 2023-05-02 2023-05-03 2023-05-04 2023-05-05 2023-05-06 2023-05-07
期望输出
Name Date Token 2023-05-01 663 2023-05-02 522 <row inserted> <row inserted> 2023-05-05 663 <row inserted> 2023-05-07 636
补充说明:需补全至当前日期,而非CSV文件中的最后日期。
解决方案
核心思路:先生成当月1日到当前日期的完整日期序列,遍历序列匹配CSV已有日期,存在则保留原行,不存在则插入空行,最后生成符合格式的完整内容。
修正后完整代码
# 定义日期范围:当月1日到当前日期(取Date部分避免时间干扰) $startDate = (Get-Date -Day 1).Date $endDate = (Get-Date).Date # 生成完整日期列表,格式统一为yyyy-MM-dd(修正原代码mm为MM,避免分钟代替月份) $fullDateList = for ($date = $startDate; $date -le $endDate; $date = $date.AddDays(1)) { $date.ToString("yyyy-MM-dd") } # 读取CSV原始内容,保留第一行"Name"和表头行 $rawCsvContent = Get-Content -Path $FilePath $headerLine = $rawCsvContent[1] # 处理数据行,转为便于匹配的对象 $dataRows = $rawCsvContent[2..($rawCsvContent.Count - 1)] | ForEach-Object { $parts = $_ -split '\s+', 2 [PSCustomObject]@{ Date = $parts[0] Token = $parts[1] } } # 构建补全后的内容集合 $completedContent = @($rawCsvContent[0], $headerLine) foreach ($date in $fullDateList) { $matchingRow = $dataRows | Where-Object { $_.Date -eq $date } if ($matchingRow) { # 存在对应日期,保留原行格式 $completedContent += "$($matchingRow.Date) $($matchingRow.Token)" } else { # 缺失日期,生成日期+空Token的行 $completedContent += "$date " } } # 将结果写入新文件(可修改路径为原文件路径实现覆盖) $completedContent | Set-Content -Path "补全后的文件.csv" -Encoding UTF8
关键说明
- 日期格式修正:原代码用
mm(分钟)代替MM(月份),导致日期格式错误,已修正。 - 原始内容保留:直接读取CSV原始文本,保留第一行的"Name"和表头格式,避免
Import-Csv破坏原有排版。 - 逐行匹配补全:遍历完整日期序列,精准匹配已有数据,缺失日期插入格式对齐的空行。
- 输出控制:最终内容保持原CSV的空格分隔格式,保证可读性。
内容的提问来源于stack exchange,提问作者HAH
相关产品推荐
相关产品推荐

