2016-06-15 41 views
0

を取得する反復処理特定データ

0 @[email protected] INDI 
1 NAME Milo /Vettle/ 
2 GIVN Milo 
2 SURN Vettle 
2 _MARNM Vettle 
1 SEX M 
1 BIRT 
2 DATE 23 OCT 1930 
1 FAMS @[email protected] 
0 @[email protected] INDI 
1 NAME Rosy /Huleknberg/ 
2 GIVN Rosy 
2 SURN Huleknberg 
2 _MARNM Vettle 
1 SEX F 
1 BIRT 
2 DATE 15 SEP 1928 
1 DEAT Y 
2 DATE 10 MAR 2010 

上記のデータに第一の数は、次のレベルの数では、タグと次のタグです引数。このデータをリストに保存しました。今、私は 'BIRT'タグを検索したいと思います。プログラムがヒットしたら、次の行、誕生日です。あなたが近くに気付いた場合は、 'DEAT'タグでもう1つの日付がありますが、 'BIRT'タグだけが続く日付が必要です。

このタスクはどのように達成できますか? 私は、サンプルコードとの質問を編集するための

for line in list: 
    if 'BIRT' in line: 
     if 'DATE' in line: 

      print line 
+0

[編集]あなたが@のcricket_007として –

+0

を試みたものを含むようにあなたの質問が指摘した、どのような形でこれを持っているか、あなたが試したものを含めるようにあなたの質問を編集してくださいしてくださいデータ?リスト?ファイル? –

+0

他の編集が必要ですか? – siddpro

答えて

0

感謝を試してみました。ここでは、行に 'BIRT'が出現したときにトリガーを設定し、設定されている場合にのみ 'DATE'を含む行を出力するソリューションがあります。

#! /usr/bin/env python 
from __future__ import print_function 

d = """ 
0 @[email protected] INDI 
1 NAME Milo /Vettle/ 
2 GIVN Milo 
2 SURN Vettle 
2 _MARNM Vettle 
1 SEX M 
1 BIRT 
2 DATE 23 OCT 1930 
1 FAMS @[email protected] 
0 @[email protected] INDI 
1 NAME Rosy /Huleknberg/ 
2 GIVN Rosy 
2 SURN Huleknberg 
2 _MARNM Vettle 
1 SEX F 
1 BIRT 
2 DATE 15 SEP 1928 
1 DEAT Y 
2 DATE 10 MAR 2010 
""" 

trigger_found = False 
token_trigger = 'BIRT' 
token_grep = 'DATE' 

for line in d.split('\n'): 
    if token_trigger in line: 
     trigger_found = True 
     continue 
    if trigger_found and token_grep in line: 
     print(line) 
     trigger_found = False 

テスト:あなたはまた、唯一の直接「BIRT」行を次のようそれに「DATE」を持つ行を望む場合は、注意してください、あなたはコードを少し;-)

コードを変更する必要がありますPython v2.7.11で実行:

2 DATE 23 OCT 1930 
2 DATE 15 SEP 1928 

python v3と同じです。

注:のようなトークンでトリガーする場合(入力に与えられたolnyサンプル)、サンプルに指定されているテキストがテキストフィール

2 GIVN BIRTE 

有効な指定された名前である「コード」を含む「入力済み」。このサンプルのケースでは出力は変わりませんが、意図せずに「トリガー」が設定されます。上記のスニペットで

このライン:

更新(コメントで質問に答える)

for line in d.split('\n'): 

は改行で分割することによりd内のTextBlock stoerdのうちリストを作成します。

あなたはすでに、リストfooの行のリストを持っているため、ファイルからの読み取りまたはそれ以外の、あなたが代わりに書くことができると言う場合:

for line in foo: 

を使用すると、多くの場合、改行chacterを持つファイルから読み込む場合"行"に含まれていますので、しばしばs_line = line.strip()がfor ...ループヘッダーの後に短く表示され、 "その行から必要なもの"を囲む空白スペースを取り除くことができます。 HTH

更新:OPからのグッドキャッチ。答えにタイプミスがありました、それが書かれていた:

代わりに正しいの
if token_trigger and token_grep in line: 

if trigger_found and token_grep in line: 

その方法を、希望誕生日の成功印刷後Falseにトリガーをリセットするには役に立ちませんでした。

+0

このタイプは何ですか?d = "" "........." ""同じものをリストと一緒に使うことはできますか? – siddpro

+0

ああ、もちろん、申し訳ありません。 Pythonでは、 '\ n'文字エスケープを排除するトリックを使わずに複数行のテキストを送ることができる三重引用符付き文字列があります。私はしばしば完全なショーケースを持つためにトリックとしてそれを使用します。私は答えを更新します。フィードバックをお寄せいただきありがとうございます。 – Dilettant

+0

私は、リストを読んでタスクを完了できる解決策が必要です。あなたの解決策は、死に関連する読書日でもあります(私はそれを望みません)。私はこの言語にはまだまだ慣れていて、それでもこのような問題に直面していることを学んでいる – siddpro

0

以下は、私が一発で思いついたものですそのきれいでエレガントではないが、あなたはあなた自身のソリューション上に構築するための基準として使用することができ

def test(): 

    text = ''' 0 @[email protected] INDI 
       1 NAME Milo /Vettle/ 
       2 GIVN Milo 
       2 SURN Vettle 
       2 _MARNM Vettle 
       1 SEX M 
       1 BIRT 
       2 DATE 23 OCT 1930 
       1 FAMS @[email protected] 
       0 @[email protected] INDI 
       1 NAME Rosy /Huleknberg/ 
       2 GIVN Rosy 
       2 SURN Huleknberg 
       2 _MARNM Vettle 
       1 SEX F 
       1 BIRT 
       2 DATE 15 SEP 1928 
       1 DEAT Y 
       2 DATE 10 MAR 2010''' 
    lines = text.split('\n') 

    tokens = [l.split(' ') for l in lines] 

    tags = [token[1] for token in tokens] 
    indices = [i for i, x in enumerate(tags) if x == 'BIRT'] 

    for i in indices: 
     if tags[i+1] == 'DATE': 
      print(lines[i+1]) 

出力:

 2 DATE 23 OCT 1930 
     2 DATE 15 SEP 1928 

PS:tokens = [l.split(' ') for l in lines]はスペースが区切りであることを前提としています。現実にはそのない場合は、あなたがそれを

更新変更することができた場合:ファイルからデータを読んでいることを考えると

をあなたは

lines = text.spilt('\n') 

file = open('path_to_file') 
lines = file.readlines() 

に置き換えることができますソリューション内で同じコードを続けます。

+0

このタイプは何ですか?text = '' '......' '' – siddpro

+0

これはあなたが提供したサンプルデータです。それをファイルから読み取ることができます。 –

+0

私は今出力がありません!私はこの言葉に新しいことがあり、そのような問題に直面しています – siddpro

0

使用grep

$ grep -A1 '1 BIRT' so.txt | grep -E '^2' 
2 DATE 23 OCT 1930 
2 DATE 15 SEP 1928