2012-05-30 6 views
11

セル内にキャリッジリターンを持つCSVファイルを受け取ることがあります。これは、これを入力として使用するプログラムにとって許容される形式ではありません。bashの行のコンマを数える

入力行が分割されているかどうかを検出するために、悪い行に期待されるカンマ数がないと判断しました。私が行のコンマを数えることを可能にするbashやその他の一般的なunixコマンドラインツールはありますか?必要ならば、私はPythonやPerlプログラムを書くことができますが、可能であれば、既存のbashスクリプトに1行か2行を追加して、カンマ数が間違っていると失敗するようにしたいと考えています。何か案は?

+1

キャリッジリターンを検索して削除できないのはなぜですか? –

+1

私はaskerが一般的に改行を意味し、有効な行も改行文字で終わるので、 "削除するだけ"は機能しません。 – lanzz

+8

'a、b、" c、d、e "'は3つのフィールドで4つのカンマを持っています – Stefan

答えて

29

ストリップコンマ以外のすべて、およびその後の文字数を数えるが、左:

$ echo foo,bar,baz | tr -cd , | wc -c 
2 
5

は、あなたがawkのようなものを使用することができ、カンマが表示された回数をカウントするには:

string=(line of input from CSV file) 
echo "$string" | awk -F "," '{print NF-1}' 

をしかし、これは実際にフィールドにキャリッジリターンがあるかどうかを判断するのには十分ではありません。フィールドは、引用符で囲まれている限り、カンマを内部に持つことができます。

-2

だけで改行をすべて削除:Perlを試してみてください

tr -d "\r" old_file > new_file 
+1

なぜdownvoteですか? –

+0

downvoteキャリッジリターンはファイル内のレコードを区切る場合に有効であるため、単に削除することはできません。 –

2

を:純粋なbashで

$ perl -ne 'print [email protected]{[/,/g]},"\n"' 
a 
0 
a,a 
1 
a,a,a,a,a 
4 
+1

改行を追加することで、より簡単にスカラに変換することができます: 'print @ {[/、/ g]}。 "\ n" ' –

+1

perlの使用は興味深い選択です。私がperlを使うつもりなら、私は一緒に行くと思う: 'perl -F、-anE 'は$#F''と言う。しかしこれは斬新な解決策です。だから+1! –

+0

@WilliamPursell +2 Perlウィザードのための;-) – ceving

4

while IFS=, read -ra array 
do 
    echo "$((${#array[@]} - 1))" 
done < inputfile 

または

while read -r line 
do 
    count=${line//[^,]} 
    echo "${#count}" 
done < inputfile 
0

CSVデータを使って何をしようとしているかに応じて、csvquoteのようなラッパースクリプトを使用して、問題のある改行(およびカンマ)を引用符で囲まれたフィールドの中に一時的に置き換えて復元すると便利です。例えば:

csvquote inputfile.csv | wc -l 

csvquote inputfile.csv | cut -d, -f1 | csvquote -u 

は、あなたが探しているものの一種かもしれません。コードと詳細については、[https://github.com/dbro/csvquote][1]を参照してください。

関連する問題