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

PowerShell导出CSV:动态时间范围提取及按用户分类存储的问题与优化需求

解决CSV时间范围提取与文件生成/合并问题

首先咱们先理清楚你的需求:你有一份包含用户和时间戳的CSV,想要为每个用户生成专属文件夹,里面的time.csv包含所有与该用户任意一条记录时间前后30分钟内的行,最后还想把这些分散的CSV合并成一个文件。

先拆解你原代码里的两个核心问题:

  • 时间范围判断失效:你在Where-Object里用当前循环行的时间$DHMS和它自己的前后30分钟比较,这相当于永远为真,根本没起到范围过滤的作用,自然会导出全部数据。
  • 导出逻辑重复覆盖:你循环遍历每一行数据时,每次都直接把整个原始数据集$Data导出到文件,同一个用户的多行记录会反复覆盖同一个文件,最后自然只剩最后一次导出的结果。

修正后的PowerShell代码

首先我们先预处理数据,把时间字符串转换成DateTime对象,这样后续的时间比较会更准确:

$culture = [Globalization.CultureInfo]::InvariantCulture
# 导入CSV并添加转换后的DateTime列,方便后续时间比较
$Data = Import-Csv '.\test.csv' | ForEach-Object {
    [PSCustomObject]@{
        Users = $_.Users
        DHMS = $_.DHMS
        DateTime = [DateTime]::ParseExact($_.DHMS, 'dd/MM/yy HH:mm:ss', $culture)
    }
}

# 获取所有唯一的用户列表
$uniqueUsers = $Data.Users | Get-Unique

# 为每个用户生成对应的筛选文件
foreach ($user in $uniqueUsers) {
    # 获取当前用户的所有时间戳
    $userTimeList = $Data | Where-Object { $_.Users -eq $user } | Select-Object -ExpandProperty DateTime
    
    # 筛选所有符合条件的行:该行时间在当前用户任意一条记录的前后30分钟内
    $matchingRows = $Data | Where-Object {
        $currentRowTime = $_.DateTime
        # 检查是否存在当前用户的某个时间,使得该行时间在其前后30分钟内
        $userTimeList | Where-Object { 
            $currentRowTime -ge $_.AddMinutes(-30) -and $currentRowTime -le $_.AddMinutes(30) 
        } | Select-Object -First 1
    }

    # 创建用户专属文件夹(不存在则新建)
    $userFolder = ".\$user"
    if (-not (Test-Path $userFolder)) {
        New-Item -ItemType Directory -Path $userFolder | Out-Null
    }

    # 导出筛选结果,只保留原有的Users和DHMS列
    $matchingRows | Select-Object Users, DHMS | Export-Csv -Path "$userFolder\time.csv" -NoTypeInformation -Encoding UTF8
}

运行这段代码后,就能得到你期望的每个用户文件夹下的time.csv,完全匹配你给出的示例输出。

合并所有生成的CSV文件

如果需要把所有用户的time.csv合并成一个文件,可以加上这段代码,同时会添加SourceUser列标注数据来自哪个用户的文件夹:

$mergedResult = @()

foreach ($user in $uniqueUsers) {
    $csvFilePath = ".\$user\time.csv"
    if (Test-Path $csvFilePath) {
        # 导入当前用户的CSV并添加来源标识
        $currentCsv = Import-Csv $csvFilePath | ForEach-Object {
            [PSCustomObject]@{
                SourceUser = $user
                Users = $_.Users
                DHMS = $_.DHMS
            }
        }
        $mergedResult += $currentCsv
    }
}

# 导出合并后的文件
$mergedResult | Export-Csv -Path ".\merged_all.csv" -NoTypeInformation -Encoding UTF8

这样你就能得到一个包含所有筛选结果的合并文件,方便后续统一处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:17:35