2016-11-23 15 views
2

My Rubyの環境は、Ruby 2.3.1とRails 5.0.0.1です。Rubyでインポートするときに、文字列の負の数値を整数に変換する際のエラー

Iは、例えば、整数に負の文字列番号を変換しようとしている:

私はこれをオンにしようと「-2000」IRBターミナルで、私は結果が-2000を期待しました

しかし、このデータをCSVファイルからインポートすると、これを変換しようとしています。

私は、以下の情報を使用しています:

CSVファイル

345,­-2000 
345,120000 

コードファイル

CSV.foreach("file.csv") do |row| 
    p [row[0], row[1]] 
    p row[1].to_i 
    p row[1].force_encoding('UTF-8').to_i 
    p Integer(row[1]) 
    p Integer(row[1].force_encoding('UTF-8')) 
end 

は、私が得たもの:

["345", "­-2000"] 
0 
0 
'Integer': invalid value for Integer(): "\xC2\xAD2000" (ArgumentError) 
'Integer': invalid value for Integer(): "\xC2\xAD2000" (ArgumentError) 

整数を使用して()私は、 ignは "\ xC2 \ xAD"で表されます。

要約すると、to_iメソッドは "\ xC2 \ xAD2000"を0に変換し、Integer()はエラーをトリガします。

誰か助けてもらえますか?

ご協力いただきありがとうございます。

+0

このデータはどこから来たのですか、および/またはCSVはどのようにエンコードされていますか?このチュートリアルは役に立ちます - http://www.justinweiss.com/articles/3-steps-to-fix-encoding-problems-in-ruby/ –

+0

@DamienRocheこれはCSV拡張子を持つ単純なファイルです。私はこのファイルをエンコードしませんでした。私はちょうどCSVクラスを使用して配列内の行の各行を有効にします。私はチュートリアルを見るでしょう。ありがとう。 –

+0

'force_encoding'は非常に特殊な場合にのみ使用してください。 (ファイルの全体的なエンコーディングに合致しない特定のテキストがあることが分かっている場合を除いて)ファイルを開くときはほとんどありません。代わりに、CSVを開くときにエンコードを指定する必要があります。 [the doc](http://ruby-doc.org/stdlib-2.3.1/libdoc/csv/rdoc/CSV.html#method-c-foreach)を参照してください。 – Kelvin

答えて

1
あなたが実際にここで2つの文字を持っているように見えます

..

、私は文字の組み合わせを置き換えます実際のハイフンを使用して整数に変換します。

CSV.foreach("file.csv") do |row| 
    p row[1].sub("\xC2\xAD", '-').to_i 
end 

これは、またはソースファイルをクリーンアップします。どのようにそれを生成しているのかわからないが、検討する価値がある。

関連する問題