music1996taro
@music1996taro

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Ruby言語 csv

# データを書き換えるクラス
class DataReplacement
attr_writer :inputfile, :outputfile

# データを読み込むための処理
def replace
File.read(@inputfile).split("\n").each do |content|
p content
end
end
end

replacement = DataReplacement.new
# 入力ファイルの指定
replacement.inputfile = ARGV[0]
# 出力ファイルの指定
replacement.outputfile = ARGV[1]
# データ書き換え
replacement.replace

の所のソースコードで、excel(拡張子がcsv)のファイルをコピーして下さいと書いてあるのですが、これに何の意味があるのか教えていただけると幸いです。意味不明な点があればその都度追記します。ちなみに、コマンドプロンプトの実行結果は、

山田 太郎,1,09000000000
山田 花子,2,09011111111
鈴木 次郎,1,09022222222
鈴木 桃子,2,09033333333
田中 三郎,1,09044444444
田中 梅子,2,09055555555
高橋 四郎,1,09066666666
高橋 桜子,2,09077777777
佐藤 五郎,1,09088888888
佐藤 李子,2,09099999999

と今はなっていますが、これは、修正を施したからです。元のデータは、文字化けしていました。拡張子がcsvだからです。ちなみに、確認して下さいと書いてあるのですが、確認しても文字化けしているので、コマンドプロンプトの実行結果と、合っているかどうか確認のしようがないのですが。

0

3Answer

Excelが出力するCSVはCP932(Shift-JIS)になっていますから、ファイルの読み込み時にエンコーディングを指定する必要があります。

# 文字コード変換用ライブラリを読み込む
require 'nkf'

class DataReplacement
  attr_writer :input_file, :output_file
  def replace
    # input_fileが指定されてなかったらエラー
    raise '入力ファイルが指定されていません。' unless @input_file
    # ファイルの先頭部分から文字コードを推測する
    detection = NKF.guess(File.read(@input_file, 2048))
    # Shift_JISだと判定された場合はCSVに使われるCP932に手動で切り替え
    detection = Encoding::CP932 if detection == NKF::SJIS
    # ファイルを開く
    File.open(@input_file, 'r') do |csv_file|
      # ファイルのエンコーディングを指定する
      csv_file.set_encoding(detection, Encoding::UTF_8)
      # 行毎に読み込む
      csv_file.readlines(chomp: true).each do |line|
        # なんらかの処理
        puts line
      end
    end
  end
end

replacement = DataReplacement.new
replacement.input_file, replacement.output_file = ARGV
replacement.replace
1Like

Comments

  1. @music1996taro

    Questioner

    迅速な回答ありがとうございます!
    所で、excel(拡張子がcsv)のファイルをコピーして下さいと書いてあるのですが、これに何の意味があるのか教えていただけると幸いです。については、どうなのでしょうか?

excel(拡張子がcsv)のファイルをコピーして下さいと書いてあるのですが、これに何の意味があるのか教えていただけると幸いです。

元のファイルを上書きする(追記:入力ファイルと出力ファイルを同じに設定した場合に限る)ので先にコピーしてバックアップを作ってください、ということだと思いますが、真意は分かりません。

元のデータは、文字化けしていました。拡張子がcsvだからです。

拡張子は文字化けに関係ありません。元のデータを出力したプログラムの文字コード処理が間違っているか、ファイルを開いたエディタの文字コード判定が間違っているかが原因です。

0Like

Comments

  1. @music1996taro

    Questioner

    拡張子は文字化けに関係ありません。元のデータを出力したプログラムの文字コード処理が間違っているか、ファイルを開いたエディタの文字コード判定が間違っているかが原因です。
    については、どのように対処すれば良いのでしょうか?教えて頂けると幸いです。

markdown での コードは

```rb
code..
```

の様に装飾してください。
markdown と競合して見づらいです

0Like

Comments

  1. @music1996taro

    Questioner

    例えば、このコードだとどうやって直せば良いのでしょうか?教えて頂けると幸いです。お手本を見せて欲しいです。

  2. いや、 こっちはその文面の修正権限が無く、 ソースも見れないので ソースとして書いているところに ``` 付けてって言っているのですが……。(詳しい書き方についてはリンクを参照のこと。

  3. 下記の質問 の本文 を こっちの本文に反映した方がいいのではないでしょうか?

Your answer might help someone💌