8

データベース クエリから結果の大きなハッシュを取得し、それらを csv ファイルに書き込んでいます。以下のコード ブロックは、結果を取得して CSV を作成します。このquote_char:オプションを使用すると、引用符が NULL 文字に置き換えられます。これは、タブ区切りファイルを適切に作成するために必要です。

ただし、NULL 文字は、宛先にロードされるときに "" に変換されるため、それらを削除したいと思います。省略した場合quote_char:、すべてのフィールドが二重引用符で囲まれ、同じ結果になります。

NULL 文字を削除するにはどうすればよいですか?

begin
    CSV.open("#{file_path}"'file.tab', "wb", Options = {col_sep: "\t", quote_char: "\0"}) do |csv|
        csv << ["Key","channel"]           
        series_1_results.each_hash do |series_1|
         csv << ["#{series_1['key']}","#{series_1['channel']}"]
        end
    end
end
4

4 に答える 4

3

Ruby CSV docsからforce_quotes: false、オプションの設定は機能しているようです。

CSV.open("#{file_path}"'file.tab', "wb", { col_sep: "\t", force_quotes: false }) do |csv|

上記はトリックを行います。期待どおりに機能しないため、に設定quote_charしないことをお勧めします。\0

ただし、注意すべき点が 1 つあります。フィールドが空の文字列の場合、""強制的にquote_charCSV に出力されます。しかし奇妙なことに、nil値はそうではありません。データに空の文字列が含まれていると予想される場合は、CSV への書き込み時に何らかの形で変換することをお勧めしますnil(おそらく ActiveSupportpresenceメソッドなどを使用します)。

于 2013-05-19T19:53:02.583 に答える
1

入力にエスケープが必要なデータ (列区切りや引用符など) が含まれている場合は、データを引用する必要があります。そうしないと、後で正しく解析できません。

CSV.open('test.csv', 'wb', col_sep: "\t") do |csv|
  csv << ["test", "'test'", '"test"', nil, "test\ttest"]
end

puts open('test.csv').read
#test    'test'  """test"""              "test   test"

CSV クラスは不必要に何も引用しません (上記を参照)。したがって、すべてのフィールドが引用されていると言っている理由がわかりません。どういうわけforce_quotesかどこかで true に設定されている可能性があります。

データにまたはが絶対に含まれないことが確実な場合は、デフォルト( ) で問題なく動作するはずです。それ以外の場合、何かを引用することを避けたい場合は、データに絶対に発生しないことが確実な別の引用文字を選択する必要があります。\t"quote_char"

CSV.open('test.csv', 'wb', col_sep: "\t", quote_char: "|") do |csv|
  csv << ["test", "'test'", nil, '"test"']
end

puts open('test.csv').read
#test    'test'          "test"
于 2013-05-17T06:30:53.513 に答える
1

まず、タブ区切りファイルは「TSV」で、コンマ区切りファイルは「CSV」です。

フィールド内にフィールド区切り文字が出現する可能性がある場合は常に、フィールドを引用符で囲む必要があります。

たとえば、この文字列をタブ区切りファイルに埋め込むにはどうすればよいでしょうか?

Foo\tbar

\t、埋め込まれた の表現ですTab

カンマを含むフィールドを含む CSV ファイルを書き込むときにも、同じ問題が発生します。フィールド自体を区切るには、フィールドを二重引用符で囲む必要があります。

于 2013-05-10T07:28:14.890 に答える