1

我有一个批处理脚本,它调用一个 jscript 文件(下面的链接)将 excel 工作簿工作表保存为 csv 文件。 http://gotochriswest.com/blog/2011/05/05/excel-batch-convert-xls-to-csv/

然后我使用批处理脚本将这些文件合并在一起。但是,如果我遇到名为类似的文件

文件 1

文件2

文件 10

文件 11

然后文件将按以下顺序合并:

文件 1

文件 10

文件 11

文件2

以这种顺序呈现信息并不令人满意。

有谁知道使用批处理或任何其他脚本语言的方法,该方法可以在典型的 Windows 计算机(例如 JScript/VBscript)上运行,允许以“人类”顺序合并文件?

我尝试实现的方法如下:如果文件名包含数字,则确定该数字包含多少位并相应地添加零。例如file1会变成file001.

这一次又一次地惨败。这可以做到吗?有没有更好的办法?

4

4 回答 4

2

添加前导零的方法应该有效 - 它究竟是如何失败的?

还有这些文件名是如何生成的?它们只是序号,还是任意的?如果它们是连续的,则不必计算最大位数,而是可以选择一个常数,让我们说总共 10 位数。如果你做 10,算法只会在你有超过 10 000 000 000 个文件要处理时才会中断,我希望这不会发生

于 2013-04-09T20:28:50.947 回答
1

此脚本在文件名中添加前导零。将文件名的长度设置为%pre%变量中零的数量。不处理长度较大的文件名。如果文件名已经存在,则会发生错误。查看输出并删除echo之前的命令,ren如果可以的话。

@echo off&setlocal
set "pre=0000000000" &rem max filename length-1

for /f "delims=:" %%i in ('^(@echo(%pre%^&@echo(^)^|findstr /o $') do set /a MinNameLength=%%i-3
for %%i in (*) do (
    set "fname=%%~ni"
    setlocal enabledelayedexpansion
    for /f "delims=:" %%i in ('^(@echo(!fname!^&@echo(^)^|findstr /o $') do set /a fnamelen=%%i-3
    if !fnamelen! lss %MinNameLength% (
        set "fname=%pre%!fname!
        set "fname=!fname:~-%MinNameLength%!
        echo ren "%%~fi" "!fname!%%~xi"
    ) else (
    echo file name too long: %%~nxi
    )
    endlocal
)
endlocal

我建议您复制文件而不是重命名它们!

于 2013-04-09T21:30:43.183 回答
0

有多种方法可以按不区分大小写的顺序对字符串数组(如文件名)进行排序,其中数字按值而不是按字符排序。这个非常适用于大型阵列,也适用于大多数小型阵列。

Array.prototype.naturalSort= function naturalSort(index){
    var T= this, L= T.length, i, who, next,
    isi= typeof index== 'number',
    rx=/(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.\D+)|(\.$)/g;
    function nSort(aa, bb){
        var a= aa[0], b= bb[0], a1, b1, i= 0, n, L= a.length;
        while(i<L){
            if(!b[i]) return 1;
            a1= a[i];
            b1= b[i++];
            if(a1!== b1){
                n= a1-b1;
                if(!isNaN(n)) return n;
                return a1>b1? 1:-1;
            }
        }
        return b[i]? -1:0;
    }
    for(i= 0;i<L;i++){
        who= T[i];
        next= isi? T[i][index] || '':who;
        T[i]= [String(next).toLowerCase().match(rx), who];
    }
    T.sort(nSort);
    for(i= 0;i<L;i++){
        T[i]= T[i][1];
    }
}

如果需要,您可以重写它以将其从 Array 原型中取出并传入数组。

于 2013-04-09T22:02:53.970 回答
0

如果所有文件都有相同的命名方案,即从“file1”到“file999”,那么很容易(而且很快!)实现这样的重命名。下面的批处理文件有两个参数:文件名的固定部分和新名称中所需的位数。例如renumber.bat file 4,会产生新名称,例如“file0001”、“file0002”... 到“file0999”。

@echo off
for %%a in ("%~1*.*") do (
   set "name=%%~Na"
   setlocal EnableDelayedExpansion
   set number=0000000000!name:%~1=!
   ECHO ren "%%a" "%~1!number:~-%2!%%~Xa"
   endlocal
)

编辑添加了可选方法

另一方面,正如 Endoro 在他的回答中建议的那样,下面的批处理文件在名称中插入前导零。在这种情况下,将新名称的总长度放在第一个参数中;原始较长的名称将不会被处理。

@echo off
for %%a in (*.*) do (
   set name=0000000000000000%%a
   setlocal EnableDelayedExpansion
   set newName=!name:~-%1!
   if "!newName:~0,1!" equ "0" ECHO ren "%%a" "!newName!"
   endlocal
)
于 2013-04-10T02:49:21.143 回答