无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 5340|回复: 61
打印 上一主题 下一主题

[求助] 命令如何查找有中文字符的行

  [复制链接]
1#
发表于 2022-5-19 11:41:28 来自手机 | 显示全部楼层
本帖最后由 nttwqz 于 2022-5-19 22:45 编辑

python 3.10.4,简单试了一下,可用。

20220519
更新下,增加chardet检测文件编码,简单测试下,常见的ANSI、UTF-8、Unicode识别正常,其它编码未知。

  1. # -*- coding: utf-8 -*-
  2. # Python 3.10.4
  3. # chardet是第三方库,需要在cmd中输入pip install chardet手动安装

  4. import os, re
  5. from chardet.universaldetector import UniversalDetector
  6. from tkinter import filedialog

  7. with filedialog.askopenfile(filetypes=[('文本文件', ['*.txt', '*.log']), ('所有文件', '*.*')]) as f:
  8.     txtfile = f.name
  9.     fname, fext = os.path.splitext(f.name)

  10. # 使用 chardet 库判断文件编码
  11. with open(txtfile, 'rb') as f:
  12.     u = UniversalDetector()
  13.     for i in f:
  14.         u.feed(i)
  15.         if u.done:      # 当识别出编码后,done的值为True,否则为False
  16.             u.close()
  17.             current_encoding = u.result['encoding']
  18.             break
  19.     if not u.done:
  20.         current_encoding = input('无法识别文件编码,请手动输入:')

  21. with open(txtfile, mode='r', encoding=current_encoding) as f:
  22.     print('查找文件 {} 中所有含中文的行\n'.format(os.path.abspath(f.name)))
  23.     sclines = ''
  24.     for line in f:
  25.         if re.search(r'[\u4e00-\u9fff]', line):
  26.             sclines += line

  27. # 生成含中文行的新文件,文件编码与源文件保持不变
  28. if sclines != '':
  29.     with open('{}_含中文的行{}'.format(fname, fext), mode='w', encoding=current_encoding) as f:
  30.         f.write(sclines)
  31.         print('含中文的行已写入到新文件:\n{}\n\n'.format(os.path.abspath(f.name)))
  32. else:
  33.     print('该文件不含中文!\n')

  34. os.system('pause')
复制代码
回复

使用道具 举报

2#
发表于 2022-5-19 20:26:55 | 显示全部楼层
szwp 发表于 2022-5-19 12:13
findstr /r /c:"[^- '!-Z]" text.txt

还有高手!

请教下^- '!-Z的含义?我只是个卖唱的,只知道0-9a-z的含义。。。

点评

难道不是ascii码,-到'和!到Z吗  详情 回复 发表于 2022-5-20 10:21
就一楼给的测试数据,用 findstr /r /c:"[^ a-z0-9]" text.txt 就可以了,这样是不是更容易理解些?  详情 回复 发表于 2022-5-20 09:09
当时正好要午睡了zzz,只是随便百度的的,正则费脑的,多想容易睡不着。  详情 回复 发表于 2022-5-20 08:08
回复

使用道具 举报

3#
发表于 2022-5-20 10:39:59 来自手机 | 显示全部楼层
bjay2008xmy 发表于 2022-5-20 10:21
难道不是ascii码,-到'和!到Z吗

'前面为什么有空格?

点评

样本里有不少空格啊。如果是8.3格式就不需要了。  详情 回复 发表于 2022-5-20 11:51
起某种识别作用的吧,就像批处理你要echo &,要用echo ^&  详情 回复 发表于 2022-5-20 11:40
回复

使用道具 举报

4#
发表于 2022-5-21 18:19:35 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2022-5-21 10:08
还是要搞个 非中文的 字符集,做排除用。 比如英文的字符集

我曾经就有个奇葩的想法,把GBK中的所有中文相关字符都弄到一个记事本中用来匹配。。。
回复

使用道具 举报

5#
发表于 2022-5-22 09:55:52 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2022-5-21 22:05
这也是个思路

尽量少在for中使用call,遍历内容较少时没什么,多的时候很影响效率,你用for /l直接echo和call方式echo一试便知。

点评

用call 主要用到 exit /b 如果 直接用 for ,就得用 goto  详情 回复 发表于 2022-5-22 10:04
回复

使用道具 举报

6#
发表于 2022-5-22 11:50:53 | 显示全部楼层
dos时代菜鸟 发表于 2022-5-22 10:04
用call 主要用到 exit /b
如果 直接用 for ,就得用 goto

那就用goto跳出for循环。
你觉得用了call貌似觉得提高了效率,很可能效率反而更低。实际使用中,谁也不可能每次都测试不同写法的执行效率,所以还是少用为好。而且,你这也没到了需要权衡利弊到底用不用call的时候,完全可以不用。

1000时,不用call用时60毫秒,用call用时2120毫秒,是不用call的35倍。
  1. 10:59:54.53
  2. 10:59:54.59
  3. 10:59:56.71
  4. 请按任意键继续. . .
复制代码

  1. @echo off

  2. echo;%time%
  3. for /l %%a in (1 1 1000) do (
  4.     echo;%%a
  5. )>nul
  6. echo;%time%
  7. for /l %%a in (1 1 1000) do (
  8.     call :echoecho %%a
  9. )>nul
  10. echo;%time%
  11. pause

  12. exit

  13. :echoecho
  14.     echo;%~1
  15. goto :eof
复制代码





点评

确实如此,因为 call 本身就是一个耗时的指令,他相当于 变相调用 了一次 cmd 。 我用 call 并不是因为效率,只是 书写上的习惯,习惯 模块化 函数化 了。容易 模块化的 修改和 理解。 当然,对于这样单一目的  详情 回复 发表于 2022-5-22 21:47
回复

使用道具 举报

7#
发表于 2022-5-22 13:22:03 | 显示全部楼层
还是我以前想的方法简单

pushd %~dp0
findstr /i /g:GBK汉字.txt a.txt

GBK汉字.txt从网上搜集并整理,2万+汉字,删除了部分变成英文?并且英文?能匹配的“汉字”,有精力和条件的或者需要结果特别严禁精确的可以进一步整理,不过个人感觉,一般用途足够了,毕竟常用汉字才几千个。


GBK汉字.txt下载
GBK汉字_findstr匹配适用_GBK.7z (10.48 KB, 下载次数: 1)

点评

只考虑常用汉字的话,gb2312够了。 主要看实际样本范围有多大。  详情 回复 发表于 2022-5-22 15:28
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-3 22:34

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表