请求编写Batch脚本实现CSV记录过滤与行拆分逻辑
CSV文件处理的Batch脚本修复需求
需要对指定格式的CSV文件执行以下处理规则:
- 过滤所有
Measure Values字段值小于等于0的记录 - 若
Measure Values字段值大于1,将该行复制对应次数,每条复制记录的Datetime字段递增1秒,同时把Measure Values重置为1
之前编写的Batch脚本无法正确实现需求,会错误复制所有记录,现需修正脚本。
输入文件示例
Datetime,Measure Names,Category,Measure Values 03/14/2023 16:33:44,Sales ,Table,1 03/14/2023 16:33:44,Amt,Table,0 03/14/2023 16:33:44,Profilt,Table,1 03/14/2023 16:33:44,Qty,Table,2
尝试的错误脚本
@echo off setlocal enabledelayedexpansion set input_file=input.csv set output_file=output.csv (for /f "usebackq tokens=*" %%a in ("%input_file%") do ( set line=%%a set measure values=!line:*,=! if "!measure values!" gtr "0" ( echo !line! ) )) > "%output_file%"
期望输出示例
Datetime,Measure Names,Category,Measure Values 03/14/2023 16:33:44,Qty,Table,1 03/14/2023 16:33:45,Qty,Table,1
正确的Batch脚本
@echo off setlocal enabledelayedexpansion set "input_file=input.csv" set "output_file=output.csv" :: 写入表头到输出文件 (for /f "usebackq tokens=*" %%a in ("%input_file%") do ( echo %%a goto :process_data_lines )) > "%output_file%" :process_data_lines :: 处理数据行,跳过表头 (for /f "usebackq skip=1 tokens=1-3* delims=," %%a in ("%input_file%") do ( set "datetime=%%a" set "measure_name=%%b" set "category=%%c" set "measure_val=%%d" :: 过滤Measure Values<=0的记录 if !measure_val! LEQ 0 ( goto :next_line ) :: 处理Measure Values=1的情况,直接输出(重置为1) if !measure_val! EQU 1 ( echo !datetime!,!measure_name!,!category!,1 goto :next_line ) :: 处理Measure Values>1的情况,循环生成对应次数的记录 set "loop_count=0" :generate_lines if !loop_count! GEQ !measure_val! ( goto :next_line ) :: 调用子过程计算递增后的时间 call :add_single_second "!datetime!" !loop_count! updated_datetime echo !updated_datetime!,!measure_name!,!category!,1 set /a loop_count+=1 goto :generate_lines :next_line )) >> "%output_file%" goto :eof :: 子过程:给指定时间增加n秒,返回结果到指定变量 :add_single_second set "original_time=%~1" set "add_seconds=%~2" set "result_var=%~3" :: 借助PowerShell处理时间递增,避免Batch自身的日期时间处理局限 for /f "tokens=*" %%t in ('powershell -Command "(Get-Date -Date '%original_time%').AddSeconds(%add_seconds%).ToString('MM/dd/yyyy HH:mm:ss')"') do ( set "%result_var%=%%t" ) goto :eof
脚本说明
- 先单独提取表头写入输出文件,避免重复处理
- 拆分每行的四个字段,分别存储以便后续操作
- 直接跳过
Measure Values<=0的记录 - 对
Measure Values=1的记录,按要求重置值为1后输出 - 对
Measure Values>1的记录,循环生成对应次数的行,每次调用子过程通过PowerShell计算递增指定秒数后的时间,确保时间格式正确 - 所有符合要求的记录追加写入输出文件
内容的提问来源于stack exchange,提问作者Saranya
相关产品推荐
相关产品推荐

