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

[文本处理] 又一次多文件批处理替换 连表达式都想不出来 求帮忙

本帖最后由 观心 于 2014-6-27 10:50 编辑

在股票数据转换当中又碰到问题:
一个文件名为 SZ000002.TXT的文本内容为:
2007/11/01;23.37;24.49;22.87;23.69;95782978;3782251008.000
2007/11/02;38.70;40.66;38.21;39.05;62871777;2495787520.000
数据来源:通达信

中间许多行,这里只取最后3行,要实现如下格式并且文件名改为000002.txt
$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume
000002.SZ,2007-11-01,23.37,24.49,22.87,23.6,957829
000002.SZ,2007-11-02,38.7,40.66,38.21,39.05,628717
$SKIPLINES 1
$SEPARATOR ,
$DEBUG 1
$BREAKONERR 1
$AUTOADD 1


目录下几千个文件都要这样改,求老师和前辈帮忙实现。自己能力浅薄,我用sed gawk连将文件名000002写入到文本内容中都弄不出来,惭愧啊!




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

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

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

非常感谢 PowerShell 的热情和执着

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

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

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

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

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

有两种字符开头的文本文件(源文件藏在#19最后)
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

本帖最后由 PowerShell 于 2014-6-24 15:13 编辑

这貌似不是简单查找替换,awk,sed,编程估计累死你,另外效率也不可能好。
先放出部分代码:
  1. # SZ000002.TXT
  2. $file = Get-Content   $args [0]  -ReadCount 0
  3. $结束 = $file.length -1
  4. $开始 = $结束 - 3
  5. $最后三行 = $file[$开始..$结束]
  6. $输出文件名temp001 = Get-ChildItem $args [0]
  7. $输出文件名temp002 = $输出文件名temp001.filename
  8. $输出文件名 = "" + $输出文件名temp002[2..$输出文件名temp002.length] + $输出文件名temp001.Extension
复制代码
对了楼主有powershell运行环境么?是什么系统,版本是powershell几点零?愿意搭建powershell脚本运行环境么?

因为我只会 超牛x的 powershell,你要是没有或不愿意搭建powershell的话,以后我也不关注,解答你的问题了。


旁白:
win下处理文件,讲功能bat肯定不行,处理不了长字符串。
awk、sed、python这些生于linux世界的软件,对unicode,中文编码不如powershell。
vbs又没有stringbuilder这个大字符串对象。
几乎powershell是最简单,功能强,编码支持最好的,至于性能,欢迎跟我写的powershell脚本pk。
1

评分人数

    • CrLf: 不懂的东西不要随意诽谤PB -40
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

本帖最后由 CrLf 于 2014-6-24 16:22 编辑

回复 3# PowerShell


    perl 携妻带子为性能太差掩面泪奔,python 抱着 encode/decode 嚎啕大哭,点柱蚊香膜拜我无敌大p版主

TOP

回复 3# PowerShell


这貌似不是简单查找替换,awk,sed,编程估计累死你,另外效率也不可能好。

说你懂的那部分就够了
不懂的就不要乱说了

TOP

回复 2# CrLf


SH600099.txt要变成600099.txt 请前辈帮忙

在第一行加上
$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume
然后每一行开始加上文件名中的数字,比如600099(主要是这一步难住我了)
然后分号改成逗号 去掉每一行最后一个分号后面的数字
最后 将最后一行替换成
$SKIPLINES 1
$SEPARATOR ,
$DEBUG 1
$BREAKONERR 1
$AUTOADD 1

TOP

回复 3# PowerShell

在这个帖子里面见你用powershell测试了,速度感觉不是很快啊!方便性应该没得说。
http://www.bathome.net/thread-30473-1-4.html
学习一下powershell看看吧!先谢谢你了!

TOP

比较下两个文件 看不出规律 放弃

TOP

1脚本在此,根据上次那个【单核】脚本简单改变而成,和上次的脚本80%以上相同,实际上powershell文本处理脚本很简单,基本都这样。如果你还需要多核的,招呼一声,也请说出你干活的cpu频率和核心,说型号也行。

2 还是哪句话,谁不服,欢迎pk,我们越用不同的脚本pk,不同的语言pk,楼主越受益。但请跟此帖,不要乱搞论坛了,拜托。

3pk的话,还请楼主上传数据,越多,越大,越全,越好。
3.1 建议每位pk者说出自己的cpu,脚本内存占用。
3.2你若来pk最好去powershell版看看安装帖子,搞个最新版的powershell。或者这样说,每种语言的最新版本的解释器,你都要有,每种脚本的运行时间,你都要给出。
最少给出你的,和我的脚本,在你机子上的运行时间。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

本帖最后由 apang 于 2014-6-25 00:37 编辑

擦,说了一通的屁话,无非是想找人PK

也不看看自己啥德性,值得别人跟你PK不

TOP

  1. @if(0)==(0) echo off
  2. md test 2>nul
  3. set ph=%~dp0
  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. String.prototype.strreg = function(filename) {
  12.     return this.replace(re ,
  13.            function(a,b) {
  14.               return filename  + '.SS,' + b.replace(/;/g,',') +'\r\n';
  15.            });
  16. };
  17. function Files(files){
  18.     var f = fso.GetFolder(files);
  19.     var fc = new Enumerator(f.files);
  20.     for (; !fc.atEnd(); fc.moveNext())
  21.     {
  22.       var file =fc.item();
  23.       var ext=/\.[^\.]+$/.exec(file);
  24.       if (ext == '.txt') {
  25.           var filename = file.name.match(/\d+/);
  26.           var newfile = f + '/test/'+ filename + ext;
  27.           var fs = file.OpenAsTextStream(1, -2);
  28.           var text = str + fs.ReadAll().strreg(filename) + arr.join('\r\n');
  29.           fs.Close();
  30.           var fs = fso.createtextfile(newfile,true);
  31.           fs.Write(text);
  32.       }
  33.      }
  34. }
  35. Files(WScript.Arguments.Item(0));
复制代码

TOP

回10楼:
我是一名脚本炼器师,恨自己才疏学浅,还未能把祖师爷的技术推演至极!
我是一名脚本炼器师,恨自己才疏学浅,还未能把祖师爷的powershell太乙精金炼制成屠龙宝刀!
我炼出n宝,刺瞎了钛金狗眼,谁不服就出来晒宝。
我分享经验,总有人受益。
我放出方案,解决问题。总有人受益。
我一步一脚印,十步杀一人,身后躺满 手持破铜烂铁;风凉话;吹牛x;质疑;炼器师的残尸。
我手持,还未炼化完美的残刃,目光深邃,登上高坛,渴望用你来磨练我的宝刀。。。
我道:“磨练技术,法宝而已,输赢没什么的,真的,来吧”


身为脚本炼器师,手持破铜烂铁,除了风凉话,吹牛x,怕输就只会做缩头乌龟,还怎在圈里混?
去年你炼制的破铜烂铁,被我实事求是地,用时间对比证明了不太佳,就来说风凉话,找后帐了么?
你应该发粪涂墙啊,你这样做难免让【所有脚本炼器师】鄙视。
1

评分人数

    • CrLf: 发粪涂墙破坏市容,说人话PB -40
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 12# PowerShell
虽版主头衔,然心胸狭隘,故心存疑惑,初为谁荐? 叹!论坛之辱!
本为P之论坛,却常有扰之,联想CMD;惭愧!
版主既然武功盖世;何不另立山头;容我等小生安生几许,又有何不可!也权当做件好事罢了。呜呼!
命中注定你难逃一劫,还是多行善事为上!
初诊:脑梗塞!
确诊:小儿脑残。
治疗方案:赶紧回去用药

TOP

回复 6# 观心


    比较了一下样本,还是看不懂 Volume 是怎么得出来的,顺便膜拜悟性超群的p版主,不看题意竟然也能写得好好的

TOP

to #12
照你这说法,除了PowerShell,其它所有脚本全都该下地狱是吧?
你“十步杀一人”,百步杀十人,地球上所有人都被你杀了,然后就“把祖师爷的技术推演至极”了是吧?
你祖师爷埋哪里,我找人把它刨开,看它是否真的三头六臂

你这鸟人,对你说点“风凉话”倒是便宜你了,但印象中没对你“吹牛x”过
对付你这种人,得用非常规的办法——对骂,然后管理员各打50大板,然后谁积分先降到零谁滚蛋
我先来:你大爷滴
1

评分人数

    • CrLf: 他大爷是我...PB -2

TOP

返回列表