2012-03-04 26 views
0

私はさまざまな形式のスプレッドシートを解析するアプリケーションを開発中です。それはCSVのために働いていましたが、私はそれをXLS、XLSX、ODS、Googleスプレッドシートに拡張しようとしています。レールのスイッチ/ ifステートメントでregexを使用してアップロードした後のファイル拡張子を特定する

アップロードしたファイルをファイル名に応じて正しく解析します。私はregexとswitchとif文でこれを達成しようとしましたが、それまでは動作しませんでした。 CSVファイルでさえもはや解析されないので、この問題は正規表現の条件内にあるようです。

def create 
    @deck = Deck.new 
    @deck.name = params[:uploadform][:name] 
    @deckmsg = "" 

    if @deck.save 
    @deckmsg='Deck was successfully created.' 
    else 
    respond_to do |format| 
     format.html { render action: "new", notice: 'Deck was not created.' } 
    end 
    end 

    if params[:uploadform][:file] =~ /.*(csv)$/ 
    begin 
     @answers = Array.new 
     @questions = Array.new 
     CSV.parse(params[:uploadform][:file].read) do |row| 

私はif文を取れば、それはとても問題があるにしておく必要があります動作します。ここでは

は私の現在のバージョンです。私は通常のアップロードフォームを使用しています。

答えて

6

アップロードしたCSVファイルに大文字の拡張子が含まれている可能性がありますか? myfile.CSVはあなたの正規表現と一致しません。あなたは、大文字と小文字を区別しない一致させるために、それを伝えることでこの問題を解決することができます

/.\.csv$/i 

mycsvがマッチしませんように、私はまた、余分な括弧を削除し、明示的な.に追加しました。拡張子の前にあるすべての文字を一致させる必要はありません(ただし、少なくとも1つのファイルが確実に ".csv"という名前になっていないようにします)。

さらに、params[:uploadform][:file]は期待通りの文字列ではない可能性があります。それはおそらく、ファイル名を取得するには、それにoriginal_filenameを呼び出す必要があります。その場合にはActiveDispatch::UploadedFile、です:

params[:uploadform][:file].original_filename =~ /.\.csv$/i 
+0

まあ、これはあなたの問題を解決しましたか? [upvote /あなたの質問への回答を受け入れることを忘れないでください](http://meta.stackexchange.com/a/5235/158402)! –

+0

うーん、いいえ、残念ながらそうではありません。私はファイル "cities.csv"でテストしていますが、あなたの改善された正規表現でさえも、まだ通っていません。 – Fabian

+0

@FabianJahrちょうど何かを実現しました。私の更新された答えを見てください。 –

関連する問題