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
相关产品推荐
相关产品推荐

