重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

# データを書き換える処理
def replace
output = File.read(@inputfile).split("\n").map do |content|
name, sex_code, tel = content.split(',')
last_name, first_name = name.split
[last_name, first_name, sex(sex_code), separated_tel(tel)].join(',')
end.join("\n")
File.write(@outputfile, output)
end

private

# 性別コードを文字列に変換
def sex(code)
code.to_i == 1 ? '男性' : '女性'
end

# 携帯電話番号をハイフン区切りに変換
def separated_tel(number)
number.match(/(\d{3})(\d{4})(\d{4})/)
"#{$1}-#{$2}-#{$3}"
end
end

replacement = DataReplacement.new
# 入力ファイルの指定
replacement.inputfile = ARGV[0]
# 出力ファイルの指定
replacement.outputfile = ARGV[1]
# データ書き換え
replacement.replace
というソースコードで、コマンドプロンプトで実行した結果、
コマンドには表示されず、excelの拡張子がcsvのファイルに書き出されるみたいなのですが、これも、文字化けしていて、同様の修正を施したものが、
山田,太郎,男性,090-0000-0000
山田,花子,女性,090-1111-1111
鈴木,次郎,男性,090-2222-2222
鈴木,桃子,女性,090-3333-3333
田中,三郎,男性,090-4444-4444
田中,梅子,女性,090-5555-5555
高橋,四郎,男性,090-6666-6666
高橋,桜子,女性,090-7777-7777
佐藤,五郎,男性,090-8888-8888
佐藤,李子,女性,090-9999-9999
がexcelの拡張子がcsvファイルに書き出されるみたいなのですが。教えて頂けると幸いです。

質問者からの補足コメント

  • 取り敢えず、あなたが使用されているrubyのバージョンは何でしょうでしょうか。

    又、提示されたスクリプトを実行するために、
    どのようなコマンドを実行されたのでしょうか。について、の返事を返すという事でいいでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2025/03/12 17:56
  • うーん・・・

    ルビー言語のバージョンは、
    ruby 3.3.4 (2024-07-09 revision be1089c8ec) [x64-mingw-ucrt]
    です。
    それでコマンドは、本に載っているプログラムで、サンプルファイルがあるので、part1でのコマンドでは、data_replacement_before.rb inputdata.csvですが、実際書籍には、ruby -Ku data_replacement.rb inputdata.csvで、part2のコマンドでは、data_replacement_after.rb inputdata.csv outputdata.csvですが、これも、同様の書籍には、ruby -Ku data_replacement3.rb inputdata.csv outputdata.csvとなっています。教えていただけると幸いです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2025/03/12 21:31
  • うーん・・・

    早速、実行した結果、サンプルファイルと同じような結果になりました。メモ帳で、保存した
    inputdata.csvと、outputdata.csvが勝手にエクセルのファイルになり、outputdata.csvの内容を確認すると、やはり、内容が文字化けしていました。サンプルファイルと同じです。これで、いいのでしょうか?教えていただけると幸いです。

    No.4の回答に寄せられた補足コメントです。 補足日時:2025/03/14 15:18
  • うーん・・・

    それと、inputdata.csvのファイルをコピーをして下さいと書かれているのはなぜでしょうか?気にしなくても良いのでしょうか?教えていただけると幸いです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2025/03/14 15:21
  • うーん・・・

    inputdata.csvがないとエラーになるので、コピーしてくださいについてですが、コピーして
    inputdata.csvを作成したのは、もし、inputdata.csvのファイルに何らかの事があった時の為と言う事が言いたいのでしょうか?つまり、万が一の時の事だから、別にコピーしなくても、大丈夫と言うことでしょうか?教えていただけると幸いです。

    No.6の回答に寄せられた補足コメントです。 補足日時:2025/03/14 17:39
  • うーん・・・

    関連付けを外せば、excelのアイコンは表示されなくなります。についてですが、拡張子がcsv以外であれば、excelのアイコンにならないということですよね?とすると、今回の質問では、拡張子が、csvにするから、今回は、仕方が無いという事で、そう解釈してもよろしいでしょうか?
    inputdata.csvは、間違いなくutf-8(BOM無し)で保存しましたか。については、
    「はい。」です。
    又、outputdata.csvの内容をどのようにして確認されたのでしょうか。
    これについては、直接、Cドライブのフォルダーにアクセスして、outputdata.csvのファイルをダブルクリックして内容を確認しました。
    教えていただけると幸いです。

    No.5の回答に寄せられた補足コメントです。 補足日時:2025/03/14 17:48
  • うーん・・・

    コピーをしていないと、 inputdata.csv が、そのフォルダ上にないため、
    スクリプト実行時にエラーになります。
    そのため、コピーをしてから実行しなさいということです。
    についてですが、実際inputdata.csvを、コピーしなくても、全然正常に実行できましたが。
    そのフォルダー上にないとは、どう言うことでしょうか?inputdata.csvは、保存時に、ルビーファイルと同じフォルダーに保存すると思うのですが。コピーする必要性について教えていただけると幸いです。コピーをしない場合の例を挙げてくれても良いです。

    No.7の回答に寄せられた補足コメントです。 補足日時:2025/03/14 17:57
  • うーん・・・

    サンプルプログラムをダウンロードをしたので、そのフォルダーの中には、この課題に該当するルビーファイルと、一緒のフォルダーにinputdata.csvがあるのですが。それでも、コピーする必要はあるのでしょうか?教えていただけると幸いです。

    No.11の回答に寄せられた補足コメントです。 補足日時:2025/03/14 19:54
  • うーん・・・

    ありがとうございました!文字化けの件は、無事解決しました!エラーメッセージもちゃんと出てきました。ちなみに、コマンドプロンプトに実行結果の内容のエラーメッセージは、
    C:/STUDY/data_replacement_after.rb:7:in `read': No such file or directory @ rb_sysopen - inputdata.csv (Errno::ENOENT)
    from C:/STUDY/data_replacement_after.rb:7:in `replace'
    from C:/STUDY/data_replacement_after.rb:35:in `<main>'
    と出てきました。これで合っていますでしょうか?

    No.10の回答に寄せられた補足コメントです。 補足日時:2025/03/14 20:40
  • うーん・・・

    コピーの件については、inputdata.csvのファイルが、どこかに行った時用にまず、コピーしましょうと言うことでしょうか?そうか、一からrubyのプログラムを組みたい人用とかかもでしょうか?ですが、サンプルプログラムをダウンロードした時に、outputdata.csvも、既にあって、それは、文字化けしていましたが。これは、BOM有りになっていなかったからですね。過去には、BOM無しでそのまま
    excelファイルの文字化けが無かったのかもしれませんね。教えていただけると幸いです。

    No.12の回答に寄せられた補足コメントです。 補足日時:2025/03/14 20:49

A 回答 (14件中1~10件)

>コピーの件については、inputdata.csvのファイルが、どこかに行った時用にまず、コピーしましょうと言うことでしょうか?


>そうか、一からrubyのプログラムを組みたい人用とかかもでしょうか?

作者がどのような意図でコピーしましょうと書いたのかはわかりません。
その作者のサイトのURLを提示していただければ、作者の意図が読み取れるかもしれません。
あまり、そのことにこだわる必要はないと思いますが・・・


>ですが、サンプルプログラムをダウンロードした時に、outputdata.csvも、既にあって、それは、文字化けしていましたが。
>これは、BOM有りになっていなかったからですね。

はい、そのように考えて良いと思います。


>過去には、BOM無しでそのまま
>excelファイルの文字化けが無かったのかもしれませんね。

excelが扱えるファイルの文字コードは、最初はシフトJISだけでしたが、これは当然BOM無しです。
その後で、UTFコードが採用されるようになると、UTFコードにも何種類かあるので、
それらを区別できるようにするため、マイクロソフト独自の仕様(だと思いますが)で、
BOMをつけるようになりました。
UTF-8
UTF-16
UTF-32
等を区別するためです。
一方、rubyとかpythonとかの作者は、マイクロソフトとは関係ないので、
UTF-8をサポートするがデフォルトとしてBOM無しのファイルを扱うようにしています。
    • good
    • 0

>実行結果の内容のエラーメッセージは、


>C:/STUDY/data_replacement_after.rb:7:in `read': No such file or dir・・・途中省略・・・
と出てきました。これで合っていますでしょうか?

はい、あってます。
    • good
    • 0

>サンプルプログラムをダウンロードをしたので、そのフォルダーの中には、この課題に該当するルビーファイルと、一緒のフォルダーにinputdata.csvがあるのですが。

それでも、コピーする必要はあるのでしょうか?

いえ、それならコピーする必要はありません。
この回答への補足あり
    • good
    • 0

>inputdata.csvは、保存時に、ルビーファイルと同じフォルダーに保存すると思うのですが。

コピーする必要性について教えていただけると幸いです。

「保存時に」という言葉から判断すると、あなたがinputdata.csvをエディタで作成し保存したと読み取れます。
この課題の作者は「inputdata.csvをエディタでデータを入力して作成しなさい」とはいってないと思います。どこかのフォルダ内にinputdata.csvがあるので、それをコピーして使いなさい、と言っていると思うのですが。
もちろん、コピーしないで、自分で作成しても構いません。
ただ、コピーして使ったほうが、手間がかからないので楽でしょうということです。
この回答への補足あり
    • good
    • 0

>outputdata.csvのファイルをダブルクリックして内容を確認しました。


一旦、UTF-8対応のエディタでoutputdata.csvの内容を確認したのち、
UTF-8のBOM付きで、保存してみてください。
そうすると、ダブルクリックしてexeclで表示したとき文字化けしません。
excelに読み込ませる場合は、BOM付きでないと正常に表示されないですね。
この回答への補足あり
    • good
    • 0

>コピーをしない場合の例を挙げてくれても良いです。




C:\test のフォルダで試験をする場合、
①C:\test の下に data_replacement3.rb を作成します。
②どこかのフォルダからinputdata.csvをコピーして、C:\test の下に格納します。
③コマンドプロンプトを開きます。
④cd コマンドでC:\testに移動します。
⑤ruby data_replacement3.rb inputdata.csv outputdata.csv を実行します。

上記の作業で②の処理を行っていないと、inputdata.csvがないため、エラーになります。


⑤のコマンドを実行する前に dirと入力して、ファイル一覧を表示してください。もし、inputdata.csvがあるなら、それを削除してください。
そして、もう一度、dirと入力してinputdata.csvが表示されないことを確認してください。
そして、⑤のコマンドを実行してください。下記のようなエラーメッセージが表示されるはずです。
No such file or directory @ rb_sysopen - inputdata.csv (Errno::ENOENT)
    • good
    • 0

拡張子がcsv以外であれば、excelのアイコンにならないということですよね?とすると、今回の質問では、拡張子が、csvにするから、今回は、仕方が無いという事で、そう解釈してもよろしいでしょうか?



はい、そう解釈して構いません。
但し、関連付けをするかしないかは、あなたの好みなので、
excelのアイコンを表示したくないなら、関連付けを解除してください。
その方法の詳細は私も忘れましたので、ここに提示はできませんが
"windows11 拡張子 関連付け" で検索すれば出てきますので、それを見て解除してください。


>これについては、直接、Cドライブのフォルダーにアクセスして、outputdata.csvのファイルをダブルクリックして内容を確認しました。

メモ帳かUTF-8が表示可能なエディタで開いてください。
ダブルクリックすると、excelで開くので、文字化けします。
    • good
    • 0

>nputdata.csvがないとエラーになるので、コピーしてくださいについてですが、コピーして


>inputdata.csvを作成したのは、もし、inputdata.csvのファイルに何らかの事があった時の為と言う事が言いたいのでしょうか?
>つまり、万が一の時の事だから、別にコピーしなくても、大丈夫と言うことでしょうか?

いいえ、違います。
ruby data_replacement3.rb inputdata.csv outputdata.csv
と入力したとき、
コピーをしていないと、 inputdata.csv が、そのフォルダ上にないため、
スクリプト実行時にエラーになります。
そのため、コピーをしてから実行しなさいということです。
コピーをすれば、inputdata.csv が、そのフォルダ上にあるため、エラーにはなりません。

outputdata.csvは、出力用なのでなくてもエラーになりません。
この回答への補足あり
    • good
    • 0

>それと、inputdata.csvのファイルをコピーをして下さいと書かれているのはなぜでしょうか?



想像ですが、inputdata.csvが、
ruby data_replacement3.rb inputdata.csv outputdata.csv
とコマンドを打った時、そのフォルダ上に、inputdata.csvがないとエラーになるので、コピーしてくださいと書かれているのかと思います。
この回答への補足あり
    • good
    • 0

>inputdata.csvと、outputdata.csvが勝手にエクセルのファイルになり、



エクスプローラでファイルを表示したとき、excelのアイコンが表示される問意味でしょうか。そうであれば、拡張子(csv)をエクセルに関連付けているためです。関連付けを外せば、excelのアイコンは表示されなくなります。
もし、違う意味でしたら、補足してください。


>outputdata.csvの内容を確認すると、やはり、内容が文字化けしていました。

inputdata.csvは、間違いなくutf-8(BOM無し)で保存しましたか。
又、outputdata.csvの内容をどのようにして確認されたのでしょうか。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています