Board logo

标题: [文本处理] 求助批处理把CSV文件按照C3单元格内容重命名文件 [打印本页]

作者: haichuan5121    时间: 2021-5-30 05:17     标题: 求助批处理把CSV文件按照C3单元格内容重命名文件

大神好:
    求助批量将CSV文件按照各自的d8+C3单元格内容重新命名;
作者: qixiaobin0715    时间: 2021-5-30 07:29

未测试,效率不高,小批量、小文件应当还行。请自行测试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.csv') do (
  4.     set n=0
  5.     for /f "tokens=3,4 delims=," %%a in (%%i) do (
  6.         set /a n+=1
  7.         if !n!==3 (
  8.             set str=%%a
  9.         ) else if !n!==8 (
  10.             set str=%%b!str!
  11.         )
  12.     )
  13.     ren "%%i" "!str!.csv"
  14. )
  15. pause
复制代码

作者: haichuan5121    时间: 2021-5-31 09:57

回复 2# qixiaobin0715


   谢谢大哥哥:提取的是D列D3和G列 G13 的数据;改成tokens 2.3 提取的是C F列数据;内网不能传附件文件被加密;如果取C3 C8 C12 三个名字的组合怎么修正啊
for /f "tokens=2,3
作者: qixiaobin0715    时间: 2021-5-31 10:58

你可以复制部分文本片段来看看。
作者: haichuan5121    时间: 2021-5-31 21:08

本帖最后由 haichuan5121 于 2021-5-31 21:54 编辑

回复 4# qixiaobin0715


    大哥哥: CSV文件就直接按这个测试的;CSV格式是逗号“”,“”隔开的;
大哥哥的代码修改后可以准确取不同列的可以实现了;
取同列的不同行怎么改呢;比如C2+C6 命名文件;
A1        B1        C1        D1        E1        F1
A2        B2        C2        D2        E2        F2
A3        B3        C3        D3        E3        F3
A4        B4        C4        D4        E4        F4
A5        B5        C5        D5        E5        F5
A6        B6        C6        D6        E6        F6
A7        B7        C7        D7        E7        F7
A8        B8        C8        D8        E8        F8
A9        B9        C9        D9        E9        F9
A10        B10        C10        D10        E10        F10
A11        B11        C11        D11        E11        F11
A12        B12        C12        D12        E12        F12
A13        B13        C13        D13        E13        F13
A14        B14        C14        D14        E14        F14
A15        B15        C15        D15        E15        F15
A16        B16        C16        D16        E16        F16
A17        B17        C17        D17        E17        F17
作者: qixiaobin0715    时间: 2021-6-1 06:14

回复 5# haichuan5121
tokens后面的数字代表列数,!n!代表行数。在3楼你说有问题,所以我说的是提供一下现实中的文件片段,而不是自己随便造一个,看看到底哪里出了问题。没办法,还是你自己修改吧。
作者: haichuan5121    时间: 2021-6-1 09:28

回复 6# qixiaobin0715
各位老师大哥哥**姐原文是这个格式的CSV;
需要全部改成 第二行第三列+第四行第三列  重命名;文件好几千个;
2021/06/01 15236为名字怎么弄撒!

Start Time,,2021/06/01,05:23:49
End Time,,2021/06/01,06:03:11
C1 ID,,1c08
D2 ID,,15236
Port No.,,4

Processed Substrate,,10
Processed Substrate,,6193

Sub. No.,,501
作者: qixiaobin0715    时间: 2021-6-1 10:47

本帖最后由 qixiaobin0715 于 2021-6-2 11:53 编辑

回复 7# haichuan5121
主要原因是第二列空白造成的,小批量运行下列代码试试,未经测试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.csv') do (
  4.     set n=0
  5.     for /f "delims=" %%j in (%%i) do (
  6.         set "var=%%j"
  7.         set "var=!var:,,=,@,!"
  8.         for /f "tokens=3 delims=," %%a in ("!var!") do (
  9.             set /a n+=1
  10.             if !n!==2 (
  11.                 set str=%%a
  12.             ) else if !n!==4 (
  13.                 set str=!str! %%a
  14.                 set "str=!str:/=!"
  15.             )
  16.         )
  17.     )
  18.     if not exist "!str!.csv" (
  19.         ren "%%i" "!str!.csv"
  20.     ) else (
  21.         set k=1
  22.         for /l %%x in (1,1,9) do (
  23.             if !k!==1 if not exist "!str!%%x.csv" ren "%%i" "!str!%%x.csv"&set k=0
  24.         )
  25.     )
  26. )
  27. pause
复制代码

作者: newswan    时间: 2021-6-1 11:18

本帖最后由 newswan 于 2021-6-1 11:25 编辑

用函数,每次得到一个值
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. call :f a.txt 1 d var
  4. echo %var%
  5. goto :END
  6. rem %1 file row colume
  7. :f
  8. set/a r=%2-1
  9. if %r%==0 (
  10.     for /f "tokens=1-11 delims=," %%a in (%1) do (
  11.         set %4=%%%3
  12.         goto :eof
  13.     )
  14. ) else (
  15.     for /f "skip=%r% tokens=1-11 delims=," %%a in (%1) do (
  16.         set %4=%%%3
  17.         goto :eof
  18.     )
  19. )
  20. goto :eof
  21. :END
复制代码

作者: newswan    时间: 2021-6-1 11:31

本帖最后由 newswan 于 2021-6-1 11:40 编辑

主程序部分
  1. for /f "delims=" %%a in ('dir /b *.csv') do (
  2.     call :f "%%a" 2 c v1
  3.     call :f "%%a" 3 c v2
  4.     echo "%%a" !v1!+!v2!.csv
  5. )
复制代码

作者: haichuan5121    时间: 2021-6-2 11:12

回复 8# qixiaobin0715


    第二行字符是2021/06/01  “/”不支持命名报错;怎么把/去掉后再命名啊; set !a:/=! 不好使啊;
另外C2+C4有重名文件的话不会转换;  怎么解!
作者: qixiaobin0715    时间: 2021-6-2 11:36

回复 11# haichuan5121
去掉/,已修改。
作者: qixiaobin0715    时间: 2021-6-2 11:55

回复 11# haichuan5121
对付重名文件来个简单的,后面加1、2...9。最多能对付9个重名文件。未测试。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2