正確な区切り記号の数を含む行だけを維持してください。

正確な区切り記号の数を含む行だけを維持してください。

カンマ区切りの10個のフィールドを持つ巨大なcsvファイルがあります。残念ながら、一部の行の形式が正しくないため、正確に10個のカンマが含まれていません(これにより、ファイルをRに読み込もうとするといくつかの問題が発生します)。正確に10個のカンマを含む行をフィルタリングする方法は?

答え1

別のPOSIX:

awk -F , 'NF == 11' <file

行にカンマが10個ある場合、行には11個のフィールドがあります。だから私たちは単にフィールドセパレータとしてawk使用します。,フィールド数が11個で条件がNF == 11trueの場合、awk基本操作が実行されますprint $0

答え2

使用egrep(またはgrep -EPOSIXで):

egrep "^([^,]*,){10}[^,]*$" file.csv

これは、10個のカンマを含まないすべての項目をフィルタリングします。 「すべての数の文字(「、」を除く、後に単一の「、」」が続く)シーケンスの10回の繰り返しを含む行全体(^開始と$終了)と{10}一致します。 ()(([^,]*,))の後に[^,]*「、」()を除くすべての文字が続きます。

-xこのパラメータを使用してアンカーポイントを削除することもできます。

grep -xE "([^,]*,){10}[^,]*" file.csv

これは以下より効率的ではありません。クエンラム私のシステムでは、約10個のカンマを含む行の場合、awk後者は通常6倍高速です。ラインが長くなると速度が大幅に低下します。

答え3

最も簡単なgrepコードが動作します。

grep -xE '([^,]*,){10}[^,]*'

説明する:

-xパターンが一致する必要があることを確認してください。みんな行の一部ではありません。 10行以上のカンマを含む行を一致させないことが重要です。

-E正規表現でバックスラッシュエスケープを減らす「拡張正規表現」を表します。

括弧はグループ化に使用され、その後は{10}括弧内のパターンが1行に正確に10の一致を持つ必要があることを意味します。

[^,]たとえば、a、a、an、またはanの単一文字に一致し、[c-f]大文字以外のすべての単一文字に一致する文字クラスです。したがって、カンマを除くすべての単一文字と一致します。cdef[^A-Z][^,]

*文字クラスの後に続くのは、「このうちゼロ以上」を意味します。

したがって、正規表現部分は、([^,]*,)「カンマが続くゼロを含む複数回発生するコンマ以外の文字」を意味し、{10}これらの10文字が指定されます。次に、[^,]*カンマ以外の残りの文字を行末まで一致させます。

答え4

いくつかの短い内容を入力してくださいpython

#!/usr/bin/env python2
with open('file.csv') as f:
    print '\n'.join(line for line in f if line.count(',') == 10)

その後、各行を読み取り、行のコンマ数が10であることを確認してからline.count(',') == 10、その場合は行を印刷します。

関連情報