shellスクリプトで、以下のような形で

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/07/02 01:40:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:vow No.1

回答回数21ベストアンサー獲得回数9

ポイント50pt

` 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 あたりもご参照ください。
(おおっと誤植修正:-)

id:a-kuma3

出遅れたか ><。

2013/06/25 02:37:12
id:yayayai

お返事遅くなり申し訳ございません!ありがとうございました!!!

2013/07/21 18:27:40
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント50pt

こんな感じで、どうでしょう?

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 で良いんですよね?

他2件のコメントを見る
id:a-kuma3

ループで回すときに IFS="," としちゃうと、行末にカンマが付いてない気がするので。
IFS="," でも、改行で項目は分離されるんですね(やってみた)。
awk で言うところの FS と RS の機能を兼ね備えたものかと思ってたけど、違うのか。

2013/06/25 08:38:03
id:yayayai

お返事遅くなり申し訳ございません!ありがとうございました!!!

2013/07/21 18:26:56

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません