2012-05-18 3 views
7

定期的にCSV形式のログをメールで送信するiPhoneアプリを使用しています。私は古いログとそのログのデータを合計するルビースクリプトを持っています。最近、アプリ開発者は、未知の理由により、各行の末尾に改行が追加され、スクリプトが失敗するという更新をリリースしました。ドキュメントによると、デフォルトで:row_end:autoであり、\r\nまたは\n(1.9.2)のいずれかを受け入れる必要があります。私は1.8.7でRuby 1.8.7,1.9.2、FasterCSVを使ってみました。私は Ruby CSVが行末として r nを理解していません

  • CSV::IllegalFormatError
  • 非上場のフィールドが許可されていません

      を含め、これらの異なる試行でさまざまなエラーメッセージを取得 \r\n(ライン1)( FasterCSV::MalformedCSVError
    • NilClass(TypeError例外)をDUPすることはできません

    1.9.2。 (\rは、フィールドで、それはラインの終わりだではありません!)のデータは、以前はこのように見えた:CSVを考えることができることを考える

    03-12-2012 07:59,120.0,^M 
    03-11-2012 08:27,120.0,^M 
    03-10-2012 07:57,120.0,^M 
    

    03-12-2012 07:59,120.0, 
    03-11-2012 08:27,120.0, 
    03-10-2012 07:57,120.0, 
    

    は、今ではこのようになります^Mが最後のフィールドにあるので、別のカンマを追加しようとしました:

    03-12-2012 07:59,120.0,,^M 
    

    私が想像できる唯一のことは、CSVではすべてのフィールドを二重引用符で囲む必要があることです。 最初にファイルを読み込み、最後をコンパイルしてからCSVで配列を処理するなど、さまざまな回避策が考えられますが、最初に間違っていることを見つけたいと思います。それはうまくいくようです。

    CSV.foreach(File.join($import_dir, file)) do |record| 
    

    と私は無駄に:row_end => "\r\n"を設定しようとしました:私のコードは単純ですところで

    私はMac OS X 10.6.8です。

  • 答えて

    3

    作品です。3:それで

    [email protected]:~$ irb 
    1.9.3p0 :001 > require 'csv' 
    => true 
    1.9.3p0 :002 > CSV.foreach("rn.csv") do |row| 
    1.9.3p0 :003 > p row 
    1.9.3p0 :004 > end 
    ["1","2","3","4","5"] 
    ["6","7","8","9","10"] 
    

    、ファイルが実際に持っているんキャリッジリターン:実際には\ rを\ r \ nので終わるファイルの

    [email protected]:~$ od -a rn.csv 
    0000000 1 , 2 , 3 , 4 , 5 cr nl 6 , 7 , 8 
    0000020 , 9 , 1 0 cr nl 
    0000027 
    
    +2

    チップをありがとう。 odでファイルを見ることを考えなかった。 \ r \ r \ nで行末を表示します。 – chetstone

    3

    あなたの回答は:row_end => '\r\n'です。一重引用符は、バックスラッシュの(ほとんどの場合)を通常のバックスラッシュ文字として扱います。二重引用符で:row_end => "\r\n"を試してください。単一引用符で囲まれた文字列が唯一のあなたが脱出できるようにする 'と\、それ以外の任意のものはリテラル\、すなわちとして扱われます。

    +0

    私の間違い。私はそれを試みた。同じ問題。 – chetstone

    5

    これは「\ rを\ n」のとは異なっているrow_end

    "\r\n" 
    

    を設定してみてください

    '\r' == "\\r" 
    

    1.9で、私にとって真

    +0

    申し訳ありませんが、私もそれを試して言及を忘れてしまった。 – chetstone

    2

    ラインではなく、\ rを\ nは はこれがあります恥ずかしい、私はより詳細にファイルをチェックする必要があります。私は は、私はUnixの箱の上にあるので、行末は\ nと仮定していました。 しかし、Emacsがファイルを開くと自動的に "DOS"モードになり、\ r \ nが新しい行として表示され、余分な\ rは "^ M"として表示されます

    +0

    これは私の場合に当てはまりました。 Vimは余分な '\ r'を'^M'として示し、行は実際に '\ r \ r \ n'で終わっていました。人を見てください。 – ElDog

    6

    CSVは読み込み/ row_endが自動であるときにファイル全体を処理するには、例外をフォーマットしてエンコードするのを防ぐために次の処理が必要でした。 CSVとしてFile.read

    • デコードファイルクレンジングファイルを解析
    • (一つ以上の可能性が)それらの厄介なキャリッジリターンを削除
    file = File.read(temp_file.path, encoding: 'ISO-8859-1:UTF-8') 
    file = file.tr("\r", '') 
    
    CSV.parse(file, headers: true) do |row| 
        # do all the things 
    end 
    

    注:私はバージョンを使用していますRails 4アプリケーション用のRuby 2.1.3

  • 関連する問題