4

私のRails3アプリは、ユーザーがアップロードしたCSVファイルを解析します。
予想どおり、ユーザーはタブ区切りファイルとコンマ区切りファイルをアップロードします。
両方をサポートしたいです。

私のコード:

input = CSV.read(uploaded_io.tempfile, { encoding: "UTF-8", :col_sep => "\t"})

質問:コンマもサポートするように変更するにはどうすればよいですか?

FasterCSVのドキュメントでは、col_sepは機能しThe String placed between each field.ない:col_sep => ",\t"と説明されています。

注:内部のすべてのデータは整数または識別子であるため、誰かがコンテンツ(区切り文字ではない)を使用\tまたは,コンテンツ内で使用する可能性はゼロです。したがって、同じファイルで2つの異なる区切り文字を使用することは、私が明確に防止したいことではありません。

4

3 に答える 3

4

解決策 1:

これを行う簡単な方法の 1 つは、ユーザーが CSV ファイルで使用する区切り記号をドロップダウンで選択できるようにし、CSV.read()呼び出しでその値を設定することです。しかし、私はあなたがそれを自動にしたいのだと思います。:-)

解決策 2:

通常のCSVファイルの最初の行を読み込み、最初の行をFile.read()照合して分析することが/,/できます... RegExpが一致するかどうかに応じて、一致する(単一の)セパレータへ/\t/の呼び出しでセパレータを選択します。CSV.read()次に、それに応じてファイルを読み込みますCSV.read(..., :col_sep => single_separator )

しかし、注意してください:

最初は、メソッド呼び出しでセパレータとして使用して両方を許可するのは素晴らしくエレガントに見えます",\t"が、これにより厄介なバグが発生する可能性があることに注意してください!

CVS ファイルにタブとカンマの両方が偶然またはたまたま含まれていた場合、どうしますか? 両方で分ける?どうすれば確信できますか?通常の CSV ファイルでは、CSV セパレーターがこのように「混在」して表示されないため、これは間違いだと思います','"\t"

だから私はあなたが使用すべきではないと思います-- それは大きな問題を引き起こす可能性があり、それがおそらく彼らがRegExpを受け入れるオプションを",\t"実装/許可しなかった理由です。col_sep

于 2011-10-20T07:18:20.973 に答える
0

残忍な解決策:

require 'csv'
csv= CSV.new("some_file")
csv.instance_variable_set(:@col_sep, /[\t,]/)
于 2011-10-20T10:10:53.340 に答える