V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TUTU2014
V2EX  ›  程序员

文档处理问题

  •  
  •   TUTU2014 · 2023-06-02 12:45:41 +08:00 · 836 次点击
    这是一个创建于 518 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景介绍:

    1 ,文档为中文文档有几千行;
    2 ,每行的字符类型组合为「中文」「标点符号」「制表键( TAB 键)」;
    3 ,每行的格式为:「 XXX 制表键 XXXXXXX 」 其中:XXX 均为中文字符,但制表键前的中文字符可长可短(有可能两个也可能多个),注意:方括号「」不是格式的一部分;

    需求:

    1 ,要将每行中,制表键前面为两个的中文字符的行筛选出来,最好能将筛选后的结果,独立成为文档保存。
    2 ,用正则表达式表达,或通过 EXCEL 表达;
    3 ,我是程序小白,或者还有什么其他既能够满足需求又方便操作的手段,也可以赐教。


    例如:

    百毒不侵 1 ,任何毒物皆无法侵害。2 ,比喻修养功夫极佳,任何坏事皆无法影响。
    百凡 泛指一切。
    百废待兴 许多被废置的事业都等着兴办。
    宝璐 美玉。
    宝训 皇帝的言论诏谕、引申为宝贵的格言。
    宝用 珍重使用。
    百废俱兴 许多原已荒废松弛的事情都已重新兴办。比喻任事振作有为。

    效果:

    百凡 泛指一切。
    宝璐 美玉。
    宝训 皇帝的言论诏谕、引申为宝贵的格言。
    宝用 珍重使用。

    感谢!
    4 条回复    2023-06-02 13:59:34 +08:00
    Pernalin
        1
    Pernalin  
       2023-06-02 13:33:22 +08:00 via Android
    ^[\u4e00-\u9fa5]{3,}\t{1}.*\n
    匹配开头中文大于三个的,全部替换成空就好了
    最后一行得手动处理
    Vegetable
        2
    Vegetable  
       2023-06-02 13:51:53 +08:00
    如果不追求自动化的话。

    复制到 excel 里,制表符会自动分行,筛选条件自定义为??,就去掉了所有非两个字符的列。
    在稍微排序一下,这样中文都会集中在一起,手动去掉非中文的就行了。
    必要时可以添加辅助列,再基于第二个字符重新排列=RIGHT(A1,1)排序,去掉第二个字符不是汉字的行。缺点也是有的,顺序会变,不过也自然有办法回避,反正就几千行,Excel 几步就做完了。
    Vegetable
        3
    Vegetable  
       2023-06-02 13:52:16 +08:00
    哦第一步是去掉行
    lts9165
        4
    lts9165  
       2023-06-02 13:59:34 +08:00
    如果你正在使用 Excel ,你可以使用这样的步骤来完成你的需求:

    先将你的文档内容导入到 Excel 。假设内容在第一列( A 列)。

    在第二列( B 列)你可以使用“寻找和替换”或者“长度”函数判断一行中制表符前的中文字符是否为两个。

    "寻找和替换"可以通过替换掉制表符后的内容,然后看剩下的长度。具体操作是在 B 列第一个单元格(例如 B1 )输入这样的公式:=LEN(SUBSTITUTE(A1, MID(A1, FIND(CHAR(9), A1), 999), ""))。这个公式先找到制表符的位置,然后取出制表符后的所有内容,接着把这部分内容从原文中替换掉,最后计算剩下的长度。如果长度为 2 ,说明制表符前的中文字符是两个。

    "长度"函数就直接计算制表符前的内容的长度。具体操作是在 B 列第一个单元格(例如 B1 )输入这样的公式:=LEN(LEFT(A1, FIND(CHAR(9), A1)-1))。这个公式先找到制表符的位置,然后取出制表符前的所有内容,最后计算这部分内容的长度。如果长度为 2 ,说明制表符前的中文字符是两个。

    把刚刚输入的公式复制到整个 B 列。

    过滤 B 列等于 2 的行,然后复制过滤后的 A 列的内容到新的 Excel 或者文档。

    如果你在使用 Python 或其他编程语言,可以写一个简单的程序处理。例如在 Python 中,你可以使用下面的代码:

    with open('原文件.txt', 'r', encoding='utf-8') as f_in, open('新文件.txt', 'w', encoding='utf-8') as f_out:
    for line in f_in:
    if len(line.split('\t')[0]) == 2:
    f_out.write(line)
    这段代码会读取'原文件.txt',然后把每一行中制表符前的中文字符是两个的行写入到'新文件.txt'。

    以上两种方式应该都可以满足你的需求。如果还有问题,欢迎继续提问!
    By chatgpt
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2748 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:33 · PVG 22:33 · LAX 07:33 · JFK 10:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.