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

[文本处理] 为什么c1没有正常传递?

[复制链接]
发表于 2025-12-5 00:42:56 | 显示全部楼层 |阅读模式
要处理的temp3.csv的数据如下:
,c1 ,c2 ,c3 ,c4 ,c5 ,c6 ,c7 ,c8 ,c9 ,c10
,1,2,3,4,5,6,7,8,9,10
,11,12,13,14,15,16,17,18,19,20
,21,22,23,24,25,26,27,28,29,30
,31,32,33,34,35,36,37,38,39,40
,41,42,43,44,45,46,47,48,49,50
,51,52,53,54,55,56,57,58,59,60
,61,62,63,64,65,66,67,68,69,70
,71,72,73,74,75,76,77,78,79,80
,81,82,83,84,85,86,87,88,89,90
,91,92,93,94,95,96,97,98,99,100
编写了如下批处程序:
@echo off
if not exist temp3.csv echo "temp3.csv has not generated, please run program above :next" && pause
setlocal enabledelayedexpansion

if exist *.txt del *.txt
REM --------------------------------------------
REM extracting the first row of temp.csv
REM --------------------------------------------

for /L %%k in (1,1,6) do (
set iter=%%k

set line=0
(for /f "tokens=*" %%a in (temp3.csv) do (
set /a line+=1

set numb=0
for %%i in (%%a) do (
REM --------------------------------------------
REM extracting the name for comparision
REM --------------------------------------------
set /a numb+=1

if !line!==1 if !numb!==!iter! set name=%%i
if !numb!==!iter! echo %%i
                    )
))>!name!.txt

)
但是结果出现了:
.txt
c1.txt
c2.txt
c3.txt
c4.txt
c5.txt
为什么会出现.txt?而不是c1.txt,显示都向后面滞后了一位。我用程序核实了.txt这个循环中的name取值,其值的确是c1。但是不知在>!name!.txt文献输出的时候,所有的取值都向后滞后了一位。有没有高手帮助解释一下原因,多谢多谢!
发表于 2025-12-5 05:25:36 | 显示全部楼层
temp3.csv 第一个字符是(,) 默认是分隔符,第一个获取的变量应该是空白的
IF %%a ==“ ”   是空白或空格,则跳过吧,,,
爪机分析,没有实写,鄙人也是瞎分析,,,自行判断!
 楼主| 发表于 2025-12-5 08:33:14 | 显示全部楼层
回复 2# jiavip
我核实了,但是!name!在循环中显示是正确的,没有任何问题,没有出现空值问题,但是在>!name!.txt中,却出现了空值,这是我很困惑的地方。
 楼主| 发表于 2025-12-5 08:46:04 | 显示全部楼层
感觉出现变量滞后传递问题,我看看可能是循环输出的时候,应该在set !name!=%%i出现在输出>!name!.txt之后,因为循环输出在更上一次循环中。
发表于 2025-12-5 09:02:55 | 显示全部楼层
回复 3# delab-1
改为for /L %%k in (2,1,7) do (试试
当你使用>重定向操作符时,CMD会在执行命令前先展开变量,而此时!name!还没有被正确赋值。
发表于 2025-12-5 11:20:01 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-12-5 12:52 编辑

回复 1# delab-1


( for /f "tokens=*" %%a in (temp3.csv) do (...) )>!name!.txt 这个复合语块被首次处理时,变量 name 尚未被赋值,因此 cmd 默认采用空值即成 ".txt" 文件名。可改用以下代码(略去源注释行)...

  1. @echo off &setlocal enabledelayedexpansion
  2. for /L %%k in (1,1,6) do (
  3.    set /a "iter=%%k,line=0"
  4.    (for /f "tokens=*" %%a in (temp3.csv) do (
  5.        set /a "line+=1,numb=0"
  6.        for %%i in (%%a) do (
  7.           set /a numb+=1
  8.           if !line! equ 1 if !numb! equ !iter! set "name=%%i"
  9.           if !numb! equ !iter! echo,%%i)
  10.    ))>#.$
  11.    ren #.$ "!name!.txt"
  12. )
  13. pause&exit/b
复制代码
备注》对比一楼源代码和以上代码可体会 cmd 处理复合语块(典型如 (for ...) )的机制...
发表于 2025-12-5 17:46:42 | 显示全部楼层
回复 1# delab-1
  1. @echo off
  2. set "InpuFile=temp3.csv"
  3. if not exist "%InpuFile%" (
  4.     echo "%InpuFile% has not generated"
  5.     pause
  6.     exit /b
  7. )

  8. setlocal enabledelayedexpansion
  9. set /p FirstLine=<"%InpuFile%"
  10. set "iter=0"
  11. for %%k in (%FirstLine%) do (
  12.     set /a iter+=1
  13.     if !iter! leq 6 (
  14.         (for /f "tokens=*" %%a in ('type "%InpuFile%"') do (
  15.             set "numb=0"
  16.             for %%i in (%%a) do (
  17.                 set /a numb+=1
  18.                 if !numb!==!iter! echo %%i
  19.             )
  20.         ))>"%%k.txt"
  21.     )
  22. )
复制代码
 楼主| 发表于 2025-12-6 12:00:44 | 显示全部楼层
回复 5# holley


    这样处理是不行的,因为传递问题没有解决,问题依然存在。
 楼主| 发表于 2025-12-6 12:01:37 | 显示全部楼层
回复 6# aloha20200628


    采取另存为的思路不错,这个可行的
 楼主| 发表于 2025-12-6 12:16:23 | 显示全部楼层
回复 7# ShowCode


    这个处理思路很好,感谢。把!name!取值放在第一层循环,而且程序简洁,思路清晰,非常好!感谢感谢
发表于 2025-12-6 13:30:49 | 显示全部楼层
回复 9# delab-1

以上代码均须多次读取源数据文件,以下给一个仅须读取一次的版本...

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (temp3.csv) do (
  3.    if not defined f1 for %%v in (%%a) do set/a "n+=1" &set "f!n!=%%v.txt"
  4.    set "n=0" &for %%v in (%%a) do set/a "n+=1" &for %%n in (!n!) do set "c%%n=!c%%n! %%v")
  5. for /l %%n in (1,1,6) do (for %%v in (!c%%n!) do echo,%%v)>"!f%%n!"
  6. pause&exit/b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:06 , Processed in 0.020465 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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