2017-02-16 6 views
2

数字が入っているテキストレコードがあります。私は5桁の数字だけを抽出し、残りはすべて残したいと思う。いくつかは複数の5桁の数字を持っていて、私は2番目の数字だけを取る。 いくつかのレコードには数字がありません。それは< 5桁です。だから私はitems [0]やitems [1]を使うと、 'list index of range'を返します。私は '5桁の数字ではない'のような音符を返すループを作る必要があることを理解していますが、どこでどのように。レコードは他の属性と関連付けられているため、レコードを除外することはできません。また、私は数値(&メモがない場合はnumまたは< 5桁)を列に入れて属性と一致させます。私は非常にPythonに新しいと助けを必要としています。テキストから特定の桁数をソートし、数字がない場合はノートを返します。

zipfile=csv.reader(csvfile,delimiter=' ', quotechar='|') 
    reader=[] 
    for row in zipfile: 
     value=re.findall(r'(\d{5})', str(row)) 
     reader.append(value) 

zipcode=[] 
for items in reader: 
    if len(items)> 1: 
     zipcode.append(items[1]) 
    else: 
     zipcode.append(items[0]) 

with open('C:\sample_Output.csv', 'wb') as myfile: 
    wr = csv.writer(myfile) 
    for val in zipcode: 
       wr.writerow([val]) 

サンプル入力:

as 34567 
ds 34 fd 
12234 12323 asds 
sdfjd 57645 fdsn 23412 

所望の出力:

34567 
12323 
23412 
+0

今後、これらの詳細を提供するために質問を[編集]してください。ご覧のように、これらのコメントはこれらのことを伝えるうえではあまり効果的ではなく、コメントが削除されてもそれ自体は問題にならないはずです。また、転記を見直して、廃止されたコメントを削除することを検討してください。 – tripleee

+0

@tripleee今はるかに良い。しかし、行に単一の5桁の数字しか含まれていないとどうなるかはまだ分かりません。 – MYGz

+0

@khanすべてのケースを指定してください。 – MYGz

答えて

0

入力ファイル:fin

as 34567 ds 34 fd 12234 12323 asds 
as ds 34 fd 12234 12323 asds 
as 34567 ds 34 fd 12234 12323 asds 
as 345673 ds 34 fd 12234 12323 asds 
as 34567 ds 34 fd 12234 12323 asds 
as 5343 ds 34 fd 12234 12323 asds 
a 

asd lkj 234 
lklkkl lklk 

コード:限り、私はこれを書くことができた

with open('fin', 'r') as f, open('fout', 'w') as f2: 
    lines = f.read().split('\n') 
    lines = [a.split() for a in lines] 
    reqlines = [a[1] if a[1].isdigit and len(a[1])==5 else '' for a in lines if len(a) >=2 ] 
    for l in reqlines: 
     f2.write(l+'\n') 

出力ファイル:fout

34567 

34567 

34567 
0

正規表現は簡潔ですが、少しを始めるために挑戦。ここに「少なくとも5桁の数字が1つあれば最後の試合をとる」というメッセージが表示されます。

for row in zipfile: 
    value=re.search(r'(?:.*\D)?(\d{5})(?:\D.*)?$', str(row)) 
    if value: 
     reader.append(value.group(1)) 

我々は唯一の一致または不一致を気にするのであなたはsearchfindallからの変化に気付くでしょう、と.*は試合前にできるだけ多くをスキップする(事実、その後、文字列の末尾に検索私たちが一致を見つけるまでバックトラックする)と数字の周りの装飾は、5桁より長い数字から部分文字列を選ぶのを避ける。最後に、一致がない場合は何も追加しないという条件です。

+0

入力ファイル内で一回のループで一致するものが見つかると、出力ファイルに書き込むだけですが、この回答ではそのリファクタリングに対処していません。 – tripleee

関連する問題