-3

列を含むテキスト ファイルがあります。列「C」のデータを抽出したい

   A           B               C
  2013      colombo         sri lanka    
  2012      Tokyo           Japan

以下は、データを検索するために使用したコードです。

f = open('log.txt','r')
data = f.read()
import re

#print data

def find(pat,text):
        match = re.search(pat,text)
        if match: print match.group()
        else: print 'not found!'

x = re.findall(r'\w+:',data)
print x
4

4 に答える 4

1

あなたのフォーマットは本当に指定不足です.1つの列が終わり、別の列が始まるという適切なルールを得るのは難しいです. 位置合わせされていない行がある場合、データが列にどのように対応するかを明確に判断することは不可能な場合があります。

したがって、いくつかのヒューリスティックが必要になります。有望なアプローチは、少なくとも 3 つの空白文字で区切られた列を考慮することです。

>>> print data
   A           B               C
  2013      colombo         sri lanka
  2012      Tokyo           Japan

>>> re.compile('\s{3,}').split(line.strip()) for line in data.splitlines()]
[['A', 'B', 'C'],
 ['2013', 'colombo', 'sri lanka'],
 ['2012', 'Tokyo', 'Japan']]

正規表現\s{3,}は「少なくとも 3 つの空白文字」を意味します。

于 2013-03-27T07:50:29.393 に答える
1

あなたの問題は特定されていませんが、私はそれを推測しようとすることができます. 列 C の「スリランカ」を考えると、スペースだけで分割することはできません。正確に貼り付けた場合は、タブを使用していません。

そのため、各列は行の特定の位置から始まります。列 A は [3:12]、列 B は [12:28]、列 C は [28:] です。その場合:

[line[29:] for line in data.splitlines()[1:]]

もう 1 つの可能性は、スペースだけでなく、2 つ以上の spaceの任意の実行で分割することです。その場合:

[filter(None, line.split('  '))[2] for line in data.splitlines()[1:]]

結局のところ、これらの推測はどちらも正しくありません。なぜなら、実際のファイル フォーマットは… 提示されたものとはまったく異なり、標準の IIS ログ フォーマットの 1 つだからです。あなたはまだどれを言っていませんが、それが W3C/NCSA/Common 形式の 1 つであると仮定すると、これは Web サーバーのログを解析することとまったく同じです。

apachelogやなど、まさにこれを行うために作成された複数の Python モジュールがありますpylogsparserが、最善の方法は、おそらく自分で検索して、そこにあるものを確認することです。

于 2013-03-27T07:35:17.167 に答える
0
with open('file.txt') as filehandler:
    for line in filehandler:
        print line.split(maxsplit=2)[2]

.split("\t")フィールドがタブで区切られている場合に使用

Kosの回答に加えて、正規表現で分割できます。最大 1 つのスペースで区切られた単語で分割してみることができます。

with open('file.txt') as filehandler:
    for line in filehandler:
        groups = re.compile(r'((?:\w+\s?)+)').split(line)
        print groups[1], groups[3], groups[5]
于 2013-03-27T07:32:10.920 に答える
0

列 B が複数の単語になることはないと仮定すると、次のようになります。

# This reads each line, removes the trailing newline, then splits on whitespace
data = [line.strip().split() for line in open('log.txt')]

# The columns
A = []
B = []
C = []
for line in data:
    A.append(line[0])
    B.append(line[1])
    # ' '.join(list) will return a string of the list separated by whitespace
    C.append(' '.join(line[2:]))

print C

C列 C のみを含める必要があります

于 2013-03-27T07:35:51.553 に答える