Ruby プロジェクトの csv ファイル (カンマ、スペース、またはセミコロン) で使用されている区切り文字を特定できる必要があります。Python の csv モジュールには、特定のファイルの区切り文字を推測するために使用できる Sniffer クラスがあります。Ruby でこれに似たものはありますか? どんな種類の助けやアイデアも大歓迎です。
4265 次
3 に答える
13
py の実装は、いくつかの方言 (excel または excel_tab) をチェックするだけのようです。したがって、単にチェックするか、","
またはあるものの単純な実装は次の"\t"
とおりです。
COMMON_DELIMITERS = ['","',"\"\t\""].freeze
def sniff(path)
first_line = File.open(path).first
return unless first_line
snif = {}
COMMON_DELIMITERS.each do |delim|
snif[delim] = first_line.count(delim)
end
snif = snif.sort { |a,b| b[1]<=>a[1] }
snif[0][0] if snif.size > 0
end
注: これは、検出した完全な区切り文字を返します。たとえば","
、 を取得するには、を に,
変更できます。snif[0][0]
snif[0][0][1]
また、count(delim)
少し速いので使っていますが、 のよう--
に同じ型の 2 つ (またはそれ以上) の文字で構成される区切り文字を追加すると、型を比較するときにそれぞれ 2 回 (またはそれ以上) 出現する可能性があります。ですので、その場合は を使ったほうがいいかもしれませんscan(delim).length
。
于 2013-02-04T20:47:23.290 に答える
2
Ruby 1.9 に含まれる CSV ライブラリにスニファーが実装されていることは知りません。行セパレーターを自動検出しようとしますが、列セパレーターはデフォルトでコンマであると想定されます。
考えられる 1 つのアイデアは、考えられる各区切り記号を使用して、行のサンプル数 (全体の 5% でしょうか?) を解析することです。最も一貫して同じ列数になる区切り記号は、おそらく正しい区切り記号です。
于 2013-02-04T20:18:35.533 に答える