Board logo

标题: [文本处理] [已解决]bat在读取非ANSI格式的文本时的问题 [打印本页]

作者: iq301    时间: 2014-6-20 23:19     标题: [已解决]bat在读取非ANSI格式的文本时的问题

本帖最后由 iq301 于 2014-6-22 18:20 编辑

bat在读取非ANSI格式的文本时,没有数值输出,我试过用finstr  type more 都不行,
附件599.txt是从LINUX服务器生成的文本,在for里面运行以下bat,会读取不了。

@echo off& setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%a in ('findstr . G:\bat\599.txt') do (
set a=%%a&set a=!a:008C=        !
set b==!a:telepath=        !
set c==!b:08C=        !
set d==!c:01101C=        !
set aa=!d:100C=        success        !
for /f "tokens=1,2,3,4,5,6 delims=         " %%e in ("!aa!") do (
echo        %%f        %%h        %%i        %%j
)
) >>g:\bat\5.txt
endlocal
pause  

请教一:bat在读取非ANSI格式的文本时,如果修改里面的内容,会直接导致文本排序很乱,有没方法可以把非ANSI格式的文本转换成ANSI格式的文本
二:以上代码在把599.txt最后一行的空行删除或随意修改一下,就能读取到,这是为何?
作者: Batcher    时间: 2014-6-20 23:34

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in ('more 599.txt ^| findstr "telepath"') do (
  4.     set a=%%a
  5.     set a=!a:008C= !
  6.     set b==!a:telepath= !
  7.     set c==!b:08C= !
  8.     set d==!c:01101C= !
  9.     set aa=!d:100C= success !
  10.     for /f "tokens=1-6" %%e in ("!aa!") do (
  11.         echo %%f %%h %%i %%j
  12.     )
  13. ))>599_new.txt
复制代码

作者: iq301    时间: 2014-6-20 23:51

回复 2# Batcher


    谢谢,其实这问题之前已请教过,但是我就是找不出原因在哪。为什么findstr会读不出
作者: Batcher    时间: 2014-6-21 00:21

回复 3# iq301


    没有为什么,它就是不支持那种格式。
作者: CrLf    时间: 2014-6-21 00:49

这不是编码的问题,是行结束符的问题
不含宽字符的无 BOM utf-8 与 ansi 无区别
作者: iq301    时间: 2014-6-21 12:55

嗯,谢谢你们的帮助。
作者: PowerShell    时间: 2014-6-21 13:03

本人拙帖 《面向对象之妙》系列的第五季,《powershell占用内存之妙》中,http://www.bathome.net/thread-30621-1-1.html
说明了 powershell为什么是处理unicode最好的脚本语言!没有之一。你用它解决你的问题最简单。
简单来说,powershell对  编码,换行,识别的妙。
作者: CrLf    时间: 2014-6-21 18:22

本帖最后由 CrLf 于 2014-6-21 18:41 编辑

gawk:
  1. gawk "{gsub(/008C|telepath|08C|01101C/,\"    \");gsub(/100C/,\"success    \");$1=$1;printf(\"       %s        %s        %s        %s\n\",$2,$4,$5,$6);exit}" 599.txt>599_修改.txt
复制代码
perl:
  1. open(IN,'599.txt');
  2. open(OUT, ">599_修改.txt");
  3. foreach(<IN>){
  4. $_ =~ s/008C|telepath|08C|01101C/    /ig;
  5. $_ =~ s/100C/    success    /ig;
  6. @a = split;
  7. printf(OUT "       %s        %s        %s        %s\n",
  8. @a[1],@a[3],@a[4],@a[5]);
  9. }
复制代码

作者: iq301    时间: 2014-6-22 18:19

thank you very much~




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