[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 terse 于 2014-6-27 00:37 编辑

回复 30# 观心
可能测试文件不一
零能否检查文件夹下有不符文件吗
暂时加个判断
我这里运行环境 WIN7 小范围测试
测试文件大小 200KB左右 3000多行的文件成功处理
  1. @if(0)==(0) echo off
  2. rem 目录路径自己更改
  3. set ph=f:\export
  4. cscript //nologo //E:JScript "%~f0" %ph%
  5. pause&exit
  6. @end;
  7. var fso = new ActiveXObject("Scripting.FileSystemObject");
  8. var re = /^(.*);[^\;]+$/gm;
  9. var str = '$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume' + '\r\n';
  10. var arr = ['$SKIPLINES 1' , '$SEPARATOR ,' , '$DEBUG 1' , '$BREAKONERR 1', '$AUTOADD 1'];
  11. var Folder=fso.GetFolder(WScript.Arguments.Count()?WScript.Arguments.Item(0):".");
  12. if (!fso.FolderExists(Folder+'/test/')) { fso.CreateFolder(Folder+'/test/')};
  13. for(var fc=new Enumerator(Folder.Files);!fc.atEnd();fc.moveNext()){
  14.     var file =fc.item();
  15.     var ext=/\.[^\.]+$/.exec(file);
  16.     if (ext == '.txt') {
  17.         var f = file.name.match(/(^[a-zA-Z]+)(([0-9]){6})\./);
  18.         if (f) {
  19.             var newfile = Folder + '/test/'+ f[2] + ext;
  20.             var fs = file.OpenAsTextStream(1, -2);
  21.             if(!fs.Atendofstream)
  22.             {
  23.                 var text = str + fs.ReadAll().replace
  24.                 (re ,
  25.                    function(a,b) {
  26.                       return f[2]  + "." + f[1] + "," + b.replace(/;/g,',')+ "\r\n";
  27.                    }
  28.                 ) + arr.join('\r\n');
  29.                 fso.createtextfile(newfile,true).Write(text);
  30.             }  
  31.             fs.close();
  32.         }
  33.     }
  34. }
复制代码
再加个 判断行字符 排除类似最后行的
刚刚下载了样本 处理时间 1分多点
貌似有重复文件名 没处理直接覆盖
  1. @if(0)==(0) echo off
  2. set t=%time%
  3. rem 目录路径自己更改
  4. set ph=f:\export
  5. if exist "%ph%\" (set ph="%ph%") else set ph=
  6. cscript //nologo //E:JScript "%~f0" %ph%
  7. echo %T% %time%
  8. pause&exit
  9. @end;
  10. var fso = new ActiveXObject("Scripting.FileSystemObject");
  11. var re = /^(.+);([^;]+$)/gm;
  12. var str = '$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume' + '\r\n';
  13. var arr = ['$SKIPLINES 1' , '$SEPARATOR ,' , '$DEBUG 1' , '$BREAKONERR 1', '$AUTOADD 1'];
  14. var Folder=fso.GetFolder(WScript.Arguments.Count()?WScript.Arguments.Item(0):".");
  15. if (!fso.FolderExists(Folder+'/test/')) { fso.CreateFolder(Folder+'/test/')};
  16. for(var fc=new Enumerator(Folder.Files);!fc.atEnd();fc.moveNext()){
  17.       var file =fc.item();
  18.       var ext=/\.[^\.]+$/.exec(file);
  19.       if (ext == '.txt') {
  20.           var f = file.name.match(/(^[a-zA-Z]+)((\d){6})\./);
  21.           if (f) {
  22.              var newfile = Folder + '/test/'+ f[2] + ext;
  23.              var fs = file.OpenAsTextStream(1, -2);
  24.              if(!fs.Atendofstream)
  25.              {
  26.                 var t='';
  27.                 fs.ReadAll().replace(re,
  28.                    function(a,b) {
  29.                        t+= f[2]  + '.'  + f[1] + ',' + b + '\r\n';
  30.                    }
  31.                 )
  32.                 if (t) {
  33.                    var text = str + t.replace(/;/g,',') + arr.join('\r\n');
  34.                    fso.createtextfile(newfile,true).Write(text);
  35.                 }
  36.              }
  37.              fs.Close();
  38.           }
  39.       }
  40. }
复制代码

TOP

回复 30# 观心


    代码已改,如格式再有变,恕不修改

TOP

有N多零字节文件,楼主把下载地址藏在#19
  1. @if(0)==(0) echo off
  2. md "e:\Result" 2>nul
  3. pushd "e:\Day\"
  4. ::第3行更改为实际路径
  5. dir /b *.txt | cscript -nologo -e:jscript "%~0">"%~dp0Error.Log"
  6. pause&exit
  7. @end;
  8. var fso = new ActiveXObject("Scripting.FileSystemObject");
  9. var str = '$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume';
  10. var arr = ['$SKIPLINES 1', '$SEPARATOR ,', '$DEBUG 1', '$BREAKONERR 1', '$AUTOADD 1'];
  11. while (!WScript.StdIn.AtEndOfStream) {
  12.     var strLine =WScript.StdIn.ReadLine();
  13.     try {
  14.         var NewName = strLine.substr(2);
  15.         var f = fso.OpenTextFile(strLine, 1);
  16.         var txt = f.ReadAll();
  17.         f.Close();
  18.         txt = txt.replace(/(.*);[^;]+\r\n/g,
  19.             function(s0,s1) {
  20.                 return NewName.split('.')[0] + '.SS,' + s1 + '\r\n'
  21.             }
  22.         );
  23.         txt = str + '\r\n' + txt.replace(/;/g, ',') + arr.join('\r\n');
  24.         fso.CreateTextFile('e:\\Result\\'+NewName, true).Write(txt);
  25.     } catch(e) {WScript.Echo('未处理:' + strLine)}
  26. }
复制代码

TOP

to #24
跟你多说无益,你奶奶个熊!
建议CrLf每次减100,我要和这猪斗到底。
1

评分人数

TOP

回复 24# PowerShell
只能说你病得不轻,你父母知道不?估计你吃药时间到了都不知道!也难怪 你脑残嘛,记得下次出门多吃药!

TOP

本帖最后由 观心 于 2014-6-27 01:06 编辑

经过几天论坛上神人们的关心 鄙人的问题得到完美解决 在此结贴 谢谢大家的关心和耐心

在下机器的基本配置 I3 12G

非常感谢 PowerShell 的热情和执着

因为net framework 4.5.2没有装好 c:盘空间竟然不够需要2836MB 可用1403MB 时间匆忙因此没有测试 等后天用2003在ramos中测试看行不行

其次感谢 terse 全程跟踪的默默关心和付出  您的代码测试需要2分钟左右 最终选择了您的代码常用 谢谢

还有 CrLf 麻烦阁下费了许多心思 因为在下的学识浅薄 一个问题难以描述清楚 谢谢您的不厌其烦 让我获益良多 您的代码测试需要3分钟左右

还要感谢 apang 最后的绝杀一剑  您的代码在机器上用了2分钟左右 虽然SH 和SZ没有分别表示 但是将未处理的文件都考虑到了 谢谢您的细心

最后再完整的描述一下鄙人的问题

有两种字符开头的文本文件
1、以SH开头的文本比如 SH600099.TXT
2、以SZ开头的文本比如 SZ000099.TXT

其中 1、
以SH开头的文本比如 SH600099.TXT 格式如下,最后一行以“数据来源:”结束。
2003/08/01;5.86;5.94;5.84;5.91;757319;6021637.000
2003/08/04;5.95;6.14;5.91;6.03;1491738;12023611.000
2003/08/05;6.03;6.12;5.93;5.98;1783220;14456444.000
2003/08/06;5.93;6.06;5.93;5.93;608200;4914825.000
2003/08/07;5.94;6.01;5.92;5.93;490916;3944958.000
2003/08/08;5.95;5.99;5.78;5.83;893227;7121715.000
2003/08/11;5.80;5.84;5.79;5.80;215771;1688739.000
2003/08/12;5.79;5.86;5.79;5.85;298740;2343791.000
2003/08/13;5.84;5.87;5.78;5.81;177700;1396385.000
2003/08/14;5.86;5.92;5.78;5.78;114259;895077.000
2003/08/15;5.87;5.87;5.77;5.84;546519;4263697.000
2003/08/18;5.78;5.80;5.78;5.78;45000;351128.000
2003/08/19;5.84;5.84;5.78;5.79;101390;792405.000
2003/08/20;5.79;5.83;5.74;5.80;69170;539040.000
2003/08/21;5.84;5.84;5.74;5.79;53620;417572.000
2003/08/22;5.79;5.84;5.74;5.79;76800;599503.000
2003/08/25;5.80;5.82;5.74;5.77;91848;715345.000
2003/08/26;5.79;5.79;5.73;5.77;108367;841339.000
2003/08/27;5.77;5.77;5.72;5.74;58160;450937.000
2003/08/28;5.71;5.86;5.67;5.81;315739;2458913.000
2003/08/29;5.84;5.84;5.67;5.69;231281;1794956.000
数据来源:

转换成600099.txt (也就是SH600099.TXT文件名前面的SH 去掉) 格式如下:

$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume
600099.SH,2003-08-01,5.86,5.94,5.85,5.91,757319
600099.SH,2003-08-04,5.95,6.14,5.91,6.03,1491738
600099.SH,2003-08-05,6.03,6.12,5.93,5.98,1783220
600099.SH,2003-08-06,5.94,6.06,5.93,5.94,608200
600099.SH,2003-08-07,5.94,6.01,5.92,5.93,490916
600099.SH,2003-08-08,5.95,5.99,5.79,5.83,893227
600099.SH,2003-08-11,5.8,5.85,5.8,5.8,215771
600099.SH,2003-08-12,5.8,5.86,5.8,5.85,298740
600099.SH,2003-08-13,5.85,5.88,5.79,5.82,177700
600099.SH,2003-08-14,5.87,5.92,5.79,5.79,114259
600099.SH,2003-08-15,5.88,5.88,5.78,5.85,546519
600099.SH,2003-08-18,5.79,5.8,5.79,5.79,45000
600099.SH,2003-08-19,5.85,5.85,5.79,5.8,101390
600099.SH,2003-08-20,5.8,5.84,5.75,5.8,69170
600099.SH,2003-08-21,5.85,5.85,5.75,5.8,53620
600099.SH,2003-08-22,5.8,5.85,5.75,5.8,76800
600099.SH,2003-08-25,5.8,5.82,5.74,5.77,91848
600099.SH,2003-08-26,5.8,5.8,5.74,5.77,108367
600099.SH,2003-08-27,5.78,5.78,5.73,5.74,58160
600099.SH,2003-08-28,5.71,5.87,5.68,5.82,315739
600099.SH,2003-08-29,5.85,5.85,5.68,5.7,231281
$SKIPLINES 1
$SEPARATOR ,
$DEBUG 1
$BREAKONERR 1
$AUTOADD 1


2、以SZ开头的文本比如 SZ000099.TXT 格式如下,最后一行以“数据来源:”结束。
2003/08/01;5.86;5.94;5.84;5.91;757319;6021637.000
2003/08/04;5.95;6.14;5.91;6.03;1491738;12023611.000
2003/08/05;6.03;6.12;5.93;5.98;1783220;14456444.000
2003/08/06;5.93;6.06;5.93;5.93;608200;4914825.000
2003/08/07;5.94;6.01;5.92;5.93;490916;3944958.000
2003/08/08;5.95;5.99;5.78;5.83;893227;7121715.000
2003/08/11;5.80;5.84;5.79;5.80;215771;1688739.000
2003/08/12;5.79;5.86;5.79;5.85;298740;2343791.000
2003/08/13;5.84;5.87;5.78;5.81;177700;1396385.000
2003/08/14;5.86;5.92;5.78;5.78;114259;895077.000
2003/08/15;5.87;5.87;5.77;5.84;546519;4263697.000
2003/08/18;5.78;5.80;5.78;5.78;45000;351128.000
2003/08/19;5.84;5.84;5.78;5.79;101390;792405.000
2003/08/20;5.79;5.83;5.74;5.80;69170;539040.000
2003/08/21;5.84;5.84;5.74;5.79;53620;417572.000
2003/08/22;5.79;5.84;5.74;5.79;76800;599503.000
2003/08/25;5.80;5.82;5.74;5.77;91848;715345.000
2003/08/26;5.79;5.79;5.73;5.77;108367;841339.000
2003/08/27;5.77;5.77;5.72;5.74;58160;450937.000
2003/08/28;5.71;5.86;5.67;5.81;315739;2458913.000
2003/08/29;5.84;5.84;5.67;5.69;231281;1794956.000
数据来源:

转换成000099.txt (也就是SZ000099.TXT文件名前面的SZ 去掉) 格式如下:

$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume
000099.SZ,2003-08-01,5.86,5.94,5.85,5.91,757319
000099.SZ,2003-08-04,5.95,6.14,5.91,6.03,1491738
000099.SZ,2003-08-05,6.03,6.12,5.93,5.98,1783220
000099.SZ,2003-08-06,5.94,6.06,5.93,5.94,608200
000099.SZ,2003-08-07,5.94,6.01,5.92,5.93,490916
000099.SZ,2003-08-08,5.95,5.99,5.79,5.83,893227
000099.SZ,2003-08-11,5.8,5.85,5.8,5.8,215771
000099.SZ,2003-08-12,5.8,5.86,5.8,5.85,298740
000099.SZ,2003-08-13,5.85,5.88,5.79,5.82,177700
000099.SZ,2003-08-14,5.87,5.92,5.79,5.79,114259
000099.SZ,2003-08-15,5.88,5.88,5.78,5.85,546519
000099.SZ,2003-08-18,5.79,5.8,5.79,5.79,45000
000099.SZ,2003-08-19,5.85,5.85,5.79,5.8,101390
000099.SZ,2003-08-20,5.8,5.84,5.75,5.8,69170
000099.SZ,2003-08-21,5.85,5.85,5.75,5.8,53620
000099.SZ,2003-08-22,5.8,5.85,5.75,5.8,76800
000099.SZ,2003-08-25,5.8,5.82,5.74,5.77,91848
000099.SZ,2003-08-26,5.8,5.8,5.74,5.77,108367
000099.SZ,2003-08-27,5.78,5.78,5.73,5.74,58160
000099.SZ,2003-08-28,5.71,5.87,5.68,5.82,315739
000099.SZ,2003-08-29,5.85,5.85,5.68,5.7,231281
$SKIPLINES 1
$SEPARATOR ,
$DEBUG 1
$BREAKONERR 1
$AUTOADD 1

转换要求:
除了改文件名外,文本内容就是将源文本中第一行加上
$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume

文本中间 每一行以文件名中的数字开头 如:000099     接着显示文件名中的字符 如:SZ或SH (根据文件名前两个字符而定)

然后转换日期的格式 然后将分号改为逗号 然后去掉每一行最后分号后面的所有字符


最后一行替换成
$SKIPLINES 1
$SEPARATOR ,
$DEBUG 1
$BREAKONERR 1
$AUTOADD 1

以上 本帖完美获得解决 感谢关心此帖的几位大佬 apang CrLf PowerShell terse 谢谢你们!!!希望批处理之家合家欢乐 和谐安详!!!

TOP

回复 36# 观心


    在顶楼就应该发这些了

TOP

回复 34# apang


    我的权限最多 -30 积分
    卧槽,我翻了下旧帖,发现powershell 的合约早就过期半年了,一直以为是从去年 8 月到今年 8 月,不知道有没有哪位有意继任那个版块
    虽然这样不好,但还是求围观:http://bbs.bathome.net/redirect. ... 0719&pid=150230,求站长扣我 500 积分

TOP

to #24
擦,等着它出招,这2B减了点分数,自己当缩头乌龟去了

你不会是害怕输吧?不会的,你能舌战群儒,你是天下第一,来吧,咱们继续。

TOP

回复 39# apang


    靠,把你封了怎么办(这种事某人干过),我权限高些,他封不动

TOP

回复 40# CrLf


    这种后果我想到了:大不了管理员将我和它都赶走。我重新注册个ID,原本就是来学习的,影响不大。
事端由它挑起,它要封我,吐沫也会淹死它。

TOP

返回列表