データ解析ソフトRでのファイル入力read.csvでの問題です。
以下のファイルはヘッダーなしのcsvファイルdata1.csvです。
1,60.4,60.1,60.3
2,60.1,59.5,60.5
これを、data<-read.csv("data1.csv", header=F)
全く問題なく読めます。
以下のファイルはヘッダーなしのcsvファイルdata2.csvです。
1,60.4,60.1,60.3
2,60.1,59.5,60.5
これを、data<-read.csv("data2.csv", header=F)
とすると、
---
type.convert.default(data[[i]], as.is = as.is[i], dec = dec, でエラー:
'<ef>サ<bf>1' に不正なマルチバイト文字があります
---
となりエラーとなります。一見全く同じ内容です。
この2つのファイルは同じ内容ですが、作成方法が違います。
うまくいく方(上)は本に付属のサンプルファイルであり、
うまくいかない方(下)はエクセルファイルからcsvファイルとして出力したものです。
このトラブルの原因を教えて頂きたいのですが。両ファイルともUTF-8となっています(エディタで確認)。
よろしくお願いします。
※自分が作成したcsvファイルでRのread.csvがちゃんと処理できたためしがないのですが。
csvファイルって見えないところにヘッダーがあったりするのでしょうか。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
BOMってByte Order MarkなのでもともとUnicode(基本的には16ビットコード(UTF-16))の上位バイトが先に来るのか下位バイトが先に来るのかを示すためのものなのです。
それでUTF-8はエンコード仕様としてバイト順まで決まっているのでBOMは必要ないはずなのですが、何故かBOM付きUTF-8なんてものがあるのがそもそもの間違いなのです。ただ実際にはBOM付きUTF-8はちょくちょく見かけますね。Windowsのメモ帳も一時期はUTF-8にするとBOM付きでした。今はデフォルトはBOMのないUTF-8になっていますがBOM付きUTF-8でも保存できます。
ExcelがBOM付きUTF-8のCSVを出しているならテキストエディタ(メモ帳でも可)で一度開いてUTF-8(BOMなしのもの)で保存し直せばRで問題なく読めるようになると思います。
なお日本語文字を含む場合はWindows上のRだとUTF-8が化ける恐れがあるので化ける場合はSJISにして下さい。
回答ありがとうございます。秀丸エディタでもBOMのオン・オフを指定できます。またSJISでも動作することを確認しました。なんでBOMなんてものがあるんだと思いました。
No.6
- 回答日時:
動作確認したので回答します。
数字だけのExcelデータをCSVで保存した場合、Excel2013で保存した場合はテキストエディタで開くとSJIS扱いになりました。ASCIIしか含まないUTF-8テキストはSJISと区別できないので妥当です。一方でMicrosoft365のExcel(バージョン2202)だと同じデータがBOM付きUTF-8テキストになります。
# ちなみに日本語文字が入っていると最新版もSJISテキストのCSVになる
# バージョン2202のバグかも
一方でR(これは最近入れたのでバージョン4.1.3だったかと)ではSJIS扱いのCSVは普通に読めますが、BOM付きUTF-8のCSVは不正なマルチバイト文字のエラーになります。
以上からNo.1-4の方の回答が正しいようです。
回答ありがとうございます。文字コードに関してあまり理解していないのですが、トラブルが生じたらUTF-8にすればいいんだ、ということだけ覚えていました。ところが、BOMが出てきてそれではダメということになりました。一応BOMをコントーロールする方法(それを付けたり、削除したりする方法)も覚えたのですが、何とめんどくさいことしてくれたんだろうと思います。覚えることが減ったと思ったのに忘れてはならないことができてしまいました。
No.5
- 回答日時:
No.4
>0.001を1000回足せば、1になるはずですが、計算結果は1ピッタリにはなりません。
そんなに多くしなくても、たとえば、0.1を10個足しても1ピッタリにはなりません。
Rで0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1を計算すると答は1と表示されますが
0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1==1だとFALSEになります。
実際には1と少し違うのに1と表示しています。
Pythonだと0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1は0.9999999999999999に
なります。
No.4
- 回答日時:
No2です。
結局、うまくいかない方(下)は、どうなったのでしょうか?
BOMがついていて、BOMをはずしたたら、うまく読み込めたと解釈して良いのでしょうか。こちらの回答が正しかったのかどうか、気になり念のため確認した次第です。
>これだけ知っておけばコンピュータリテラシはOKというような範疇があるのでしょうか。
そのような、範疇があるかどうかはわかりませんが、
あなたが、プログラマーもしくはSEの立場でしたら、
CPUのエンディアン及び浮動小数点数
については、理解しておく必要があるかと思います。
エンディアンについて
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3 …
浮動小数点について
https://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95 …
エンディアンについては、バイナリーデータを扱うとき、
ビッグエンディアンなのかリトルエンディアンなのかを押さえておく必要があります。
(通信プロトコル上はビッグエンディアンを使用することが決められていますが、INTEL系のCPU(AMDも含む)はリトルエンディアンです)
浮動小数点数については、例えば、
0.001を1000回足せば、1になるはずですが、計算結果は1ピッタリにはなりません。必ず誤差が出ます。
小数点を含む計算が、電卓でたたいたような結果を期待するには無理がある
ということを理解しておく必要があります。また、誤差を極力出ないようにするための工夫も必要になります。
上記以外については、いまのところ思い当たりません。
No.2
- 回答日時:
No1です。
>エディタで保存するときにBOMの有無を指定できるのでしょうか。
うまくいかない方(下)は、添付図のように、BOMにチェックがいれてあるはずです。このチェックをはずしてください。そして上書き保存してください。そうするとBOMが外れます。
>逆にBOMの効用というか、どう言う場合に役に立つのかということです
が。
一般ユーザーからすると、百害あって一利なしのような気がします。
もともとは、漢字とかの文字を表現するために、いろいろな文字コードが乱立している状態でした。(日本ならシフトJISとかEUCとかです。)
これを世界中の文字コード1つに統一する試みが行われました。
これをユニコードと言ってますが、(マイクロソフトは内部コードはユニコードにしてあります)、ユニコードでもマシンのメーカー(コンピュータのメーカー:INTEL等)により、内部の持ち方に違いが発生してしましました。この違いを明確にするために、ファイルの先頭にBOMをつけて管理することになりました。
詳しくは、
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4 …
を参照ください。
我々一般ユーザーの立場としては、
通常は、ユニコードはUTF-8しか使いません。そしてUTF-8はBOMがないことを前提にしているアプリケーションが大部分です。
従って、
1.動作がおかしかったら、BOMの有無を疑う。
2.そのソフトが明示的にBOMが有ることを前提にしていなければ、BOMを外してから、動作させる。
ということを踏まえていれば、それでよいかと思います。
詳細な回答を頂き有難うございます。
今回、はじめてBOMという仕様に出会いました。もし、このようなものを知らず、ここへの質問もしなかったらこのトラブルを回避する方法を発見できなかったはずです。今回の件でUTF8のファイル読み込みで何か不具合があったらBOMを疑うということは憶えました。
また、BOMを知らない状態でファイルの読み書きをプログラムで実行していたとしたら、うまく読んだような顔をして全くこちらの意図がプログラムに通じてない、間違ったデータの読み込みで結果を誘導していないかという疑義が生じます。またBOMはよしとして、それ以外にBOM風の仕様があってそれを知らないとトラブルが解決できないというようなものがありそうな気がしてきました。これだけ知っておけばコンピュータリテラシはOKというような範疇があるのでしょうか。
No.1
- 回答日時:
エディターは何を使用されていますか。
うまくいかない方(下)のファイルにはBOMがついていませんでしょうか。
BOMについては、下記URLを参照ください。
https://uxmilk.jp/48923
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4 …
両ファイルについて、BOMの有無を確認してください。
回答ありがとうございます。エディタは秀丸です。両ファイルともUTF-8です。BOMという概念はこれまで全くノーマークでした。BOMの有無に関しては無しにしないと動作しないということでしょうか。BOMをコントロールする方法が不明なのですが。エディタで保存するときにBOMの有無を指定できるのでしょうか。逆にBOMの効用というか、どう言う場合に役に立つのかということですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- XML PHP.laravelについて 1 2023/07/06 15:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
csvファイル 項目数取得
-
バッチでCSVを処理する時、空の...
-
csvファイルでの日付設定「yyyy...
-
エクセルVBA 大容量CSVファイル...
-
CSV形式での保存時に”文字列...
-
CSVファイル作成
-
エクセル形式のファイルの読み込み
-
csvファイルのデータの一部を取...
-
CSVファイルの項目行を削除...
-
CSVファイルをMDBに取り込む
-
csvファイルを列数ごとに分割す...
-
VB6.0 CSVファイル読み込みに...
-
C# datagridview csv 読込
-
android CSVファイルのデータを
-
【ExcelVBA】UTF-8の文字コード...
-
wshでcsvファイルのソートを行...
-
マクロから出力されるcsvのダブ...
-
VBAでcsvファイルを読み込んで...
-
特定文字を入ってるCSVの特定の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
複数のcsvファイルをExcelに一...
-
CSV形式での保存時に”文字列...
-
csvファイル 項目数取得
-
csvファイルでの日付設定「yyyy...
-
マクロから出力されるcsvのダブ...
-
バッチでCSVを処理する時、空の...
-
csvファイルのデータの一部を取...
-
エクセルVBA 大容量CSVファイル...
-
csvファイルを列数ごとに分割す...
-
PHP.laravelについて
-
COBOLでCSVをインプットにして...
-
COBOL85でのCSVファ...
-
複数のCSVファイルのAccessテー...
-
データ解析ソフトRでのファイル...
-
【C#】パス名で無効な文字
-
VBAでcsvファイルを読み込んで...
-
特定文字を入ってるCSVの特定の...
-
CSVファイル作成
-
【エクセル マクロ】読み込ん...
おすすめ情報