You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键说明

  1. 日期格式修正:原代码用mm(分钟)代替MM(月份),导致日期格式错误,已修正。
  2. 原始内容保留:直接读取CSV原始文本,保留第一行的"Name"和表头格式,避免Import-Csv破坏原有排版。
  3. 逐行匹配补全:遍历完整日期序列,精准匹配已有数据,缺失日期插入格式对齐的空行。
  4. 输出控制:最终内容保持原CSV的空格分隔格式,保证可读性。

内容的提问来源于stack exchange,提问作者HAH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:35:36