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

请求编写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

脚本说明

  1. 先单独提取表头写入输出文件,避免重复处理
  2. 拆分每行的四个字段,分别存储以便后续操作
  3. 直接跳过Measure Values<=0的记录
  4. 对Measure Values=1的记录,按要求重置值为1后输出
  5. 对Measure Values>1的记录,循环生成对应次数的行,每次调用子过程通过PowerShell计算递增指定秒数后的时间,确保时间格式正确
  6. 所有符合要求的记录追加写入输出文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:08:19