8

Ruby プロジェクトの csv ファイル (カンマ、スペース、またはセミコロン) で使用されている区切り文字を特定できる必要があります。Python の csv モジュールには、特定のファイルの区切り文字を推測するために使用できる Sniffer クラスがあります。Ruby でこれに似たものはありますか? どんな種類の助けやアイデアも大歓迎です。

4

3 に答える 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 に答える