CSVファイルを破壊した目に見えないUTF-8文字であるFEFFについての簡単な話

今日、CSVからいくつかのデータベースシードを作成しようとしたときにエラーが発生しました。このCSVは元々、出力をファイルにパイプしてCSVとして保存するRubyスクリプトを使用して私が生成したものです。

CSVはGitにチェックインされ、新しい列を追加していくつかの値を修正することで一部を更新する必要があるまで、しばらくの間使用されていました。

正確な理由はまだわかりませんが、私の理論では、ファイルをCSVとして保存した後でも、どういうわけか、Excel for Mac(すべてMacを使用しています)がメタデータを追加しました。

これにより、シードを使用している人は誰でも次のエラーを受け取ることになります。

CSV::MalformedCSVError: Illegal quoting in line 1.

CSVファイルを開いたところ、疑わしいものは何もありませんでした。私が最初に考えたのは、「通常の」二重引用符ではなく、左/右引用符がファイルに何らかの形で混在していることでした"。しかし、さらに調査したところ、異常なことは何もありませんでした。これにより、ファイル全体を消去して、実際に最初の行をもう一度入力することになりました。

そのファイルを再度保存して、移行を実行しました。

CSV::MalformedCSVError: Illegal quoting in line 1.

何?!

さて、これは私を狂わせていました。新しいファイルを開き、正確な1行をもう一度入力して、移行を実行しました。出来た。では、そのファイルには何が含まれていましたか?!

見つける唯一の方法:

cat companies.csv | pbcopy | pbpaste > temp.csv rm companies.csv mv temp.csv companies.csv git diff

したがって、OSXには、非常に便利な次の2つの関数がpbcopyありpbpasteます。基本的に、パイプされたものpbcopyはすべてクリップボードに入り、クリップボードpbpasteにあるものを標準出力(stdout)に置きます。ただし、すべてのフォーマットが削除されます。

どこかからテキストをコピーして、フォーマットせずにWYSIWYGエディターに貼り付けたい場合に非常に便利です。たとえば、Gmailからメールを書くときのように。

次に、元のファイルを削除し、新しい「フォーマットされていない」ファイルを同じファイル名で保存して、違いを確認しました。

そして、私たちはついに目に見えない男を見ました:

グーグルで簡単に検索すると、私たちの友人U+FEFFはと呼ばれていましたZERO WIDTH NO-BREAK SPACE。また、ウィキペディアへの簡単な旅行でU+FEFF、より一般的にはByte order markまたはとして知られているの実際の使用法について説明しましたBOM

私たちの友人FEFFは別の意味を持っていますが、それは基本的にテキストの読み方に関するプログラムの合図です。それはすることができUTF-8(より一般的な)、UTF-16でも、またはUTF-32

FEFFそれ自体はのためのものですUTF-16UTF-8それはより一般的にとして知られてい0xEF,0xBB, or 0xBFます。

私の理解では、CSVファイルをExcelで開いて保存すると、Excelは目に見えない密航者のためのスペースを作成しましたU+FEFF。そして、起動するファイルの前に!

Excelはいくつかの魔法をかけました、そしてそれはおそらくのUTF-16代わりに保存されましたUTF-8UTF-8は理解せずBOM、文字ではないものとして扱うだけなので、視覚的にはファイルは問題ありませんでした。しかし、RubyCSVは、読み取っているファイルが正しいと想定し、UTF-8Mr U+FEFF。を無視できないため、何か問題があると考えました。

そのため、教訓として、CSVファイルをRubyのCSVパーサーにフィードする場合は、Excelで開かない(保存しないでください)。

このようなエラーが発生した場合は、エディターに表示されていない非表示の文字を必ず探してください。あなたはまだそれを見ることができないとOSXを使用している場合は、pbcopypbpasteあなたを助けます-彼らはコピーして貼り付けることに加えて、テキストから任意のフォーマットや隠された文字を取り除きます。