csvファイルを読み込んでいるのですが、
csvの文字コードがUTF-8,LFであれば、
問題ないのですが、
csvの文字コードがShift-JISのCRLFですと、
FIELD5を読んだ時改行コードを取得してしまい、
[ "$FIELD5" != "" ] が、trueになってしまいます。
こういった場合の対処方法を教えて下さい。
for STR in `cat $BUF`
do
FIELD1=`echo -n $STR | cut -f 1 -d','`
FIELD2=`echo -n $STR | cut -f 2 -d','`
FIELD3=`echo -n $STR | cut -f 3 -d','`
〜処理略〜
done
` cat $BUF ` の部分を ` cat $BUF | tr -d '\r' ` とでもすればよいです。
なおシェルスクリプト自体を SHIFT_JIS のlocaleで動かしているのでないなら、文字コードも変換した方が安全です・・・というより、さもなくば特定の文字が来たときに確実にコケます。たとえば UTF-8 のlocaleで動かすなら同様に以下のような感じで。
` iconv -f SHIFT_JIS -t UTF-8 -- $BUF | tr -d '\r' `
最終的に SHIFT_JIS で結果が欲しいなら出力時に逆向きに変換しなおします。
localeについては http://q.hatena.ne.jp/1363594648#a1194456 あたりもご参照ください。
(おおっと誤植修正:-)
こんな感じで、どうでしょう?
for STR in `cat $BUF`
を、
for STR in `cat $BUF | tr -d \\r`
$BUF が指すファイルに、空白やタブが入ってたらどうするんだろう、という気がしなくもないんですが。
んで、処理の内容が分からないで書きますが、日本語の文字コードは別にして、こんな感じの方が良いんじゃないかと思います。
# 一行の処理を、サブルーチンにする my_proc () { # 一行のデータを、カンマで分離する IFS="," FIELD1=$1 FIELD2=$2 FIELD3=$3 ... } # read で、一行ずつ処理する cat $BUF | tr -d \\r | while read line do my_proc $line done
# bash で良いんですよね?
ループで回すときに IFS="," としちゃうと、行末にカンマが付いてない気がするので。
IFS="," でも、改行で項目は分離されるんですね(やってみた)。
awk で言うところの FS と RS の機能を兼ね備えたものかと思ってたけど、違うのか。
お返事遅くなり申し訳ございません!ありがとうございました!!!
出遅れたか ><。
2013/06/25 02:37:12お返事遅くなり申し訳ございません!ありがとうございました!!!
2013/07/21 18:27:40