2017-02-11 1 views
2

整形式のCSVファイルがありますが、ヘッダー行がある場合とない場合があります。引用されたデータがある場合とない場合があります。私は、シェルを使用して、その中の列の数を決定したいと思います。私は引用されたカンマがファイルに存在しないことを確認することができた場合シェルからCSVのフィールド数を確認するにはどうすればよいですか?

さて、次は動作しているようです:

x=$(tail -1 00-45-19-tester-trace.csv | grep -o , | wc -l); echo $((x + 1)) 

しかし、私はその仮定をすることはできませんか?つまり、カンマが常にフィールドセパレータであると仮定できない場合はどうなりますか?どうすればいいですか?

引用符付きの引用符がないことを前提とすることができます(引用符付きの文字列の間に\")。しかし、それをどちらかにするのは良くない。

答えて

7

データについて楽観的な仮定をすることができない場合、Bashには単純な解決策はありません。可能な埋め込み改行と埋め込みセパレータで一般的なCSV形式を解析することは自明ではありません。 bashで書くのではなく、既存の適切なCSV解析を使用する方がよいでしょう。例えば、Pythonには標準ライブラリが組み込まれています。

あなたはそれがawkを使用してカンマで分割するのは簡単ですよりも、何も埋め込まれた改行と埋め込まれていないセパレータがないと仮定することができた場合:

awk -F, '{ print NF; exit }' input.csv 

-F,は、フィールドセパレータとしてカンマを使用するためにはawkを伝え、自動NF variableは、現在の行のフィールド数です。

あなたが埋め込まれたセパレータを許可したいが、あなたは以前と同じのawkに配管する前に、あなたは、単純なフィルタで埋め込まれたセパレータを排除することができます何も埋め込まれた二重引用符を負いませんできた場合:

head -n 1 input.csv | sed -e 's/"[^"]*"//g' | awk ... 

注意これらの両方の例では、最初の行を使用してフィールドの数を決定しています。入力はヘッダ行がある場合、これは非常にうまく動作する必要があり、ヘッダは、埋め込み改行を最初の行の

+0

Awkはこの仕事のためにはるかにエレガントなツールです.... –

1

カウントフィールドを含むべきではないとして、次に、確認すべての行が

CNT=$(head -n1 hhdata.csv | awk -F ',' '{print NF}') 

cat hhdata.csv | awk -F ',' '{print NF}' | grep -v $CNT 

同じ番号を持って対応していません埋め込みコンマを使用していますが、存在する場合はハイライト表示されます

+0

"first field"、 "second field、name with with、commas、in、it"第3のフィールド "と呼ぶ。 – einpoklum

関連する問題