19

セル内にキャリッジリターンがあるCSVファイルを受け取ることがあります。これは、入力として使用するプログラムには受け入れられない形式です。

入力行が分割されているかどうかを検出するために、不良行には予想される数のコンマが含まれていないと判断しました。行のコンマを数えることができるbashまたは他の一般的なUNIXコマンドラインツールはありますか?必要に応じて、PythonまたはPerlプログラムを作成して実行できますが、可能であれば、既存のbashスクリプトに1〜2行追加して、コンマカウントが間違っている場合に失敗するようにします。何か案は?

4

7 に答える 7

57

カンマ以外のすべてを取り除き、残った文字数を数えます:

$ echo foo,bar,baz | tr -cd , | wc -c
2
于 2012-05-30T13:40:23.103 に答える
11

コンマが出現する回数をカウントするには、awk のようなものを使用できます。

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

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

于 2012-05-30T13:41:40.933 に答える
5

純粋なBashの場合:

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

また

while read -r line
do
    count=${line//[^,]}
    echo "${#count}"
done < inputfile
于 2012-05-30T14:08:13.877 に答える
3

Perl を試す:

$ perl -ne 'print 0+@{[/,/g]},"\n"'
a
0
a,a
1
a,a,a,a,a
4
于 2012-05-30T13:46:38.700 に答える
0

CSV データで何をしようとしているのかによっては、csvquote のようなラッパー スクリプトを使用して、引用符で囲まれたフィールド内の問題のある改行 (およびコンマ) を一時的に置き換えてから復元すると役立つ場合があります。例えば:

csvquote inputfile.csv | wc -l

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

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

于 2013-05-04T22:10:16.420 に答える
-2

すべてのキャリッジ リターンを削除するだけです。

tr -d "\r" old_file > new_file
于 2012-05-30T13:46:09.427 に答える