質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Ruby

    7381questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

rubyでcsvデータに出力したものが文字化けする

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 157

wistan3380

score 1

打ち消し線### 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
下記のコードでcsvでデータを取得した際にお店の名前と住所が文字化けしてしまいます。
初心者で質問の仕方がわかっておらず大変恐縮ですが教えていただけるととても助かります。

 発生している問題・エラーメッセージ

エラーメッセージ


require 'open-uri'
require 'nokogiri'
require 'csv'

 ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin16]

 Nokogiri (1.8.2)

def set_html(url)

取得するhtml用charset

charset = nil
html = open(url) do |page|

charsetを自動で読み込み、取得

charset = page.charset

中身を読む

page.read
end

 Nokogiri で切り分け

return Nokogiri::HTML.parse(html,nil,charset)
end

def save_csv(shop_inf_list)
test = CSV.open('./test.csv','a')
test.puts shop_inf_list
test.close
end

def find_shop_inf(shop_name,url)
contents = set_html(url)

 ここら辺で必要な情報をhtmlから取り出す

address = contents.xpath('//p[@class="rstinfo-table__address"]').inner_text

 p address

phone = contents.xpath('//*[@id="column-side"]/div[1]/div/div/div/div/div[1]/div[1]/p').inner_text.gsub(/(\n| )/,"")

 p phone

shop_inf_list = [shop_name,url,address,phone]
save_csv(shop_inf_list)
end

##########################################################################################

 同時にたくさんのベージをやりすぎない、dos攻撃になるかも

 東京、ランキング表示で検索したurl

urls = ['https://tabelog.com/tokyo/rstLst/1/?Srt=D&SrtT=rt&sort_mode=1','https://tabelog.com/tokyo/rstLst/2/?Srt=D&SrtT=rt&sort_mode=1']

urls.each do |url|
contents = set_html(url)
count = 0
contents.xpath('//a[@class="list-rst__rst-name-target cpy-rst-name js-ranking-num"]').each do |node|
p node.inner_text
p node.attribute('href').value
find_shop_inf(node.inner_text,node.attribute('href').value)
end
end

 該当のソースコード

ソースコード

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • raccy

    2018/04/18 06:55

    書き込んだCSVファイルの中身が文字化けと言うことですか?CSVファイルは何で開きました?

    キャンセル

  • wistan3380

    2018/04/18 09:31

    拙い質問にもかかわらず返信いただきありがとうございます。エクセルで開くと文字化けし、サブライムテキストで開くと文字化けせずに開けます。業務で使うためエクセルで表示したいです。

    キャンセル

回答 2

checkベストアンサー

+1

def save_csv(shop_inf_list)
  test = CSV.open('./test.csv','a')
  test.puts shop_inf_list
  test.close
end

def save_csv(shop_inf_list)
  csvname = './test.csv'
  File.write(csvname, "\uFEFF", encoding: 'utf-8') unless File.exist? csvname
  CSV.open(csvname, 'a:utf-8'){|csv| csv << shop_inf_list}
end

に変えて、今までのtest.csvは破棄orBOM付きUTF-8に変更でいけるかな

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/21 22:13

    回答ありがとうございます!!!
    どのサイトで質問したかわからなくなり、ご返信が大変遅くなり申し訳ございません。
    文字化けしていたので、ずっと手打ちで作成していたのですが本日こちらコピペしただけでできるようになりました!
    本当にありがとうございます。
    助かりました。

    キャンセル

0

テキストとして開くと文字化けしないけれど、Excelで開くと文字化けするということから、文字コードの問題のようです。
Excel(Windowsと想定)は、文字コードを認識せずにShift_JISで開きますので、Rubyが出力したcsvファイルの文字コードがShift_JIS以外であれば、Excelでは文字化けしてしまいます。

業務で使うため、Excelでの表示が必要ということで、方法は2つあります。

  1. Excel側で文字コードを指定して読み込んであげる。
    Excelを開き、データ -> 外部データの取り込み -> テキストファイル -> csvファイルを指定 -> 本ファイルの文字コード指定 -> 区切り文字を「カンマ」に指定 -> 完了

  2. Rubyで文字コードを指定して出力してあげる。
    標準ライブラリの「kconv」を利用して、文字コードを変換してあげる。(「require 'kconv'」を追記)
    shop_inf_listに代入する配列のvalueに「.tosjis」をつけてあげる。

試してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/18 14:37

    > shop_inf_listに代入する配列のvalueに「.tosjis」をつけてあげる。
    kconvなんて古いのを勧めるのはどうなの?
    それに、ファイルに書き込んだ時点でexternal_encodingになるし意味ない
    やるならCSV.open('./test.csv','a', encoding: 'cp932')

    キャンセル

  • 2018/04/20 17:20

    返答が遅くなってすみません。
    そうなんですね、勉強になります。

    キャンセル

  • 2018/08/21 22:13

    コメントありがとうございます!
    助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7381questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。