Tkinter GUI将固定宽度文件转换为分隔Fi

2024-09-27 09:35:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我们的数据部门编写一个转换代码,将固定宽度的文件转换为delmited文件。通常我们使用将文件导入Excel,使用文本导入向导设置字段长度,然后保存为csv。然而,我们已经遇到了一个限制,我们已经开始获取数百万条记录的文件,因此无法导入到Excel中。这些文件在字段之间并不总是有空格,尤其是在诸如电话号码或邮政编码之类的值字段之间。页眉也经常被完全填满,没有空格。在

我们正在处理的典型固定宽度文件示例:

SequenSack and PaFull Name****************************]JOB TITLE****************]HOSP NAME******************************]Delivery Address***********************]Alternate 1 Address********************]Calculated Text**********************************]POSTNET Bar
000001T1  P1     Sample A Sample                                                                                         123 Any Street                                                                  Anytown 12345-6789                                12345678900
000002T1  P1     Sample A Sample                       Director of Medicine                                              123 Any Street                          Po Box 1234                             Anytown 12345-6789                                12345678900

程序需要将文件分成以下分隔字段:

顺序
Sack和Pa
全名
职务
医院名称
送货地址
备用地址1
计算文本
POSTNET栏

每个文件作为每个字段的宽度略有不同,具体取决于作业的其余部分。我要找的是一个面向GUI的分隔符,很像固定宽度文件的Excel导入向导。我用Python编写这个工具,它是一个更大的工具的一部分,它可以执行许多其他文件操作,例如将文件拆分为多个文件、反转文件、从分隔符转换为固定宽度以及检查位数检查。我将使用Tkinter作为其余的工具,如果解决方案也使用它,这将是理想的。在

有什么帮助吗


Tags: 文件工具sample文本street宽度address地址
2条回答

编辑:我现在看到您正在寻找gui。我将把这个不正确的答案留给后人。在

import csv

def fixedwidth2csv(fw_name, csv_name, field_info, headings=None):
    with open(fw_name, 'r') as fw_in:
        with open(csv_name, 'rb') as csv_out: # 'rb' => 'r' for python 3
            wtr = csv.writer(csv_out)
            if headings:
                wtr.writerow(headings)
            for line in fw_in:
                wtr.writerow(line[pos:pos+width].strip() for pos, width in field_info)

如果我正确地理解了这个问题(很有可能我没有……),最简单的解决方案可能是使用文本小部件。在

使第一行是一系列与行长度相同的空格。使用两个交替标记(例如:“偶数”和“奇数”)为每个字符指定一种可选颜色,以便使它们彼此脱颖而出。第二行是标题,剩下的行是几行示例数据。在

然后,在第一行设置绑定,以便在用户单击字符时将空格转换为“x”。如果他们点击一个“x”,把它转换回一个空格。然后,他们可以点击每个列开始的字符。当用户完成后,您可以得到文本小部件的第一行,并且每一列都有一个“x”。然后你只需要一个小函数,把它转换成你需要的任何格式。在

它看起来大概是这样的(虽然很明显颜色会和这个网站上显示的不同)

      x          x                                     x  ...
SequenSack and PaFull Name****************************]JOB...
000001T1  P1     Sample A Sample                          ...

这里有一个快速的黑客来说明一般的想法。这有点草率,但我认为它说明了技术。运行它时,单击第一行中的区域以设置或清除标记。这将使每个标记的标题以替代颜色高亮显示。在

^{pr2}$

相关问题 更多 >

    热门问题