Board logo

标题: [文本处理] 如何实现对文本数据中的日期时间进行格式化并将处理后的数据输出到log文件中? [打印本页]

作者: YYchen    时间: 2016-3-30 13:42     标题: 如何实现对文本数据中的日期时间进行格式化并将处理后的数据输出到log文件中?

本帖最后由 pcl_test 于 2016-3-31 19:53 编辑

假如我有以下文本数据,分隔符是”|||“:
010301|||批处理之家|||000000|||2006-10-02 15:12:08.476458|||000000|||2006-10-02 15:12:08.476458|||0
111111|||利用不可|||000000|||2006-09-29 14:20:35.10394|||000000|||2006-09-29 14:20:35.10394|||0
其中日期格式精确到了毫秒,像这样的2006-10-02 15:12:08.476458。但是,第二行中有个时间是这样的:2006-09-29 14:20:35.10394
为了保证时间格式位数都是一样的,我希望在后面补一个0,变成这样的:2006-09-29 14:20:35.103940。

输出log:
010301|||批处理之家|||000000|||2006-10-02 15:12:08.476458|||000000|||2006-10-02 15:12:08.476458|||0
111111|||利用不可|||000000|||2006-09-29 14:20:35.103940|||000000|||2006-09-29 14:20:35.103940|||0

希望大家能看看,帮个忙
作者: YYchen    时间: 2016-3-30 13:44

另外,有Linux高手么....在Linux下,AWK命令貌似不能识别|||作为分隔符,它会把它判定为3个字符?
在这种情况下该怎么办??
作者: CrLf    时间: 2016-3-30 14:11

\|
作者: xp3000    时间: 2016-3-31 15:25

本帖最后由 xp3000 于 2016-3-31 15:45 编辑

盗自pcl_test的bat+JScript混编,正则表达式字符串替换方法,修改了下正则表达式部分,但是我不会弄提取
  1. //&cls&dir /b *.txt|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. function reStr(file){
  3.     var f = fso.opentextfile(file, 1);
  4.     str = f.ReadAll().replace(/(\|)(\d{4}-\d{2}-\d{2} .{8}\.\d{5})(\|)/g,"$1$20$3");
  5.     f.Close();
  6.     var f = fso.opentextfile(file, 2);
  7.     f.Write(str);
  8. }
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');
  10. while(!WScript.StdIn.AtEndOfStream)reStr(WScript.StdIn.ReadLine());
复制代码

作者: xp3000    时间: 2016-3-31 20:17

本帖最后由 xp3000 于 2016-4-1 07:43 编辑

说真的批处理我真的不行,我就会软件,下载EmEditor这个软件安装,复制下面代码,另存为XX.JSEE
打开软件,点击宏→选择,把XX.JSEE剪切到Macros目录里面去,绿色版里面有其他人些的宏,然后打开XX.JSEE
这样宏就加载成功了
接下来打开文本或拖动文本进软件都可以,点击宏,运行,就会有自己事先写好的正则表达式规则,
下面有替换规则、提取规则、删除规则,可以自己任意添加实现批量处理,
比如把break;上面的一行复制粘贴一遍,修改里面的正则表达式部分就可以了,
提取那里,正则表达式之间用|分开,实现多规则提取,|之间最好用()把每条正则表达式括起来,
提取那里,然后另存为,目前还不会,见过有的宏提取后自动弹窗另存为XX类型文件。
  1. menu= CreatePopupMenu();
  2. 替换处理 = CreatePopupMenu();
  3. 提取处理 = CreatePopupMenu();
  4. 删除处理 = CreatePopupMenu();
  5. if (document.selection.isempty)   
  6.     nFlags=eeFindNext | eeReplaceAll | eeFindReplaceRegExp;
  7. else
  8.     nFlags=eeFindNext | eeReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp;
  9. menu.AddPopup( "替换文本", 替换处理 );
  10. 替换处理.Add( "毫秒后5个数字加个0", 1 );
  11. 替换处理.Add( "", 0, eeMenuSeparator );
  12. 替换处理.Add( "毫秒后5个数字加个0替换方法2", 4 );
  13. menu.Add( "", 0, eeMenuSeparator );
  14. menu.AddPopup( "提取文本", 提取处理 );
  15. 提取处理.Add( "正则表达式提取文本", 2 );
  16. menu.Add( "", 0, eeMenuSeparator );
  17. menu.AddPopup( "删除文本", 删除处理 );
  18. 删除处理.Add( "正则表达式删除文本", 3 );
  19. menu.Add( "", 0, eeMenuSeparator );
  20. result = menu.Track( 0 );
  21. if (result>40) nFlags=nFlags=eeFindNext | eeReplaceAll | eeFindReplaceRegExp;
  22. switch(result){
  23. case 1: //*年*月*日 *时*分*秒.*毫秒后5个数字加0,少于或多于5个数字跳过,替换规则,将正则表达式第1个()的内容和第2个()的内容之间添加一个0
  24. document.selection.Replace("(\\|[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{5})(\\|)","\\10\\2",nFlags);
  25. break;
  26. case 2: //提取文本,匹配0-9的数字一次以上,|一次以上,除换行的任意字符一次以上,|一次以上,数字0,0次或多次回车、换行
  27. document.selection.SelectAll();
  28. var content = "";
  29. var arr = document.selection.Text.match(/\d+\|+.+\|+0[\r\n]*/g);
  30. //下面是匹配两个规则的提取说明,可按要求修改上一行内容:
  31. //下面分别匹配0-9任意数一次以上,可以匹配或不匹配回车、换行或回车换行/////匹配任意英文大小写一次以上,可以匹配或不匹配回车、换行
  32. //var arr = document.selection.Text.match(/([0-9]+(\r|\n|\r\n)?)|([a-zA-Z]+([\r\n]+)?)/g);
  33. if(arr == null)
  34. {
  35. Quit();
  36. }
  37. for(var i=0;i<arr.length;i++)
  38. {
  39. content += arr[i];
  40. }
  41. editor.ExecuteCommandByID(4096);
  42. sleep(500);
  43. //下面将回车或换行,替换成回车换行,回车换行多个替换为一个回车换行
  44. document.selection.Text = content.replace(/[\r\n]/g,"\r\n").replace(/(\r\n)+/g,"$1");
  45. name = document.selection.Text;
  46. document.Save(name+'提取'+'.log'); //提取文件路径软件顶端有提示
  47. break;
  48. case 3: //删除文本,左边以0-9的六位数字开头,中间是除换行的任意77个字符以上,右侧以0收尾,如果0在行尾,可以写成(?<=0[\r\n]+)
  49. document.selection.Replace("(?=[0-9]{6}).{77,}(?<=0)","",nFlags);
  50. break;
  51. case 4: //*年*月*日 *时*分*秒.*毫秒后5微数字加0,正则表达式左边不能匹配0-9的数字,中间匹配分组1,格式为****-**-** **:**:**.*****,右边不能匹配0-9的数字,替换值表示分组1后面加一个0
  52. document.selection.Replace("(?<=[^0-9])([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{5})(?=[^0-9])","$10",nFlags);
  53. break;
  54. }
复制代码

作者: pcl_test    时间: 2016-3-31 23:06

回复 4# xp3000
  1.     str = f.ReadAll().replace(/(\d{4}(-\d{2}){2}\s+?\d{2}(:\d{2}){2})(\.\d+)/g, function($0,$1,$2,$3,$4){
  2.         var t = $4 + '00000';
  3.         return $1 + t.substr(0, 7)});
复制代码

作者: codegay    时间: 2016-4-1 06:16

  1. """
  2. python对齐日志的日期时间.py
  3. http://bbs.bathome.net/thread-39867-1-1.html
  4. 2016年4月1日 06:04:16 codegay
  5. """
  6. with open("result.log","w+") as f:
  7.     for r in open("log.log"):
  8.         line=r.split("|||")
  9.         line[3]=line[3].ljust(26,"0")
  10.         line[5]=line[5].ljust(26,"0")
  11.         f.write('|||'.join(line))
复制代码

作者: xp3000    时间: 2016-4-1 07:15

在软件上面倒是一条就能解决,勾选正则表达式
(\s\d{2}:\d{2}:\d{2}\.\d{5})(\D)
替换
$10$2

批处理对于一般用户还是一抹黑的,一大堆东西要记,
grepWin这个软件,也很方便,直接在要处理的文件夹空白处右键选择grepWin,能批量处理所有文本。

grepWin文本搜索,在搜索和替换为选框内把上面的内容填写上,添至预置,以后想用就翻出来用,
win7系统C:\Users\Administrator\AppData\Roaming\grepWin文件夹下面有个bookmarks文件,
这个就是预置文件了,重装系统前备份,以后要用复制回来就好了

EmEditor软件替换大文本比较厉害,十万行也就分多钟时间,grepWin替换十万个小文本几分钟到十几分钟就解决了,如果有现成的批处理还是很不错的,只需要点击一下,不用像一些软件还要把一个个文件打开或拖进去,烦都烦死了




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