3

私はテクニカルノートの日記ファイルをつけています。各エントリには、次のようにタイムスタンプが付けられます。

# Monday 02012-05-07 at 01:45:20 PM

This is a sample note

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

# Wednesday 02012-06-06 at 03:44:11 PM

Here is another one.

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia 
deserunt mollit anim id est laborum.

タイムスタンプ ヘッダーに基づいて、これらのメモを個々のファイルに分割したいと考えています。例This is a sample note.txt: Here is another really long title.txt。ある時点でファイル名を切り詰める必要があると確信していますが、ダイアリーエントリの最初の行に基づいてファイル名をシードすることが考えられます。

ファイルの作成日を Python で変更できるようには見えないので、エントリのタイムスタンプをメモの本文の一部として保存したいと思います。

自分に合ったタイムスタンプをキャプチャするための RegEx パターンがあります。

#(\s)(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)(\s)(.*)

その正規表現を使用してファイルをループし、各エントリを分割する可能性がありますが、日記ファイルをループして個々のファイルに分割する方法がよくわかりません。実際の正規表現パターンまたは特定の行を取得する例はたくさんありますが、ここでさらにいくつかのことを行いたいので、それらを組み合わせるのに苦労しています。

目的のファイル コンテンツの例を次に示します (日付スタンプ + 次の日付スタンプが一致するまでのすべてのテキスト)。

bash$ cat This\ is\ a\ sample\ note.txt
Monday 02012-05-07 at 01:45:20 PM

This is a sample note

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

bash$
4

3 に答える 3

5

一般的な ;-) アプローチは次のとおりです。

f = open("diaryfile", "r")
body = []
for line in f:
    if your_regexp.match(line):
        if body:
            write_one(body)
        body = []
    body.append(line)
if body:
    write_one(body)
f.close()

つまり、すべての行をリスト ( body) に追加し続けるだけです。魔法の行を見つけたら、write_one()今まで持っていたものを捨てるために呼び出し、リストをクリアします。ファイルの最後のチャンクは特殊なケースです。魔法の正規表現を再び見つけることはないからです。したがって、ループ後に持っているものを再びダンプします。

関数内で好きな変換を行うことができますwrite_one()。たとえば、入力タイムスタンプ行から先頭の「 # 」を削除したいようです。それは問題ありません-ただ、例えば、

body[0] = body[0][2:]

write_one。たとえば、次のようにして、すべての行を一気に書き出すことができます。

with open(file_name_extracted_from_body_goes_here, "w") as f:
    f.writelines(body)

最初にファイルが存在しないことを確認することをお勧めします。私の日記で言えば、多くのエントリの最初の行は「Rotten day」です。;-)

于 2013-09-17T22:02:54.497 に答える
1

質問に「バッチファイル」タグを設定したので、バッチファイルの.batソリューションを作成しました。ここにあります:

@echo off
setlocal EnableDelayedExpansion

set daysOfWeek=/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday/Sunday/

for /F "delims=" %%a in (input.txt) do (
   if not defined timeStamp (
      set timeStamp=%%a
   ) else if not defined fileName (
      set fileName=%%a
      (
      echo !timeStamp!
      echo/
      echo !fileName!
      echo/
      ) > "!fileName!.txt"
   ) else (
      for /F "tokens=2" %%b in ("%%a") do if "!daysOfWeek:/%%b/=!" equ "%daysOfWeek%" (
         echo %%a>> "!fileName!.txt"
      ) else (
         set timeStamp=%%a
         set "fileName="
      )
   )
)

例えば:

C:\Users\Antonio\Documents\test
>dir /B
input.txt
test.bat

C:\Users\Antonio\Documents\test
>test

C:\Users\Antonio\Documents\test
>dir /B
Here is another one.txt
input.txt
test.bat
This is a sample note.txt

C:\Users\Antonio\Documents\test
>type "Here is another one.txt"
# Wednesday 02012-06-06 at 03:44:11 PM

Here is another one

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
deserunt mollit anim id est laborum.

C:\Users\Antonio\Documents\test
>type "This is a sample note.txt"
# Monday 02012-05-07 at 01:45:20 PM

This is a sample note

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
于 2013-09-18T01:09:57.273 に答える
1

あなたが思っているほど多くの正規表現は必要ありません。

最初にファイルをロードして、新しい行に基づいてファイルを作成します。

fl = 'file.txt'
with open(fl,'r') as f:
    lines = f.readlines()

今すぐそれをループしてください!各行を指定した正規表現と比較し、一致する場合、それは新しい日付であることを意味します!

その後、次の空でない行を取得し、それをファイルの名前として設定します。

次に、正規表現に別の一致が見つかるまで、その特定のファイル名に行を書き続けます。これで、新しいファイルであることがわかります。論理ループは次のとおりです。

for line in lines:
    m = re.match(your regex)
    if m:
        new_file = True
    else:
        new_file = False
    #now you will know when it's a new entry so you can easily do the rest

分解されたロジックがさらに必要な場合はお知らせください。うまくいけば、これは役に立ちました

于 2013-09-17T22:04:28.170 に答える