人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: FujiiRock
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ghost
●50ポイント

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


a-kuma3さんのコメント
出遅れたか ><。

FujiiRockさんのコメント
お返事遅くなり申し訳ございません!ありがとうございました!!!

2 ● a-kuma3
●50ポイント

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

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


ghostさんのコメント
その手でやるなら IFS は my_proc の呼び出し行の解析時に設定されてないとダメな気がしますよー。そしてどうせなら while IFS=, read FIELD1 FIELD2 FIELD3; do ...; done < <( iconv -f SHIFT_JIS -t UTF-8 -- $BUF | tr -d '\r' ); とでもしたほうが副作用が無くてすっきりな気がします。 (何をボケたのか同じ誤植をしたのでついでに書き直しました;_;)

a-kuma3さんのコメント
ループで回すときに IFS="," としちゃうと、行末にカンマが付いてない気がするので。 while を read line で回すのは、ぼくの癖かも(テスト的な意味合い)。

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

FujiiRockさんのコメント
お返事遅くなり申し訳ございません!ありがとうございました!!!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ