编程语言
首页 > 编程语言> > text-processing – 编写用于编辑.txt数据的程序 – Python还是Unix?

text-processing – 编写用于编辑.txt数据的程序 – Python还是Unix?

作者:互联网

我只有很少的编程经验,而且我正在努力提高自己的技能.
基本上,我需要编写一个程序,它可以对.txt文件中的某些数据执行某些特定的处理.

从头开始,我有一个.txt文件,其数据如下所示:

>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrstuv
>tex_4 abcdefghijklmnopqrst
//     x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrst
>tex_4 abcdefghijklmnopqrstuv
//         x  x
>tex_1 abcdefghijklmnopqrstuv
>tex_2 abcdefghijklmnopqrstuv
//     x   x

我需要对这些数据做一些奇怪的事情,以便最终得到一个数据集,可以在我使用的软件中进行分析.每个“//…\”-line指的是上面的数据组,直到下一个”//…\”-line

这是我想要做的一个阵容:

移动“//…\”-line,因此它引用的数据组低于此行,而不是高于它:

//         x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrstuv
>tex_4 abcdefghijklmnopqrst
//         x  x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrst
>tex_4 abcdefghijklmnopqrstuv
//              x   x
>tex_1 abcdefghijklmnopqrstuv
>tex_2 abcdefghijklmnopqrstuv

在//之后为每个组添加唯一名称,而不会在该行上移动剩余文本:

//Name 1  x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrstuv
>tex_4 abcdefghijklmnopqrst
//Name 2   x  x
>tex_1 abcdefghijklmnopqrstu
>tex_2 abcdefghijklmnopqrstuv
>tex_3 abcdefghijklmnopqrst
>tex_4 abcdefghijklmnopqrstuv
//Name 3        x   x
>tex_1 abcdefghijklmnopqrstuv
>tex_2 abcdefghijklmnopqrstuv

将其输出到新文件,而不更改原始文件.
然后抓住下面的每个名称行,并将其输出到File2:

//Name 1  x
>tex_1 abcdefghijklmnopqrstu
//Name 2   x  x
>tex_1 abcdefghijklmnopqrstu
//Name 3        x   x
>tex_1 abcdefghijklmnopqrstuv

更改结构,因此命名如下所示,并将其输出到File3:

>Name 1 abcdefghijklmnopqrstu
>Name 2 abcdefghijklmnopqrstu
>Name 3 abcdefghijklmnopqrstuv

以上数据是一个结构,我可以实际分析.

现在我知道这是guite的任务,我不是在问你“我该怎么编程.我只想知道,你们在哪里开始这样一个项目,你觉得哪种语言最适合这个项目?

我通过在这个网站上获得帮助,设法在unix中做了一些事情.例如.通过以下unix代码为每个“// …”行提供唯一的名称:

awk -F '' '/\/\//{n++ ; t=" Name "n ; sub("// {0,"length(t)-1"}","//"t)}{print}' File1.txt

你能给我一些提示从哪里开始吗?
问题是否适合作为Python项目?
原始.txt数据文件包含大量数据,因此无法手动进行处理.此项目也是进一步深入编程的一种方式.

解决方法:

这看起来更像是一个python工作.一般的经验法则是:如果您的任务只需要“平面”和内容盲处理,那么核心实用程序(最好是gnu)就是最佳选择.这可以用于字符串替换,删除,基于行的处理,简单的排序,计数,过滤等等……这些工具可以让你快速编写一个单行程来做你想做的事情,通过练习它甚至都没有需要很多思考.

另一方面,如果您需要一个需要查看文件的复杂作业,意味着分层(树状)结构,自定义分隔符和上下文感知字符串,那么在您的文件中使用相同的结构会更容易编程语言.一个极端的例子是html / xml / json文件,任何带有嵌套大括号的文件等等…如果你有非常强大的数据结构可用(python确实如此),只需将其写入,以类似对象的方式处理它并读取它退出.您仍然可以在awk中执行此操作(或者在sed中稍微省力),但这不值得.

在您的情况下,您需要记住前一个标记的位置(或保持一个长缓冲区),这对于线处理软件来说有点笨拙.然而,在python中,它很容易.

示例代码:

#!/usr/bin/python
import sys

with open(sys.argv[1],'r') as file, open(sys.argv[2],'w') as file1, open(sys.argv[3],'w') as file2, open(sys.argv[4],'w') as file3:
    counter = 1
    current_buffer = []
    for line in file:
        if line.startswith('//'):
            #we found a delimiter, flush the buffer
            #could use regular expressions, but for the sake of this example
            #this is enough
            prefix = '//Name {}'.format(counter)
            new_header = prefix+line[len(prefix):]
            file1.write(new_header)
            file2.write(new_header)
            for oldline in current_buffer:
                file1.write(oldline)
            if current_buffer: #only first line to file 2
                first_line = current_buffer[0]
                file2.write(first_line)
                #same here, could use regular expressions from "import re" but we don't have to
                rest_of_line = first_line.split(' ',1)[1]
                file3.write('//Name {} {}\n'.format(counter,rest_of_line.strip()))
            current_buffer=[]
            counter+=1
        else:
            current_buffer.append(line)

    #if the file is well-formatted, current_buffer should be empty now - otherwise, do special handling

将其命名为./test.py inputfile file1 file2 file3,看看是否是您想要的.

标签:python,text-processing
来源: https://codeday.me/bug/20190816/1663574.html