1

私が持っているもの

特定の日に誰がいつ働くかのスケジュール情報を含む .txt ファイルの解析に取り組んでいます。.txt ファイルは次のようになります。

START PAGE 0

XYZ Schedule for:  Saturday, March 30, 2013

Barnes, Michael8:00a10:00aTech

Collins, Jessica8:00a4:00pSupervisor

Hamilton, Patricia8:00a10:00aTech

Smith, Jan8:00a10:00aTech

Park, Kimberly8:00a10:00aTech

Edwards, Terrell10:00a12:00pTech

Green, Harrold12:00p2:00pTech

Tait, Jessica12:00p2:00pTech

Tait, Jessica2:00p4:00pTech

Hernandez, William (Monte)4:00p6:30pSupervisor

Tait, Chioma4:00p6:00pTech

Hernandez, William (Monte)6:30p7:00pSupervisor

Hernandez, William (Monte)7:00p9:00pSupervisor

Tailor, Thomas (Jason)9:00p12:00aSupervisor

Jones, Deslynne10:00p12:00aTech

3/28/2013 2:21:17 PM

END PAGE 0

したがって、最初の 2 行と最後の 2 行は関係ありませんが、途中の 1 行おきに 1 人のスケジュールが表示されます。

私が欲しいもの

.csv ファイルに書き込めるように、各行の断片を解析したいと考えています。line.partition(',')[0]姓(各行の最初の部分)を取得するために使用できますが、その後は途方に暮れています。以下を Python に伝える必要があります。

  1. 数字の のあとが,部(名)です
  2. 最初の番号から anaまたは a p (午前または午後) までの部分は、別のセクション (開始時間) です。
  3. その直後aまたはp次の番号からの部分aまたはp別のセクション(終了時間)
  4. 最後に、残りのセクションは別のセクション (シフトの種類/位置) です。

結果の csv ファイルの行は次のようになります。 Barnes,Michael,8:00a,10:00a,Tech

注意事項

1) 1 人が 1 日に複数のシフトを持つことができます。2) 括弧内にニックネームがある人もいれば、ない人もいます。#3) Pythonに数値などのワイルドカードがあれば、残りの部分を使い続け、分割し*続ける方法を次のように見ることができます。partition

for line in input:
    name = str(line.partition(',')[0]+','+str(line.partition(',')[2].split(#)[0]))
    output.write("".join(x for x in name))
    output.write("\r\n")

ただし、Python はそのようなワイルドカードを使用していないようです。また、これは非常に洗練されていないソリューションのようです。

4

2 に答える 2

4

始めるにはこれで十分です。

import re
data = '''Barnes, Michael8:00a10:00aTech
Collins, Jessica8:00a4:00pSupervisor
Hamilton, Patricia8:00a10:00aTech
Smith, Jan8:00a10:00aTech
Park, Kimberly8:00a10:00aTech
Edwards, Terrell10:00a12:00pTech
Green, Harrold12:00p2:00pTech
Tait, Jessica12:00p2:00pTech
Tait, Jessica2:00p4:00pTech
Hernandez, William (Monte)4:00p6:30pSupervisor
Tait, Chioma4:00p6:00pTech
Hernandez, William (Monte)6:30p7:00pSupervisor
Hernandez, William (Monte)7:00p9:00pSupervisor
Tailor, Thomas (Jason)9:00p12:00aSupervisor
Jones, Deslynne10:00p12:00aTech'''

print re.findall(r'(.*?)(\d{1,2}:\d\d[ap])(\d{1,2}:\d\d[ap])(.*)', data)

版画

[('Barnes, Michael', '8:00a', '10:00a', 'Tech'),
 ('Collins, Jessica', '8:00a', '4:00p', 'Supervisor'),
 ('Hamilton, Patricia', '8:00a', '10:00a', 'Tech'),
 ('Smith, Jan', '8:00a', '10:00a', 'Tech'),
 ('Park, Kimberly', '8:00a', '10:00a', 'Tech'),
 ('Edwards, Terrell', '10:00a', '12:00p', 'Tech'),
 ('Green, Harrold', '12:00p', '2:00p', 'Tech'),
 ('Tait, Jessica', '12:00p', '2:00p', 'Tech'),
 ('Tait, Jessica', '2:00p', '4:00p', 'Tech'),
 ('Hernandez, William (Monte)', '4:00p', '6:30p', 'Supervisor'),
 ('Tait, Chioma', '4:00p', '6:00p', 'Tech'),
 ('Hernandez, William (Monte)', '6:30p', '7:00p', 'Supervisor'),
 ('Hernandez, William (Monte)', '7:00p', '9:00p', 'Supervisor'),
 ('Tailor, Thomas (Jason)', '9:00p', '12:00a', 'Supervisor'),
 ('Jones, Deslynne', '10:00p', '12:00a', 'Tech')]

reモジュールのドキュメントを読んで、正規表現を理解してください。名前を別のステップとして解析するか、正規表現を拡張してより具体的にすることができます。csvモジュールを使用してcsvファイルに書き込むことをお勧めします。

行き詰まった場合は、具体的な質問をコードとともに投稿してください。

于 2013-03-29T17:47:49.890 に答える
1

最初の 2 行と最後の 2 行を削除する方法を知っていて、残りが という文字列にあると仮定すると、次のsようになります。

entries = [x.strip() for x in s.split('\n') if x]

for entry in entries:
    ind = [i for i,x in enumerate(entry) if x.isdigit() and not entry[i-1].isdigit()]
    name = entry[0:ind[0]]
    name = name.split(',')

    other = entry[ind[0]:]
    ind = [-1]+[i for i,x in enumerate(other) if x in ('a', 'p') and other[i-1].isdigit()]
    shifts = []
    for i in xrange(1, len(ind)):
        shifts.append(other[ind[i-1]+1:ind[i]+1])
    position = other[ind[-1]+1:]
    print(name, shifts, position)

これは、任意の数のシフトで機能します。

出力:

['Barnes', ' Michael'] ['8:00a', '10:00a'] Tech
['Collins', ' Jessica'] ['8:00a', '4:00p'] Supervisor
['Hamilton', ' Patricia'] ['8:00a', '10:00a'] Tech
['Smith', ' Jan'] ['8:00a', '10:00a'] Tech
['Park', ' Kimberly'] ['8:00a', '10:00a'] Tech
['Edwards', ' Terrell'] ['10:00a', '12:00p'] Tech
['Green', ' Harrold'] ['12:00p', '2:00p'] Tech
['Tait', ' Jessica'] ['12:00p', '2:00p'] Tech
['Tait', ' Jessica'] ['2:00p', '4:00p'] Tech
['Hernandez', ' William (Monte)'] ['4:00p', '6:30p'] Supervisor
['Tait', ' Chioma'] ['4:00p', '6:00p'] Tech
['Hernandez', ' William (Monte)'] ['6:30p', '7:00p'] Supervisor
['Hernandez', ' William (Monte)'] ['7:00p', '9:00p'] Supervisor
['Tailor', ' Thomas (Jason)'] ['9:00p', '12:00a'] Supervisor
['Jones', ' Deslynne'] ['10:00p', '12:00a'] Tech
于 2013-03-29T17:57:52.450 に答える