0

行を含むファイル (サイズが非常に大きい) があり、各行にはコンマで区切られたいくつかのフィールドがあります。

このファイルからいくつかのフィールドを抽出し、それらを新しい行にダンプする必要があります。ただし、ここでの複雑な点は、最後のフィールド (列) 自体にコンマが含まれているが、その特定のフィールドが二重引用符 "some,thing" で識別されていることです (たとえば)。

例を挙げましょう:-

the, quick, brown, fox, jumps, right, over, the little, "lazy,dog"

このファイルには、コンマで区切られたそのような行が多数あります。

その最後の列には多くのコンマがある可能性があります。

今、そこからいくつかの列を抽出する必要があります。最後の列は確かに抽出したいものです。

awk を使おうと思ったのですが、 awk は区切り文字の区切りに制限がないようです。

Python には、no を制限できる split() 関数があります。の分割、および文字列の最後のインデックスに入ります。['the', 'quick', 'brown', 'fox', 'jumps', 'right', 'over', 'the little', 'lazy,dog'].

また、最終出力から二重引用符を削除する必要があります。

大きなファイルの処理ではawkの方が速いように見えるので、awkを使用しようとしていました。しかし、そのようなことを実装することは可能ですか、それとも少し遅いように見えるループと分割のpythonicな方法を使用する必要があります。

注: 1) いいえ。の列が固定されています。

提案してください。

4

4 に答える 4

3

これで Python から離れられるわけではありませんがcsv、特に最後の項目の引用符を削除したい場合はそうです。

test.csv:

ay,bee,cee,dee,"ee,eff"
foo,bar,"baz,quux"

test.py:

#!/usr/bin/env python

import csv

fp = open('test.csv', 'r')
for row in csv.reader(fp):
    print row
fp.close()

出力:

['ay', 'bee', 'cee', 'dee', 'ee,eff']
['foo', 'bar', 'baz,quux']
于 2012-04-18T16:07:36.240 に答える
2

python のcsvモジュールを使用します。

with open('myfile.txt') as data:
    for line in csv.reader(data):
        print line[2], line[5]

見積もりをシームレスに処理します。

于 2012-04-18T16:07:08.937 に答える
0

Pythonは私にとってより良い選択のようです。

csvモジュールはこれに最適です。これを使用してcsvファイルを解析し、各行をデータベースに挿入します。そのオーバーヘッドにより、数十万行をすばやく処理でき、前述のように、引用符を自動的に処理します。

分割方法を使用する場合は、次のようにします。

>>> string = 'the, quick, brown, fox, jumps, right, over, the little, "lazy,dog"'
>>> string = string.replace('"','').split(', ') # note the ', ' not ','
>>> print string
['the', 'quick', 'brown', 'fox', 'jumps', 'right', 'over', 'the little', 'lazy,dog']

最後のフィールドをそのまま保持します。

awkで:

$ cat tmp
the, quick, brown, fox, jumps, right, over, the little, "lazy,dog"
$ cat tmp | awk 'BEGIN { FS = ", " } ; { print $9 }'
"lazy,dog"

フィールドを提供しますが、引用符は削除されないため、sedなどにパイプする必要があります。また、FSは「、」ではなく「、」であることに注意してください。

$ cat tmp | awk 'BEGIN { FS = ", " } ; { print $9 }' | sed 's/"//g'
lazy,dog

その後、もちろん、データに対してやりたいことは何でもしなければなりません。clプログラムの1つが特定のタスクをより速く実行したとしても、すべてをPythonに保持すると、全体的に高速なプロセスになることがわかりました。頭痛が減ります。

于 2012-04-18T16:43:56.077 に答える
0

ええ、そこに csv ファイルのように見えます ;)

ここにsed代替案があります

sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g'

これにより、各トークンが新しい行に表示され、必要なトークンを選択できます

$ echo 'the, quick, brown, fox, jumps, right, over, the little, "lazy,foo , bar, fpp,dog"' | sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g'

the
quick
brown
fox
jumps
right
over
the little
lazy,foo , bar, fpp,dog

最初の行が空であることに注意してください

1 番目、4 番目、および最後のフィールドを取得する

$ echo 'the, quick, brown, fox, jumps, right, over, the little, "lazy,foo , bar, fpp,dog"' | sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g' | sed -n '2p;5p;$p'
the
fox
lazy,foo , bar, fpp,dog

すべてをまとめる(およびbashを使用)

while read -r; do
    sed 's/"\([^"]\+\)"\|\([^,]\+\), \?/\n\1\2/g' <<< "$REPLY" | sed -n '2p;5p;$p'
done < file
于 2012-04-18T16:11:04.063 に答える