Board logo

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

作者: 观心    时间: 2014-6-24 01:04     标题: 又一次多文件批处理替换 连表达式都想不出来 求帮忙

本帖最后由 观心 于 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 谢谢你们!!!希望批处理之家合家欢乐 和谐安详!!!
作者: CrLf    时间: 2014-6-24 01:53

上传个样本
作者: PowerShell    时间: 2014-6-24 15:02

本帖最后由 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。
作者: CrLf    时间: 2014-6-24 15:20

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

回复 3# PowerShell


    perl 携妻带子为性能太差掩面泪奔,python 抱着 encode/decode 嚎啕大哭,点柱蚊香膜拜我无敌大p版主
作者: DAIC    时间: 2014-6-24 15:46

回复 3# PowerShell


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

说你懂的那部分就够了
不懂的就不要乱说了
作者: 观心    时间: 2014-6-24 19:02

回复 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
作者: 观心    时间: 2014-6-24 19:06

回复 3# PowerShell

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

比较下两个文件 看不出规律 放弃
作者: PowerShell    时间: 2014-6-24 22:21

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

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

3pk的话,还请楼主上传数据,越多,越大,越全,越好。
3.1 建议每位pk者说出自己的cpu,脚本内存占用。
3.2你若来pk最好去powershell版看看安装帖子,搞个最新版的powershell。或者这样说,每种语言的最新版本的解释器,你都要有,每种脚本的运行时间,你都要给出。
最少给出你的,和我的脚本,在你机子上的运行时间。
作者: apang    时间: 2014-6-25 00:22

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

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

也不看看自己啥德性,值得别人跟你PK不
作者: terse    时间: 2014-6-25 13:07

  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));
复制代码

作者: PowerShell    时间: 2014-6-25 17:33

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


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

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

回复 6# 观心


    比较了一下样本,还是看不懂 Volume 是怎么得出来的,顺便膜拜悟性超群的p版主,不看题意竟然也能写得好好的
作者: apang    时间: 2014-6-25 20:13

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

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

回复 14# CrLf
不管大家处于什么目的和情绪,在此都要感谢大家的关心和关注!!!拜谢!!!希望大家合家欢乐,幸福平和!
两个文件的Volume是不一样
变通的方法就是:
去掉源文件每一行最后一个分号后面的数字就可以了
作者: CrLf    时间: 2014-6-26 00:33

本帖最后由 CrLf 于 2014-6-26 21:17 编辑

回复 16# 观心


如果格式有误,请自行修改 printf(\"%%s;%%s;%%f;%%f;%%f;%%f;%%.2f\n\",name,$1,$2,$3,$4,$5,$6) 这个地方,用法和 c 语言的 printf 是一样的,网上相关介绍很多
  1. @echo off
  2. gawk -F";" "match(FILENAME,\"(.*)(......)\\.\",a)&&/^[0-9]/{gsub(/\//,\"-\",$1);printf(\"%%s;%%s;%%s;%%s;%%s;%%s;%%s\n\",a[2] \".\" a[1],$1,$2,$3,$4,$5,$6)>a[2] \".tmp\"}" *.txt >nul
  3. for %%a in (*.tmp) do (
  4.         echo $FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume
  5.         type "%%a"
  6.         echo $SKIPLINES 1
  7.         echo $SEPARATOR ,
  8.         echo $DEBUG 1
  9.         echo $BREAKONERR 1
  10.         echo $AUTOADD 1
  11. )>%%~na.txt
  12. del *.tmp
复制代码

作者: 观心    时间: 2014-6-26 00:38

回复 11# terse


    将前辈的代码存为aa.bat 执行后出现如下错误
作者: 观心    时间: 2014-6-26 01:17

本帖最后由 观心 于 2014-6-26 02:29 编辑

回复 17# CrLf

可能我表达不清楚。就是将源文件SH600099.txt 改成600099.txt(类似的还有SZ000099.txt改成000099.txt)
里面的数值相似即可,主要是要600099.txt里面的格式,600099.txt中Volume栏可以取SH600099.txt中最后两个分号中间的数值。
前辈的代码运行后每个文件内容都是
$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume
$SKIPLINES 1
$SEPARATOR ,
$DEBUG 1
$BREAKONERR 1
$AUTOADD 1

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

  600099.txt中Volume栏可以取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
附上源文件地址http://pan.baidu.com/s/1ntG5HC9
作者: CrLf    时间: 2014-6-26 04:15

回复 19# 观心


    笔误已修改,测试无误
作者: terse    时间: 2014-6-26 11:08

回复 18# 观心
我win7 系统测试正常的哦
这个什么情况 文件多大
作者: terse    时间: 2014-6-26 12:32

回复 18# 观心
脚本中处理路径自己更改下 可放在桌面或其他目录运行
如和TXT文件同一目录 可不用传递参数
  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(/\d+/);
  18.           var newfile = Folder + '/test/'+ f + ext;
  19.           var fs = file.OpenAsTextStream(1, -2);
  20.           var text = str + f2s(fs.ReadAll(),f) + arr.join('\r\n');
  21.           fs.Close();
  22.           var fs = fso.createtextfile(newfile,true);
  23.           fs.Write(text);
  24.           fs.Close();
  25.       }
  26. }
  27. function f2s(s,f) {
  28.     return s.replace(re ,
  29.            function(a,b) {
  30.               return f  + '.SS,' + b.replace(/;/g,',') + '\r\n';
  31.            });
  32. }
复制代码

作者: 观心    时间: 2014-6-26 18:02

回复 22# terse

源文件地址在19楼
大神,还是这个问题啊!
作者: PowerShell    时间: 2014-6-26 18:12

13楼:
言不成句,词不达意,还拽文言,胡说八道,还咒人劫难,诊人症状,  ---关你屁事?别写脚本了,回蒙古坐堂开方吧。
然心胸狭隘---我看装人大爷的不但心胸狭隘,还口脏乱充大辈,这真是论坛之福。你却视而不见,我诊你有眼无珠如何?或者心眼长偏了。
此山本有n山头,或曰n峰,峰岭神秀。又有台,登台献艺,你方唱罢我登场,天生瑜亮,舌计(呵呵)战群儒,有何不可?为何要按你狭隘头中所想,人人都龟缩在自己的山头中?
--------------------------------------
15楼:
本派全称为,【microsoft神教】。【powershell派】。【powershell交流宗】
本教创世之神为世界首富,比尔盖茨。本派创世人为微软架构师 Jeffrey Snover
详见  http://www.bathome.net/thread-25208-1-1.html
内有照片,他们都没死。
看完帖后,我希望你收回这句话 【你祖师爷埋哪里,我找人把它刨开,看它是否真的三头六臂】
玩bat的不尊盖茨等大神,才是论坛和众长老之辱!其他小事,跟此比,算个毛?
纵然你写过10年bat代码,也有比你写的更久的长老,或者隐士在论坛。他们对你说【小子你太狂了】你会觉得过分么?
-------------------------------
楼主:
有些要求你没说清楚,比如文件名后面那个ss,
你运行我的脚本如何?
作者: CrLf    时间: 2014-6-26 18:25

回复 24# PowerShell


    没注意兄台练的竟然是葵花宝典,怪不得和正常人不太一样。
    为追求理想勇于牺牲的人点个赞
作者: 观心    时间: 2014-6-26 18:30

回复 20# CrLf

感谢前辈在这个帖子上花了这么多时间!可是还差最后一步,好像日期前的字母代码漏掉了,也怪我没有表达清楚,让前辈费心了,就是600099后面的SS如何加上去?19楼的源文件里面有两种文本,一种SH600099.txt,一种SZ000099.txt.

SH开头的文本SH600099.txt 变换后
$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume
600099.SS,2003-08-01,5.86,5.94,5.85,5.91,757319
600099.SS,2003-08-04,5.95,6.14,5.91,6.03,1491738
600099.SS,2003-08-05,6.03,6.12,5.93,5.98,1783220
600099.SS,2003-08-06,5.94,6.06,5.93,5.94,608200
或者SH不变也可以
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

SZ开头的文本SZ000099.txt变换后
$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
作者: CrLf    时间: 2014-6-26 19:08

回复 26# 观心


这个要求之前好像没提到吧
只要把
  1. printf(\"%%s;%%s;%%s;%%s;%%s;%%s;%%s\n\",name,$1,$2,$3,$4,$5,$6)
复制代码
改成
  1. printf(\"%%s;%%s;%%s;%%s;%%s;%%s;%%s\n\",name \".SS\",$1,$2,$3,$4,$5,$6)
复制代码
即可
作者: 观心    时间: 2014-6-26 19:33

回复 27# CrLf


    不是固定的SS   是文件名开头两位字符 。比如SH开头的文件名,就用SH;SZ开头的文件名就用SZ.
对把文件名的内容写入文本中比较感兴趣,要好好学习下。
作者: CrLf    时间: 2014-6-26 20:01

回复 28# 观心


    你给的例子不是这个意思,不想回复了,为什么你给的例子老是有错
作者: 观心    时间: 2014-6-26 20:05

本帖最后由 观心 于 2014-6-26 22:40 编辑

回复 27# CrLf


恼扰了!不好意思!已经够我学习一阵子了!
作者: terse    时间: 2014-6-26 21:13

本帖最后由 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. }
复制代码

作者: CrLf    时间: 2014-6-26 21:18

回复 30# 观心


    代码已改,如格式再有变,恕不修改
作者: apang    时间: 2014-6-26 23:07

有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. }
复制代码

作者: apang    时间: 2014-6-27 00:31

to #24
跟你多说无益,你奶奶个熊!
建议CrLf每次减100,我要和这猪斗到底。
作者: terse    时间: 2014-6-27 00:41

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

本帖最后由 观心 于 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 谢谢你们!!!希望批处理之家合家欢乐 和谐安详!!!
作者: CrLf    时间: 2014-6-27 02:47

回复 36# 观心


    在顶楼就应该发这些了
作者: CrLf    时间: 2014-6-27 02:56

回复 34# apang


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

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

你不会是害怕输吧?不会的,你能舌战群儒,你是天下第一,来吧,咱们继续。
作者: CrLf    时间: 2014-6-27 23:47

回复 39# apang


    靠,把你封了怎么办(这种事某人干过),我权限高些,他封不动
作者: apang    时间: 2014-6-28 14:02

回复 40# CrLf


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




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