.txt データ編集用のプログラムを書く - Python または Unix?

.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

私が使用しているソフトウェアで分析できるデータセットを取得するには、このデータでいくつかの奇妙なことを行う必要があります。各「//...」行は、次の「//...」行までの上記のデータグループを表します。

私がしたいことのリストは次のとおりです。

参照するデータグループが上ではなく下になるように、「//...」行を移動します。

//         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

上記のデータは構造なので、実際に分析できます。

今私はこれが難しい作業であることを知っています。 「どのようにプログラミングしますか?」と尋ねるのではありません。このようなプロジェクトをどこから始めますか?このプロジェクトにどの言語が最も適していると思いますか?

私はこのサイトの助けを借りてUNIXでいくつかのことをすることができました。たとえば、次の Unix コードを使用して各 "//..." 行に一意の名前を付けます。

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

どこから始めるのか、いくつかのヒントを教えてください。
この質問はPythonプロジェクトに適していますか?
生の.txtデータファイルには大量のデータが含まれているため、手動で処理することはできません。また、このプロジェクトはプログラミングをより深く探求する方法です。

ベストアンサー1

私にとって、これはPythonの仕事のようです。一般的な経験則:タスクに「フラット」とコンテンツブラインド処理のみが必要な場合は、コアユーティリティ(好ましくはgnu)が最善の選択です。これは、文字列の置換、削除、行ベースの処理、単純な並べ替え、計算、フィルタリングなどに機能します。これらのツールを使用すると、目的のタスクを非常に迅速に実行するコード行を作成でき、練習を通じてこれらのタスクを実行することはできません。でも多くの考えが必要です。

一方、階層(ツリーなど)構造、カスタム区切り文字、およびコンテキスト認識文字列を暗示するファイルビューを必要とする複雑な操作がある場合は、ファイル言語で同じ構造を使用してプログラムする方が簡単です。極端な例は、html / xml / jsonファイル、中かっこが入れ子になっているすべてのファイルなどです。利用可能な非常に強力なデータ構造がある場合(Pythonでは可能)、読み取り後にObject is handler andexitのような場所に作成するだけです。 。それでも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それがあなたが望むものであることを確認してください。

おすすめ記事