RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1596232
Accepted
Irking
Irking
Asked:2024-10-10 13:40:00 +0000 UTC2024-10-10 13:40:00 +0000 UTC 2024-10-10 13:40:00 +0000 UTC

从txt文件创建表

  • 772

有一个txt文件,包含零件图和装配图列表,通过shift+RMB -> 复制为路径获得。其大致结构(1200+行):

1 812.04.20.1062 - Кронштейн нижний (1370).pdf
812.04.29.0001А - подкладка под ключ.pdf
04.01 812.04.06.0100 СБ - Щит АВ (Ц 293).pdf
04.01 812.04.06.0100Б СБ - Щит 200-93 (Ц 293).pdf
04.01 812.04.06.0100Б - Щит АВ.pdf
04.01 812.04.06.0101Б - Щит Сенсорный.pdf
04.01.01 812.04.18.0101 (изм. 1) - Щит АВ (П Л 1100 244 Вент).pdf
04.01.01 812.24.01.0101 - Щит Сенсорный (500).pdf
04.01.02 812.04.06.0102 - Крепление Линзы Сенсора.pdf

我想制作一个包含字段的表:

  • 序列号:以812开头,例如812.04.20.1062
  • 名称:示例“底括号”
  • 视图:某些图纸中的序列号后面有一个标签SB,这意味着该图纸是装配图,因此视图字段可以值为“SB”或“零件”
  • 更改:在某些图纸中,有一个标记“更改 1” - 这意味着对图纸进行了更改,这也必须在单独的字段中考虑
  • 提示:并非所有图纸都有它;它在末尾的括号中表示,例如“(P L 1100 244 Vent)”

标题中有一定的模式,但总的来说我做到了。这是我的实现:

with open('/content/drive/My Drive/ColabNotebooks/resources/details.txt', 'r') as file:
    content = file.read().split('\n')
    content = [(line[line.find('812'):]) for line in content]

    for line in content:
        serial_number = line[:line.find(' ')]

        if line.find('СБ') == -1:
            type_doc = 'Деталь'
        else:
            type_doc = 'СБ'

        name = line[line.find('-') + 2:]

        hint = name.find('(')
        if hint == -1:
            hint = 0
        else:
            hint = name[hint:]
            name = name[:name.find('(')]


        change = line.find('изм.')
        if change == -1:
            change = 0
        else:
            change = line[change:change + 6].rstrip(')')


        print(f'{serial_number:15}|{name:20}|{type_doc:6}|{change:6}|{hint}')

结论:

812.04.81.1713 |Деталь|     0|Отбойник            |(456)
812.04.02.1720 |СБ    |     0|Вставка в отбойник  |0

5-7秒处理了1200行,但我认为这是由于连接到googledrive(我在googlecolab中编写代码,因为没有办法在工作PC上安装环境)。我使用“全部替换”删除了 .pdf 扩展名和文件本身中的一些其他内容。

在我看来,这是某种怪物,我做了所谓的迎面而来的事情。有没有更简洁的方法?理想情况下使用 Pandas,这样我就可以将其全部写入 CSV。(我也想学习如何与 Pandas 一起工作)

python
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    Алексей Р
    2024-10-10T14:27:37Z2024-10-10T14:27:37Z

    您可以一次将整个源文件读入框架中,然后使用正则表达式对其进行解析。

    df = pd.read_table(r'c:\test\data.txt', header=None)
    df['Серийный номер'] = df[0].str.extract(r'(812\S+)')  # выбираем серийники, наиная с 812 и до первого пробельного символа
    df['Наименование'] = df[0].str.extract(r'-\s*(.+)\.pdf')[0].str.replace('\([^()]+?\)', '', regex=True)  # выбираем наименование как любые симовлы от - до .pdf и удаляем все скобочные группы
    df['Вид'] = df[0].str.extract(r'812\S+\s*(СБ)')  # выбираем сочетание СБ после серийника
    df['Изменение'] = df[0].str.extract(r'812\S+\s*\((изм\..+?)\)')  # выбиранем содержимое скобочной группы, если в ней есть изм.
    df['Подсказка'] = df[0].str.extract(r'\(([^)]+)\)\.pdf')  # выбираем содержимое скобочной группы перед .pdf
    
    df = df.fillna('-')  # заменяем отсутствующие данные прочерками (дефисами). Если str.extract (выше) на находит нужных данных, то ставит NaN
    print(df)
    
                                                                       0   Серийный номер             Наименование Вид Изменение          Подсказка
    0                     1 812.04.20.1062 - Кронштейн нижний (1370).pdf   812.04.20.1062        Кронштейн нижний    -         -               1370
    1                           812.04.29.0001А - подкладка под ключ.pdf  812.04.29.0001А       подкладка под ключ   -         -                  -
    2                       04.01 812.04.06.0100 СБ - Щит АВ (Ц 293).pdf   812.04.06.0100                  Щит АВ   СБ         -              Ц 293
    3                  04.01 812.04.06.0100Б СБ - Щит 200-93 (Ц 293).pdf  812.04.06.0100Б              Щит 200-93   СБ         -              Ц 293
    4                                 04.01 812.04.06.0100Б - Щит АВ.pdf  812.04.06.0100Б                   Щит АВ   -         -                  -
    5                          04.01 812.04.06.0101Б - Щит Сенсорный.pdf  812.04.06.0101Б            Щит Сенсорный   -         -                  -
    6  04.01.01 812.04.18.0101 (изм. 1) - Щит АВ (П Л 1100 244 Вент).pdf   812.04.18.0101                  Щит АВ    -    изм. 1  П Л 1100 244 Вент
    7                  04.01.01 812.24.01.0101 - Щит Сенсорный (500).pdf   812.24.01.0101           Щит Сенсорный    -         -                500
    8              04.01.02 812.04.06.0102 - Крепление Линзы Сенсора.pdf   812.04.06.0102  Крепление Линзы Сенсора   -         -                  -
    
    • 3

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5