2017-04-01 28 views
0

ruby​​ on railsでsqlite3にインポートするcsvファイルがあります。 csvファイルにはMM/DD/YYYY形式の日付列があります。 sqlite3の日付はDD/MM/YYYYの形式です。 csvファイルを変更せずに同じフォーマットに変換するにはどうすればよいですか?Ruby on rails - csvをレールにインポートするときに日付形式を変更する

+0

あなたのSQLiteデータベースでは、日付は、私は願って、実際の日付の列に格納されて? –

+0

はい、それは列に格納されます –

+0

明らかに、それは列ですが、その列の種類は何ですか? –

答えて

2

まず、SQLiteの日付を間違った形式で保存しています。ファインからSQLite manual

2.2。日付と時刻のデータ型

SQLiteには、日付や時刻を格納するためのストレージクラスはありません。

  • TEXTとしてISO8601の文字列( "YYYY-MM-DD HH:MM:代わりに、SQLiteののビルトイン日付および時刻関数はTEXTREAL、またはINTEGER値として日付と時刻を格納することが可能であるSS .SSS ")。
  • [...]

あなたがで作業するためのSQLiteの機能を使用できるようにSQLiteので日付を格納する推奨方法は、ISO-8601形式(YYYY-MM-DD)を使用してtext列になりますそれらと彼らは正しく比較/並べ替えます。

date_for_sqlite = date.iso8601 
Date#iso8601メソッドを使用してISO-8601日付文字列にそれを変換し、その後

date = Date.strptime(date_string_from_csv, '%m/%d/%Y') 

と:

行うには賢明なことは、着信日付がRubyの標準ライブラリからDate.strptimeを使用し解析することです

を入力し、date_for_sqliteをデータベースに送信します。ボーナスとして、正気のデータベースはISO-8601のフォーマットされた日付を明白に理解するので、データベースを切り替えるとこの問題について心配する必要はありません。

あなたがstrftimeを使用し、あなたの非標準DD/MM/YYYY形式を使用する必要がある場合:

date_for_sqlite = date.strftime('%d/%m/%Y') 
+0

ありがとうございます。私のCSVファイルには複数の行があり、 'namespace:db do do タスク:import_csv =>:環境do CSV.foreach(" sample_landslides.csv "、:headers => true)do | row | Landslide.create!(row.to_hash) 'ファイル全体をレールにします。私は現在の日付の列を削除し、それに変換された日付の列の日付の列をインポートすることを考えています。どうやってやるの? –

+0

テーブルをドロップしてから、適切な日付形式で再インポートしてみませんか?そこに保存する必要がある新しいデータがありますか? –

関連する問題