找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 12265|回复: 7

[文本处理] 批处理For /L 循环参数不能正常传递,希望大家给与指导

[复制链接]
发表于 2024-10-8 22:10:43 | 显示全部楼层 |阅读模式
各位大佬,我下面的程序中出现一个问题:
%%i可以在第一个expt_%%i中正确取值,export_%%.csv可以顺利的转化为expt_2015.csv 和expt_2016.csv。
但是,在第二部分(即:skip之后部分),expt_%%i.csv就不能正确转化,expt_%%i.csv的实际输出却为expt_%i.csv,并非非期望的expt_2015.csv和expt_2016.csv。

但是%%i的确是在For /L的大循环内部,非常奇怪的是%%i在第二部分不能正常取值,这是为什么呢?有没有解决办法。感谢大家了
  1. setlocal enabledelayedexpansion
  2. @echo off
  3. chcp 65001>null
  4. ::-------------s1: export data-------------------------------------------
  5. for /L %%i in (2015,1,2016) do (

  6.   copy %%i12_export_cum.csv temp.csv
  7. :: writing the headline
  8.   for /f %%e in (temp.csv) do (
  9.    echo %%e >expt_%%i.csv
  10.    goto skip)
  11.    
  12.    :skip
  13. :: writting the data with com formatted as 8 digit   
  14.     (for /f "skip=1 tokens=1,2* delims=," %%a in (temp.csv) do (
  15.        set str=000%%~b
  16.        set F4=!str:~-8!
  17.        echo %%a,!F4!,%%c
  18.        ))>>expt_%%i.csv

  19.                                   )
复制代码
发表于 2024-10-8 22:38:36 | 显示全部楼层
回复 1# delab-1


发表于 2024-10-8 23:26:14 | 显示全部楼层
goto会一去不复返,还有不要在for里定义标签(包括那个可以当注释用的双冒号标签)
发表于 2024-10-9 11:12:59 | 显示全部楼层
回复 1# delab-1

试试订正后的代码,如下

  1. @echo off &setlocal enabledelayedexpansion
  2. chcp 65001>null
  3. for /L %%i in (2015,1,2016) do (
  4.         copy "%%i12_export_cum.csv" temp.csv
  5.         REM writing the headline
  6.         (for /f %%e in (temp.csv) do echo %%e)>"expt_%%i.csv"
  7.         REM writting the data with com formatted as 8 digit
  8.         (for /f "skip=1 tokens=1,2* delims=," %%a in (temp.csv) do (
  9.                 set str=000%%~b
  10.                 set F4=!str:~-8!
  11.                 echo %%a,!F4!,%%c
  12.         ))>>"expt_%%i.csv"
  13. )
复制代码
 楼主| 发表于 2024-10-9 13:20:23 | 显示全部楼层
回复 4# aloha20200628


    感谢感谢!我当时写入skip的原因,是想让第一行的变量名称写入到新调整后的数据文本第一行。所以,循环到第一行后就跳出。
现在您的程序,是把所有的都显示进入了,不知可否在改进一下?

后来我采用set /p headline=<temp.csv,把第一行提取出来的。
发表于 2024-10-9 15:05:35 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-10-12 15:20 编辑

回复 5# delab-1

  1. @echo off &setlocal enabledelayedexpansion
  2. chcp 65001>null
  3. for /L %%i in (2015,1,2016) do (
  4.    copy "%%i12_export_cum.csv" temp.csv
  5.    ( REM writing the headline
  6.      set/p headline=<"temp.csv" &echo,!headline!
  7.      REM writting the data with com formatted as 8 digit
  8.      for /f "skip=1 tokens=1,2* delims=," %%a in (temp.csv) do (
  9.          set str=000%%~b
  10.          set F4=!str:~-8!
  11.          echo,%%a,!F4!,%%c
  12.    ))>"expt_%%i.csv"
  13. )
复制代码
发表于 2024-10-9 20:31:38 | 显示全部楼层
  1. @echo off
  2. chcp 65001 >nul
  3. cd /d "%~dp0"
  4. for /l %%l in (2015,1,2016) do (
  5.         (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^< "%%l12_export_cum.csv"') do (
  6.                 if %%a equ 1 (
  7.                         echo %%b
  8.                 ) else (
  9.                         (for /f "tokens=1-2* delims=," %%c in ("%%b") do (
  10.                                 set str1=%%c
  11.                                 set str2=%%d
  12.                                 set str3=%%e
  13.                                 setlocal enabledelayedexpansion
  14.                                 echo !str1!,!str2:~-8!,!str3!
  15.                                 endlocal
  16.                         )) || echo=
  17.                 )
  18.         )) > "expt_%%l.csv"
  19. )
  20. pause
复制代码
发表于 2024-10-9 20:35:56 | 显示全部楼层
回复 7# 77七


   忘记补0了..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 17:26 , Processed in 0.018730 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表