如何在Windows PowerShell中对每日JS数据文件做预处理并按月合并?
问题
我每日会生成一个JS格式的数据文件,内容示例如下:
m[mi++]="26.03.23 23:55:00|0;0;0;2720;0;0;0|488;0;3270" m[mi++]="26.03.23 23:50:00|0;0;0;2720;0;0;0|1360;0;3220" m[mi++]="26.03.23 23:45:00|0;0;0;2720;0;0;0|192;0;3110" ...
我希望将所有文件按月合并为一个文件,目前用Windows PowerShell的cat *.js > 2023_04.csv命令可以实现基本合并,但合并前需要完成以下操作:
- 反转文件行顺序,让时间从升序排列(原数据是降序)
- 移除每行开头的
m[mi++]=" - 移除每行结尾的
" - 将每行中的
|替换为;
请问以上操作能否在PowerShell中实现?如果不行,最佳的脚本实现方案是什么?
回答
完全可以在PowerShell中实现所有需求,用一条管道命令就能搞定:
Get-ChildItem -Filter *.js | Get-Content | ForEach-Object { # 移除首尾冗余字符并替换分隔符 $_ -replace '^m\[mi\+\+\]="', '' -replace '"$', '' -replace '\|', ';' } | Sort-Object | Out-File -FilePath "2023_04.csv" -Encoding utf8
命令细节解释:
Get-ChildItem -Filter *.js:批量获取当前目录下所有JS格式文件Get-Content:读取每个文件的所有行内容ForEach-Object块:对每行执行三项文本处理:^m\[mi\+\+\]=":匹配行首的m[mi++]="并移除(正则中特殊字符需转义)"$:匹配行尾的"并移除\|:匹配所有|并替换为;
Sort-Object:默认按升序排序,刚好把原数据的时间降序转为升序Out-File:将处理后的内容写入目标CSV文件,指定utf8编码避免中文或特殊字符乱码
如果原文件内的行是严格按时间倒序排列,也可以用[Array]::Reverse()反转行顺序,效率更高:
$processedLines = Get-ChildItem -Filter *.js | Get-Content | ForEach-Object { $_ -replace '^m\[mi\+\+\]="', '' -replace '"$', '' -replace '\|', ';' } [Array]::Reverse($processedLines) $processedLines | Out-File -FilePath "2023_04.csv" -Encoding utf8
额外提示:
- 如果JS文件中存在非目标格式的行(比如注释、其他代码),可以在处理前加过滤:
Where-Object { $_ -match '^m\[mi\+\+\]="' },只处理符合格式的数据行 - 避免用纯重定向
>输出文件,它会默认使用系统编码(通常是GBK),容易导致乱码,Out-File能更灵活指定编码
内容的提问来源于stack exchange,提问作者SNWBRDR
相关产品推荐
相关产品推荐

