Board logo

标题: 如何分离汉字行和非汉字行 [打印本页]

作者: abczxc     时间: 2007-5-10 19:43    标题: 如何分离汉字行和非汉字行

假如有下面一个文本1.txt(我随便写的),怎么把其中指定的几行写入另外个文本,希望高手,各位兄弟姐妹帮忙.
1 adsfdasfdfdsfds
2 dsafdsafdasfdsafdsfds
3 我爱北京天安门
4 dsfdsfdsf dfdsfdsf sdffdsfsd
5 fdsfadsfdsfdsafdsf
6 我爱毛主席
7 dsafdsafs
8 爹亲娘亲不如毛主席亲
9 dsafadsfsdafdsafsda
把其中的3,6,8行写入另外一个文本1new.txt啊,怎么弄啊

还有就是谁能帮我写个脚本或批处理。把上面的一个文本中所有
以汉字开头的一行和它下面的一行写入另外一个文本.我不知道脚本是否有根据
ASCII码或者其它什么码识别汉字啊!

怎么弄啊,我要把一个MP3里的文本做成同步lyrics歌词,英语歌词太长了
各位各位,帮帮我啊

[ Last edited by bjsh on 2007-7-31 at 02:44 PM ]
作者: abczxc     时间: 2007-5-10 19:45
如何筛选,高手门啊
作者: lxmxn     时间: 2007-5-10 21:24
1.txt 文件内容前面本来就有行号的吗?
作者: lililulula     时间: 2007-5-11 09:18

for /f "tokens=1* delims= " %%i in (1.txt) do (if "%%i"=="3" echo %%j>1new.txt)
for /f "tokens=1* delims= " %%i in (1.txt) do (if "%%i"=="6" echo %%j>>1new.txt)
for /f "tokens=1* delims= " %%i in (1.txt) do (if "%%i"=="8" echo %%j>>1new.txt)
[ Last edited by lililulula on 2007-5-11 at 09:21 AM ]
作者: abczxc     时间: 2007-5-11 11:11


  Quote:
1.txt 文件内容前面本来就有行号的吗?

我加上的,反正已经有了.lxmxn版主高手,你能再给我指点指点
吗,再救救我吗........

[ Last edited by abczxc on 2007-5-11 at 11:22 AM ]
作者: abczxc     时间: 2007-5-11 11:20
3 楼的同志啊,你写的批处理怎么运行后,就最后第8行啊,是什么原因啊
作者: lililulula     时间: 2007-5-11 11:29
回楼上 你再看看? 我经过测试没问题,3,6,8行内容导出到1new.txt
作者: slore     时间: 2007-5-11 12:05
@echo off&setlocal EnableDelayedExpansion
for %%i in (3 6 8) do Set /a line=%%i-1&&Call :OutLine !line!

pause>nul
goto :EOF

:OutLine
for /f "skip=%1 tokens=1* delims=" %%j in (1.txt) do echo %%j &&goto OutFor
:OutFor

[ Last edited by slore on 2007-5-11 at 12:06 PM ]
作者: ansipeter     时间: 2007-5-11 12:23

for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt^|findstr /r "^3: ^6: ^8:"') do echo %%b >>1new.txt
[ Last edited by ansipeter on 2007-5-11 at 12:25 PM ]
作者: lxmxn     时间: 2007-5-11 17:31
Re abczxc:

如果不用去掉行号,可以这样:
findstr "^3 ^6 ^8" 1.txt>nfile.txt
要去掉行号的话,可以参考4、8、9楼的代码。
作者: abczxc     时间: 2007-5-12 13:17    标题: 有更高级.更能让人懒惰的脚本吗

还有就是谁能帮我再写个脚本或批处理。把上面的一个文本中所有
以汉字开头的一行和跟随它下面的一行写入另外一个文本.我不知道脚本是否有根据ASCII码或者其它什么码识别汉字啊!

怎么弄啊,我要把一个MP3里的文本做成同步lyrics歌词,英语歌词太长了
各位各位,帮帮忙啊

谢谢大家的帮助,有没有有象上面说的更高级,更懒的脚本啊(怎么区分汉字和英语字母)

[ Last edited by abczxc on 2007-5-12 at 01:20 PM ]
作者: zhoushijay     时间: 2007-5-12 13:23
请按任意键继续...
作者: youxi01     时间: 2007-5-12 15:38
如果是简单的汉字的话,本人认为可以判断 该字符 是否是大于 z 来确定是否是汉字.
作者: lxmxn     时间: 2007-5-12 17:00    标题: Use sed


sed -n "/^[\x80-\xff][\x00-\xff]/{N;p}" urfiles>dfile
有什么bug请吱一声。
作者: abczxc     时间: 2007-5-12 19:53
sed -n "/^[\x80-\xff][\x00-\xff]/{N;p}" urfiles>dfile
sed 好像是linux下的处理文本流的东东吧
我不会安装,麻烦lxmxn大哥给个for windows 的sed我,
好吗.
作者: xhuser     时间: 2007-5-12 21:05
高手啊
作者: lxmxn     时间: 2007-5-12 21:10


  Quote:
Originally posted by abczxc at 2007-5-12 19:53:
sed -n "/^[\x80-\xff][\x00-\xff]/{N;p}" urfiles>dfile
sed 好像是linux下的处理文本流的东东吧
我不会安装,麻烦lxmxn大哥给个for windows 的sed我,
好吗.

Linux 下的也可以在win下面使用啊。

发一个上来。
附件 1: sed.rar (2007-5-12 21:10, 40.33 K, 下载附件所需积分 1点 ,下载次数: 419)

作者: ebfok     时间: 2007-5-12 21:19
我也来试试:把所有以汉字开头的一行和它下面的一行写入另外一个文本
Const ForReading = 1, ForWriting = 2
Dim fso, f,ff
Set fso = CreateObject("Scripting.FileSystemObject")
File = InputBox("请输入要处理文件路径和名称:")
Set f = fso.OpenTextFile(File, ForReading, True)
out = ""
Do While f.AtEndOfStream <> True
   line = f.ReadLine
   If f.AtEndOfStream <> True Then
           If Asc(Left(line,1))<0 Or Asc(Left(line,1))>255 Then
                   out = out & line & vbCrLf & f.ReadLine & vbCrLf
           End If
   Else
           out = out & line & vbCrLf
   End If
Loop
f.Close
Set ff = fso.OpenTextFile(File & "_new.txt", ForWriting, True)
ff.Write (out)
ff.Close
Msgbox "已生成新文件:" & File & "_new.txt!"
测试通过,请不要加行号!
将代码保存为filter.vbs再双击执行后输入你要处理的文件路径和名称如c:\windows\myfile.txt即可!

[ Last edited by ebfok on 2007-5-12 at 09:28 PM ]
作者: slore     时间: 2007-5-12 22:19
Const ForReading = 1, ForWriting = 2
Dim fso, f,ff
Set fso = CreateObject("Scripting.FileSystemObject")
File = InputBox("请输入要处理文件路径和名称:")
Set f = fso.OpenTextFile(File, ForReading, True)
out = ""
Do While f.AtEndOfStream <> True
    line = f.ReadLine
    ''If f.AtEndOfStream <> True Then  '这个条件句是废的……
    If Asc(Left(line,1)) < 0 or Asc(Left(line,1)) > 255 Then  '小于0就是汉字了吧?
        out = out & line & vbCrLf & f.ReadLine & vbCrLf
    End If
    ''Else
    ''    out = out & line & vbCrLf
    ''End If
Loop
f.Close
Set ff = fso.OpenTextFile(File & "_new.txt", ForWriting, True)
ff.Write out
ff.Close
MsgBox "已生成新文件:" & File & "_new.txt!"
Set f=nothing
Set fso =nothing
作者: ebfok     时间: 2007-5-13 09:09


  Quote:
Originally posted by slore at 2007-5-12 22:19:
Const ForReading = 1, ForWriting = 2
Dim fso, f,ff
Set fso =[/col ...

那个条件句真的是废的吗?你恐怕没实验过那段代码吧!一开始我也是没加这个判断的,可是执行不了!后来几番调试才领悟到:DO...LOOP循环之间有两次读行操作,试想,经过干次循环,读到文件只剩最后一行的时候,此时因没有到达文件尾,还是会进入DO..LOOP循环,执行完循环中的第一次读行操作后,文件就到尾了!这时,如果不加判断语句,程序试图再读下一行,就会报错!!不知道说清楚没有,你还是做下实验吧,如果不加判断语句,根据文件行数的不同,程序可能会报错也可能不会报错!可能还有更妥当的解决方法也不一定

[ Last edited by ebfok on 2007-5-13 at 09:24 AM ]
作者: ebfok     时间: 2007-5-13 09:15
汉字的码的范围我不清楚,只随便找了几个汉字实验,反正汉字不可能在0-255之间就是,所以。。(恳请哪位知道的告知一下汉字的识别方法!)
再顺便问一下你用的什么vbs编辑器?

[ Last edited by ebfok on 2007-5-13 at 09:19 AM ]
作者: slore     时间: 2007-5-13 09:22
明白你的意思了。。。但是你逻辑还是有问题。。报错是因为你又用了了次f.readline

所以第一的line是肯定可以读到的。你这个判断句应当在下面的判断句里面。

这样也一样……

要这种格式的文本应该是成对的……不然偷个懒加on Error Resume Next
作者: slore     时间: 2007-5-13 09:27
一般脚本就直接用记事本,复杂点需要调试就扔VB里检测
汉字的ASC码是负的……而且根据ASC码的范围可以确定它的声母

实在不确定我觉得可以用排除法如果instr(0~9,a~z,A~Z。。再把标点算上)
就知道它是不是了。
作者: ebfok     时间: 2007-5-13 09:33
之所以用两次readline是按LZ的要求:把所有以汉字开头的一行和它下面的一行写入另外一个文本。如果能进入DO..LOOP循环,第一次readline是肯定能读到,问题是第二次就不一定了,一开始我也是想要加个on Error Resume Next,后来不知怎么就忘了,现在想来要是加了on Error Resume Next就不会报错就不会想到要加那个条件句,看样子还是不加on Error Resume Next的好!
作者: slore     时间: 2007-5-13 09:38
当然先是不加。。。。找到错误知道错误原因后发现就是最后一次读取不存在导致的。。在VB里都是GOTO ERRLINE看下ERR.DESCRIPTION调试好了,再考虑是用哪个比较好。
作者: ebfok     时间: 2007-5-13 09:47
我学脚本都是小打小闹,大部分时候用的notepad,出了错没想到借助工具进行调试,所以每次出了错都是百思不得其解,效率很低,这次见识到兄的调试经验,很有启发,以后我会学着在vb中调试的!I like this forum!
作者: slore     时间: 2007-5-13 10:13
要是调试VB的话下个精简版就好了6MB大小……

VB和脚本还是有些差别,比如读取文本在工程里VB要用绝对路径。。。。不然找不到文件。。。

VB里主要可以F8单步执行,就可以一句句看。。。代码的流程和变量的赋值都一清二楚。
作者: bhsx     时间: 2007-5-13 17:32
findstr /r /n "." 1.txt >1.tmp
for /f "delims=:" %%i in ('findstr /r /i /v "[0-9]*:[a-z,0-9]" 1.tmp') do call:LLL %%i

for /f "tokens=1,2 delims=:" %%i in (2.tmp) do echo %%j >>2.txt
del 1.tmp
del 2.tmp
2.txt
goto:eof
:LLL
set /a jk=%1+1
findstr /r "^%1: ^%jk%:" 1.tmp >>2.tmp
set jk=

[ Last edited by bhsx on 2007-5-13 at 06:00 PM ]
作者: abczxc     时间: 2007-5-13 18:50
对于vbs的编辑器
感性来说我喜欢notepad,理性来说我喜欢emditor……
作者: abczxc     时间: 2007-5-13 19:05
谢谢楼上的同志啊
If Abs(Asc(whichChar))>127 Then
   Response.write whichChar & "是一个汉字"
Else
   Response.write whichChar & "不是一个汉字"
作者: lililulula     时间: 2007-5-14 10:43
sed我下了3.59和4.07好象都不能用 我的操作系统是xp sp2
作者: lxmxn     时间: 2007-5-14 12:17


  Quote:
Originally posted by abczxc at 2007-5-13 19:05:
谢谢楼上的同志啊
If Abs(Asc(whichChar))>127 Then
   Response.write whichChar & "是一个汉字"
Else
   Response.write whichChar & "不是一个汉字"

要注意了,字符的ASCII大于127的不一定就是汉字。
作者: lxmxn     时间: 2007-5-14 12:18


  Quote:
Originally posted by lililulula at 2007-5-14 10:43:
sed我下了3.59和4.07好象都不能用 我的操作系统是xp sp2

不能用?报什么错误?

sed --help
sed --version
看看提示信息是什么?
作者: flyinspace     时间: 2007-5-14 12:39
@echo off & setlocal enabledelayedexpansion
set "flag=false"
for /f "tokens=* " %%i in (1.txt) do (
        if "!flag!"=="true" (
                echo %%i>>2.txt
                set "flag=false"
                )
        set "x=%%i"
        set "x=!x:~0,1!"
        if !x! GTR Z (
                echo %%i>>2.txt
                set "flag=true"
                )
        )
针对楼主的那几个句子是没有问题的了。

要不然。。若第一行是空格?或其他的怎么办? 批处理会出问题 的。
作者: flyinspace     时间: 2007-5-14 12:44    标题: 若为了安全:)则

判断字符大于 z后,

继续判断,因为双字节的标点也算在英文字符内的。

所以可以通过以前lxmxn 教给我们的一个方法:)

读取第一个数字后,首先用批处理判断是不是空格。。

若不为空格,则通过:
         echo %x%>3.txt 然后读取 3.txt 的文件大小是一个字节还是两个字节来判断是不是汉字。
         呵呵,如此,批处理的也可以完成了。
作者: lililulula     时间: 2007-5-14 15:59
回lxmn斑竹:
    我点sed.exe,窗口直接跳走,更本进不去.你提供的sed也一样~~
作者: zouzhxi     时间: 2007-6-15 11:44


  Quote:
回lxmn斑竹:
    我点sed.exe,窗口直接跳走,更本进不去.你提供的sed也一样~~

sed.exe 是直接双击可以用的吗..我今天才知道有这一方法...
作者: lxmxn     时间: 2007-6-15 12:00


  Quote:
Originally posted by lililulula at 2007-5-14 15:59:
回lxmn斑竹:
    我点sed.exe,窗口直接跳走,更本进不去.你提供的sed也一样~~

sed 是个命令行工具,要在命令行或者批处理里面运行的。
作者: HAT     时间: 2007-6-15 12:34
哈哈 又学到一招 ^_^

  Quote:
所以可以通过以前lxmxn 教给我们的一个方法:)
读取第一个数字后,首先用批处理判断是不是空格。。
若不为空格,则通过:
echo %x%>3.txt 然后读取 3.txt 的文件大小是一个字节还是两个字节来判断是不是汉字。


作者: wjhere     时间: 2007-9-14 22:46
谢谢各位同志啊
作者: qinchun     时间: 2007-11-25 18:13
谢谢楼上的同志,很需要!!!
作者: lhdzwkk     时间: 2008-4-8 15:29
哈哈 新的号,来支持下
作者: zw4123     时间: 2008-4-16 11:11
这个好用啊
作者: plp626     时间: 2008-4-16 11:56
既然是纯英文行,纯中文行
有那么复杂吗?要findstr CHIS呢?
------------------------------------------
中英混合行的认定中文多的为中文行,少的为英文行,(汉字用字符个数,英文用单词数判定)
大家弄下...................注意效率,那可是长篇小说,十几万行呢

[ Last edited by plp626 on 2008-4-16 at 11:57 AM ]
作者: coolsky     时间: 2008-9-27 02:52
Thanks for your sharing!!
BR
作者: uchina     时间: 2009-4-21 02:06
谢谢楼上的同志们
作者: jointops     时间: 2009-5-15 11:21
下载sed试试
作者: easy2003     时间: 2009-8-16 21:42
请按任意键继续...
作者: arkcao     时间: 2010-1-26 08:19
谢谢分享~
作者: arkcao     时间: 2010-1-26 08:53
使用sed删除尾部空格 输出的格式为非dos格式 咋办?
作者: hys1984     时间: 2010-2-8 02:44
感谢17楼版主提供sed.exe
作者: songzan     时间: 2010-5-1 20:31
好多下载链接失效了。