2

FTPサイトから取得したCSVファイルを解析しています。CSVを解析し、データベースに保存する特定のフィールドをいくつか抽出したいと思います。理解できないエンコーディングに遭遇し、CSV.parseもエンコーディングを期待していないと思います。

filename = "#{RAILS_ROOT}/spec/files/20120801.01.001.CSV"
filestream = File.new(filename, "r")
while (line = filestream.gets)
  puts "line: #{line}"
  CSV.parse(line) do |row|
    case row[0]
    when "RH"
     # do something
    when "SH"
     #do something else
    end
  end
end

CSVファイルの最初の行は次のようになります。

"\376\377\000\"\000R\000H\000\"\000,\0002\0000\0004\0005\000/\0000\0008\000/\0000\0002\000 \0000\0005\000:\0005\0007\000:\0002\0001\000 \000-\0000\0007\0000\0000\000,\0002\0000\0001\0002\000/\0000\0008\000/\0000\0001\000 \0000\0000\000:\0000\0000\000:\0000\0000\000 \000-\0000\0004\0000\0000\000,\0002\0000\0001\0002\000/\0000\0008\000/\0000\0001\000 \0002\0003\000:\0005\0009\000:\0001\0004\000 \000-\0000\0007\0000\0000\000,\000\"\000Y\0003\000B\0003\0003\000Z\000N\000K\000A\000U\000B\000H\000N\000\"\000,\0000\0000\0001\000,\000\n"

自分で作成した別のCSVファイルがあり、人間が読めるテキストとして出力されます。ここで何が欠けていますか?CSV.parseに渡す前に、CSV文字列にエンコードを適用する必要がありますか?

スタックトレースは次のとおりです。

CSV::IllegalFormatError
/Users/project/app/models/parse_csv.rb:5:in `parse'

現在、rubyv1.8.7を使用せざるを得ません。

CSV.openを使用できることは知っていますが、意図的にCSV.parse IOストリームをフィードして、CSVファイルを保存せずにSFTPを使用してファイルをメモリにストリーミングできるようにFTPサイトからCSVファイルを取得しようとしています。ディスクへ:

 sftp.open_handle("/path/to/remote.file") do |handle|     
      data = sftp.read(handle)   
   end

アイデアをよろしくお願いします!

4

1 に答える 1

2

行には二重引用符が含まれているため、エスケープする必要があります。これはruby-forum.comで見つけました。

これは単なる推測ですが、コンマの前後にないすべての二重引用符を一重引用符に置き換えてみることができますか?以下のテストされていないコードのようなもの:

line.gsub(/ [^、] "[^、] /、"'")

おそらく、最初にファイル全体を読み取り、修正されたバージョンを書き出してから、その上でCSVメソッドを呼び出す必要がありますが、手作業で行うよりも優れています:)。

また、余談ですが、代わりに

while (line = filestream.gets)

あなたができる

filestream.gets.each_line do |line|

これはもっとルビーっぽいかもしれません(多分?)

于 2012-08-03T03:23:52.007 に答える