返回列表 发帖
回复 15# winbat

核对下代码,不改5楼的代码直接运行只显示“请按任意键继续. . . ”么?

TOP

本帖最后由 pcl_test 于 2016-9-30 18:18 编辑

回复 16# pcl_test


// 5 楼的代码运行只 cmd 回显,“ 请按任意键继续. . .  ”
// 号码段文本\批处理等全放在一个文件夹,添加 8 楼 输出代码 运行,没输出

TOP

本帖最后由 pcl_test 于 2016-12-1 19:34 编辑

回复 17# winbat
//&cls&cd /d "%~dp0"&cscript -nologo -e:jscript "%~f0"&pause&exit
var fso = new ActiveXObject('Scripting.FileSystemObject');
var file = '截取号码段.txt';
var s = '', files={}, list={};
if(!fso.FileExists(file))WSH.Echo(file+'不存在');
var text = fso.OpenTextFile(file, 1).ReadAll().split(/[\r\n]/);
for(var i=0; i<text.length; i++){
    var name = text[i].slice(0,4);
    if(!files[name])files[name]=1;
    text[i].replace(/\d{4}(\d{7})\d{2}-\d{4}(\d{7})\d{2}/, function(a,b,c){
        for(var j=Number(1+''+b);j<=Number(1+''+c);j++){
            list[name+(''+j).slice(1)]=j
        }
    })
}
for(var f in files){
    if(!fso.FileExists(f+'.txt')){
        WSH.Echo(f+'.txt不存在')
    }else{
        try{
            var ftext = fso.OpenTextFile(f+'.txt', 1).ReadAll().split(/[\r\n]/);
            for(var i=0; i<ftext.length; i++){
                var str = ftext[i].replace(/^\s*|\s*$/g,'');
                if(!/^\d{13}$/.test(str))WSH.Echo(f+'.txt:第'+(i+1)+'行['+str+']含有非数字字符或长度不为13位');
                if(list[str.slice(0,11)])s+=str+'\r\n';
            }
        }catch(e){WSH.Echo(f+'.txt为空文件')}
    }
}
fso.CreateTextFile('结果.txt', 2).Write(s);COPY
这样呢,显示什么

TOP

回复 1# winbat

测试于 win7 64位
@echo off & setlocal enabledelayedexpansion
>result.txt cd.
for /f "tokens=1,2 delims=-" %%a in (截取号码段.txt) do (
    set "a=%%a" & set "b=%%b" & set "name=!a:~0,4!"
    for /f tokens^=2delims^=: %%i in ('find /c /v "" "!name!.txt"') do set /a "lb=0, ub=%%i, sk=ub/2"
    call :PAfterLines "!name!.txt" "!a:~0,13!" 0
    call :writeTemp "!name!.txt" tmpfile new
    sort /r tmpfile /o tmpfile
    for /f tokens^=2delims^=: %%i in ('find /c /v "" tmpfile') do set /a "lb=0, ub=%%i, sk=ub/2"
    call :PAfterLines tmpfile "!b:~0,13!" -1
    call :writeTemp tmpfile result.txt
)
sort result.txt /o result.txt
del tmpfile
pause
exit
:writeTemp infile outfile new
if "%3" neq "" >"%~2" cd.
if !sk! equ 0 (copy "%~2" + "%~1" "%~2" & exit /b)
>>"%~2"  (for /f skip^=%sk% %%a in (%~s1) do echo;%%a)
exit /b
REM order = 0 升序 order = -1 反序
:PAfterLines file str order
if !sk! equ 0 exit /b
for /f skip^=%sk% %%a in (%~1) do (
    if !lb! geq !ub! exit /b
    if "%%a" gtr "%~2" (
        set /a "ub=(~%3 & sk)|(%3 & ub), lb=(~%3 & lb)| (%3 & (sk+^!(lb-sk))), sk=(lb+ub)>>1"
        call :PAfterLines %~1 %~2 %3 &  exit /b
    ) else if "%%a" equ "%~2" (         exit /b
    ) else (
        set /a "lb=(~%3 & (sk+^!(lb-sk)))|(%3 & lb), ub=(~%3 & ub)|(%3 & sk), sk=(lb+ub)>>1"
        call :PAfterLines %~1 %~2 %3 &  exit /b
    )
)
exit /bCOPY
1

评分人数

    • winbat: 测试代码能过技术 + 1

TOP

本帖最后由 codegay 于 2016-10-1 01:52 编辑

python3
楼主这个数据源太不多科学了。应该切分成列合并,统一存到一个数据库或者表格中。需要的时候再查询出来。
尼马地这样各种分片拼接字符串,又搞各种类型转换,麻烦累,效率还低。
#2016年10月1日 00:25:33 codegay
with open("截取号码段.txt") as f:
号码段 =  [r.strip().split("-") for r in f.readlines()]
result = []
for s,e in 号码段:
fn = s[:4] #filename
start = s[4:11]
end = e[4:11]
numlist = [fn+str(r).rjust(7,'0') for r in range(int(start),int(end)+1)]
with open(fn+".txt") as f:
txt = f.readlines()
for n in numlist:
result += [l for l in txt if l.startswith(n)]
print(result)
with open("newresult.txt","w+") as f:
f.writelines(result)COPY
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 18# pcl_test


   生成 结果.txt 文本但没内容

TOP

回复 19# aa77dd@163.com


    生成 result.txt ,内容是合并号码段文本,没截取

cmd 回显:

tmpfile
0000.txt
已复制         1 个文件。
tmpfile
1250.txt
已复制         1 个文件。
请按任意键继续. . .

TOP

本帖最后由 pcl_test 于 2016-10-1 12:41 编辑

回复 21# winbat

嗯,我以你顶楼给出的样本测试没有问题,自行找原因或者把QQ私密我吧

TOP

回复 20# codegay


    国庆节快乐!不懂 py3 机子到装了 py2.7 , 数据处理并不需要分割,不好意思你理解错了这是我的错,图片只为了更直观的了解。截取结果是例如上传的 result.txt 输出结果。

TOP

回复 23# pcl_test


    好的,谢谢 @pcl_test 老大 国庆节快乐!

TOP

本帖最后由 aa77dd@163.com 于 2016-10-1 14:04 编辑

回复 22# winbat

我测试是所有文件都在同一目录

好吧   我知道楼主是一点批处理也不会了   只用在 截取号码段.txt 前加上目录 tmp\ 就行了

仍有疑问, 下载完整测试包
http://pan.baidu.com/s/1gfr1Kyv
@echo off & setlocal enabledelayedexpansion
>result.txt cd.
for /f "tokens=1,2 delims=-" %%a in (tmp\截取号码段.txt) do (
    set "a=%%a" & set "b=%%b" & set "name=!a:~0,4!"
    for /f tokens^=2delims^=: %%i in ('find /c /v "" "!name!.txt"') do set /a "lb=0, ub=%%i, sk=ub/2"
    call :PAfterLines "!name!.txt" "!a:~0,13!" 0
    call :writeTemp "!name!.txt" tmpfile new
    sort /r tmpfile /o tmpfile
    for /f tokens^=2delims^=: %%i in ('find /c /v "" tmpfile') do set /a "lb=0, ub=%%i, sk=ub/2"
    call :PAfterLines tmpfile "!b:~0,13!" -1
    call :writeTemp tmpfile result.txt
)
sort result.txt /o result.txt
del tmpfile
fc result.txt 期待结果.txt
pause
exit
:writeTemp infile outfile new
if "%3" neq "" >"%~2" cd.
if !sk! equ 0 (copy "%~2" + "%~1" "%~2" & exit /b)
>>"%~2"  (for /f skip^=%sk% %%a in (%~s1) do echo;%%a)
exit /b
REM order = 0 升序 order = -1 反序
:PAfterLines file str order
if !sk! equ 0 exit /b
for /f skip^=%sk% %%a in (%~1) do (
    if !lb! geq !ub! exit /b
    if "%%a" gtr "%~2" (
        set /a "ub=(~%3 & sk)|(%3 & ub), lb=(~%3 & lb)| (%3 & (sk+^!(lb-sk))), sk=(lb+ub)>>1"
        call :PAfterLines %~1 %~2 %3 &  exit /b
    ) else if "%%a" equ "%~2" (         exit /b
    ) else (
        set /a "lb=(~%3 & (sk+^!(lb-sk)))|(%3 & lb), ub=(~%3 & ub)|(%3 & sk), sk=(lb+ub)>>1"
        call :PAfterLines %~1 %~2 %3 &  exit /b
    )
)
exit /bCOPY
1

评分人数

    • winbat: 测试代码结果正解技术 + 1

TOP

这些是号码是条形码?
还是门店之类编码?
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 27# codegay


    嗯,是条形码

TOP

回复 26# aa77dd@163.com


    谢谢,@aa77dd@163.com 代码测试通过,手工试了另一批产品结果 号码段及数量 都对,非常感谢 @aa77dd@163.com @pcl_test  @codegay 及热帮助的坛友们。
这里是个很能让人学习到东西的地方,期望坛子越来越好!最后祝大家国庆快乐!

TOP

回复 29# winbat


    楼主你当真在这个论坛学东西了吗?

TOP

返回列表