1

拡張子名を持つ可能性のあるファイルを検索する必要があります。これらすべてのファイルが持っている特別な属性は、長さが 5 行未満 (4 \n\r 未満) であり、改行以外のすべての文字が数字、スペース、およびコンマであるということです。コンテンツに基づいてファイルを検索するコードをどのように記述すればよいでしょうか?

これには長い時間がかかることは承知しています。

私のプロジェクトは Java や Python を必要としません。Powershell は価値のある提案です。

Windows 7 システムを実行しています。

4

4 に答える 4

1

grep -rおよびオプションを使用でき-lます。を使用-rすると、ディレクトリ内ですべてのファイルを再帰的に検索し-l、コンテンツが正規表現に一致するファイルの名前のみを出力できます。

grep -r -l '\A([0-9, ]+\s){1,4}[0-9, ]+\Z' directory

これにより、5行未満の数字、スペース、またはコンマ文字を含むすべてのファイルの名前のリストが出力されます。

\Aと\Zは、件名のテキストの最初と最後をチェックします。[0-9, ]+数字、スペース、またはコンマのシーケンスを検索し、その後に\s改行、スペース、またはキャリッジリターンのいずれかが続きます。このシーケンスは、最大4回繰り返すことができ、{1,4}その後に別のデータ行が続きます。

于 2012-10-24T04:39:46.127 に答える
1

次のようなものが機能するはずです。

valid_chars = set('0123456789, \r\n')
for root, dirs, files in os.walk(base):
    for fname in files:
        fpath = os.path.join(root, fname)
        with open(fpath, 'rb') as f:
            lines = []
            for i, line in enumerate(f):
                if i >= 5 or not all(c in valid_chars for c in line):
                    break
            else:
                print 'found file: ' + fpath

の代わりにnot all(c in valid_chars for c in line)、正規表現を使用できます。

            ...
                if i >= 5 or not re.match(r'[\d, \r\n]*$', line):
            ...

正規表現を使用する場合は、効率を向上させるためre.compileにループの外で使用します。

于 2012-10-23T22:12:11.327 に答える
1
import os

expected_chars = set(' ,1234567890\n\r')
nlines = 5
max_file_size = 1000  # ignore file longer than 1000bytes, this will speed things up


def process_dir(out, dirname, fnames):
    for fname in fnames:
    fpath = os.path.join(dirname, fname)

    if os.path.isfile(fpath):

        statinfo = os.stat(fpath)

        if statinfo.st_size < max_file_size: 
            with open(fpath) as f:
                # read the first n lines
                firstn = [ f.readline() for _ in range(nlines)]

                # if there are any more lines left this is not our file
                if f.readline():
                    continue

                # if the first n lines contain only spaces, commas, digits and new lines
                # this is our kind of file add it to the results.
                if not set(''.join(firstn)) - expected_chars:
                    out.append(fpath)


out = []
path.walk("/some/path/", process_dir, out)
于 2012-10-23T22:26:06.317 に答える
0

Python の場合 (自分でプログラムできるように手順の概要だけを説明します。もちろん、問題が発生した場合はお気軽にお問い合わせください):

  • すべてのファイルを検索するために使用os.path.walkします (拡張子に関係なく、すべてのファイルが表示されます)。
  • ディレクトリなども提供することに注意してくださいos.path.isfile。それらをスキップするために使用します。
  • 各ファイルについて:
    • 開きます ( open)。with手動でファイルを閉じる必要がないように、ステートメント内で次の操作を行います。
    • 最初に行を数えてからカンマをチェックすることもできますが、おそらく遅くなります。
    • ファイルを 1 行ずつ読み取ります。各行について、次の 2 つのことを行います。
    • 行を数えます。5 に到達した場合は、次のファイルに進みます。
    • コンマ基準に一致するかどうかを確認します。そのために aregular expressionを使用します。一致しない場合は続行します。
    • ファイルの最後にいる場合は、成功したので、ファイル名ややりたいことを印刷できます。
于 2012-10-23T22:13:45.070 に答える