Board logo

标题: [文本处理] [已解决]对应Excel字符串批量修改文件名 [打印本页]

作者: huyoyoo    时间: 2011-5-31 19:47     标题: [已解决]对应Excel字符串批量修改文件名

本帖最后由 huyoyoo 于 2011-6-3 19:17 编辑

现有一文件夹下有大量订单,文件名如下:1001a.as,1002a.as,1101a.as,1102a.as,1305a.as,1412a.as……
另有一个表格: a.xls     其中
A         B
10    北京
11    武汉
12    上海
13    广州
14    深圳
……  ……

要求进过批处理后,文件名称为 :北京01a.as,北京02a.as,武汉01a.as,武汉02a.as,广州05a.as,深圳12a.as…


请各位大虾指教
作者: batman    时间: 2011-6-1 16:19

楼主是不是所有的定单名字都是固定的前四位是数字呢?

如果不是还请楼主描述清楚划分规则,如出现11111a.as这样的情况是武汉的第111张定单还是别的城市的第11张定单?
作者: huyoyoo    时间: 2011-6-1 17:10

本帖最后由 huyoyoo 于 2011-6-1 17:15 编辑
楼主是不是所有的定单名字都是固定的前四位是数字呢?

如果不是还请楼主描述清楚划分规则,如出现11111a.as这样的情况是武汉的第111张定单还是别的城市的第11张定单?
batman 发表于 2011-6-1 16:19


是的,位数是固定,我实际订单是12位的,前六位是代表城市编码,后六位是流水号,上述例子中前2位是城市编码,后三位是流水号。
作者: tmplinshi    时间: 2011-6-1 17:11

本帖最后由 tmplinshi 于 2011-6-1 20:10 编辑

下载以下两个工具,解压至批处理所在目录:

    doctotxt (http://sourceforge.net/projects/ ... 32.tar.bz2/download)
    iconv (http://bbs.bathome.net/thread-10861-1-2.html)
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. cd /d "%~dp0"
  4. rem 设置路径
  5. set xls="d:\a.xls"
  6. set "folder=d:\含 as 文件的文件夹路径"
  7. rem 也可以直接把“含 as 文件的文件夹”拖到批处理图标上
  8. if "%~1" neq "" set "folder=%~1"
  9. for /f "tokens=1,2" %%a in ('"doctotext %xls% 2>nul | iconv -f utf-8"') do (
  10.     for %%i in ("%folder%\%%a*.as") do (
  11.         set str=%%i
  12.         ren "%%i" "%%b!str:*%%a=!"
  13.     )
  14. )
  15. pause
复制代码

作者: huyoyoo    时间: 2011-6-1 19:15

楼上的用不了啊
作者: tmplinshi    时间: 2011-6-1 19:20

本帖最后由 tmplinshi 于 2011-6-1 19:41 编辑

5# huyoyoo

设置了这两个路径吗?
rem 设置路径
set xls="d:\a.xls"
set "folder=d:\含 as 文件的文件夹路径"


--------------
批处理所在目录必须有以下文件:
ChangeLog
doctotext.exe
libgcc_s_sjlj-1.dll
libglib-2.0-0.dll
libgobject-2.0-0.dll
libgsf-1-114.dll
libiconv-2.dll
libintl-8.dll
libxml2-2.dll
VERSION
iconv.exe
libcharset1.dll
libiconv2.dll
libintl3.dll

-----------------------
4 楼的代码修改了一个小地方,你再试试。
作者: batman    时间: 2011-6-1 19:40

本帖最后由 batman 于 2011-6-1 21:50 编辑

vbs版(对应的是12位编码)
  1. Dim oexcel, vbstr
  2. Set oexcel = CreateObject("excel.application")
  3. Set ws = CreateObject("wscript.shell")
  4. oexcel.Visible = False
  5. oexcel.Workbooks.Open(ws.CurrentDirectory & "\a.xls")
  6. i = 1
  7. Do Until oexcel.Cells(i, 1).value = ""
  8.   For j = 1 To 2
  9.    vbstr = vbstr & oexcel.Cells(i, j).value & "#"
  10.   Next
  11.   vbstr = vbstr & vbCrLf
  12.   i = i + 1
  13. Loop
  14. oexcel.Workbooks.Close
  15. Set oexcel = Nothing
  16. Dim fso, filename, num, str
  17. Set fso = CreateObject("scripting.filesystemobject")
  18. For Each file In fso.GetFolder(ws.CurrentDirectory).Files
  19.   If LCase(fso.GetExtensionName(file)) = "as" Then
  20.     filename = Mid(file.Name, 7, Len(file.Name))
  21.     num = Left(file.Name, 6)
  22.     For Each str In Split(vbstr, vbCrLf)
  23.       If str <> "" Then If num = Split(str, "#")(0) Then fso.MoveFile file, file.ParentFolder & "\" & Split(str, "#")(1) & filename
  24.     Next
  25.   End if
  26. Next
  27. Set fso = Nothing
  28. Set ws = Nothing
  29. MsgBox "ok"
复制代码

作者: huyoyoo    时间: 2011-6-2 18:55

7# batman

我按楼上的方法试了,执行完了显示OK,然后就没有反应了,文件名没有改过来
作者: batman    时间: 2011-6-2 22:39

你一点都没改?起码你的后缀名是.scn,代码上是.as

还有i的初始值要设为2
作者: huyoyoo    时间: 2011-6-3 19:20

本帖最后由 huyoyoo 于 2011-6-3 19:23 编辑

感谢batman,问题解决了

另请问Excel表名对运行有影响吗?假如我的Excel中不止一个表,而是sheet1、sheet2、sheet3……
作者: batman    时间: 2011-6-3 19:58

本帖最后由 batman 于 2011-6-3 20:01 编辑

10# huyoyoo
如果数据不在sheet1中就要定义活动页sheet,如数据在sheet2中:
oexcel.Workbooks.Open(ws.CurrentDirectory & "\a.xls")
oexcel.ActiveSheet(2).Activate




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