8

定期的にCSV形式のログをメールで送信するiPhoneアプリを使用しています。そのログのデータを古いログと合計するrubyスクリプトがあります。最近、アプリ開発者がアップデートをリリースしました。これは、なんらかの理由で、各行の最後にキャリッジリターンを追加し、スクリプトが失敗する原因になりました。ドキュメントによると、:row_endデフォルトでは、または(1.9.2)の:autoいずれかを受け入れる必要があります。Ruby 1.8.7、1.9.2、および1.8.7でFasterCSVを使用してみました。これらのさまざまな試行で、次のようなさまざまなエラーメッセージが表示されます。\r\n\n

  • CSV::IllegalFormatError
  • 引用符で囲まれていないフィールドでは、\rまたは\n(1行目)(FasterCSV::MalformedCSVError)は許可されません
  • 複製できませんNilClass(TypeError)

1.9.2で。(\rはフィールドにありません。行の終わりです!)以前のデータは次のようになりました。

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

これで、次のようになります。

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

^MCSVが最後のフィールドにあると考えている可能性があると考えて、別のカンマを追加してみました。

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

無駄に。

私が想像できる唯一のことは、CSVではすべてのフィールドが二重引用符で囲まれている必要があるということですか?最初にファイルを読み取り、最後を切り刻み、次に配列をCSVで処理するなど、さまざまな回避策を考えることができますが、最初に、何が間違っているのかを調べたいと思います。うまくいくようです。

ちなみに私のコードは単純です:

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

そして、私は:row_end => "\r\n"無駄に設定しようとしました。

私はMacOSX10.6.8を使用しています。

4

5 に答える 5

8

CSVrow_endは自動でファイル全体を読み取る/解析する必要があるため、フォーマットとエンコードの例外を防ぐために次のことを行う必要がありました。

  • を介してファイルをデコードしますFile.read
  • それらの厄介なキャリッジリターンを削除します(1つ以上の場合があります)
  • クレンジングされたファイルをCSVとして解析します
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

注:Rails4アプリケーションにはバージョンRuby2.1.3を使用しています。

于 2015-02-12T05:18:32.200 に答える
5

に設定してみてrow_endください

"\r\n"

これは'\r \ n'とは異なります。一重引用符で囲まれた文字列では、'と\のみをエスケープできます。それ以外のものは、リテラル\として扱われます。

'\r' == "\\r"

本当ですか

于 2012-05-18T20:21:01.567 に答える
3

あなたは試してみると言い:row_end => '\r\n'ました。一重引用符は、バックスラッシュ(のほとんどのインスタンス)を通常のバックスラッシュ文字として扱います。:row_end => "\r\n"二重引用符で囲んでみてください。

于 2012-05-18T20:19:33.773 に答える
3

1.9.3で動作します:

mark@ubuntu:~$ 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"]

そして、ファイルには確かにキャリッジリターンが含まれています。

mark@ubuntu:~$ od -a rn.csv
0000000   1   ,   2   ,   3   ,   4   ,   5  cr  nl   6   ,   7   ,   8
0000020   ,   9   ,   1   0  cr  nl
0000027
于 2012-05-18T23:48:24.643 に答える
2

ファイルの行は実際には\r\nではなく\r\ r \nで終わります。これは恥ずかしいことです。ファイルをより詳細にチェックする必要があります。私はUnixボックスを使用しているので、行末は\nだと思っていました。しかし、Emacsがファイルを開くと、自動的に「DOS」モードになり、\ r \ nが新しい行として表示され、余分な\rのみが「^M」として表示されました。

于 2012-05-20T16:23:18.907 に答える