2016-08-03 4 views
4

writetableを使用してファイルにデータフレーム内の文字列を記述するためのデフォルトは、それらが引用符で囲まれていることである。Juliaでwritetable()をDataFrames.jlとともに使用するときに、文字列を引用符で出力しないでください。

using DataFrames 
df = DataFrame(letters=["A","B","C"],numbers=[1,2,3]) 
writetable("df_file", df, separator='\t') 

は、次のファイルを生成します。

"letters" "numbers" 
"A" 1 
"B" 2 
"C" 3 

をquotemarkを変更するためのオプションがありますキャラクター:

writetable("df_file", df, separator='\t', quotemark='.') 

.letters. .numbers. 
.A. 1 
.B. 2 
.C. 3 

が、何の文字が

を指定されていない場合、これは動作しません。
writetable("df_file", df, separator='\t', quotemark='') 
ERROR: syntax: invalid character literal 

私の質問は次のとおりです。引用符文字を一切使わずに文字列を書くにはどうすればよいですか?これは私が必要とする出力です:

letters numbers 
A 1 
B 2 
C 3 

私は現在、Juliaバージョン0.4.1、DataFramesパッケージバージョン0.6.10を使用しています。

答えて

3

このGitHubによると、DataFramesパッケージの作成者は、 。彼らの出力の上に

私の個人的な勧告は、ちょうどArrayに変換することで、次に使用するジュリアさんは、彼らがファイルに書き込みたいかを知るために信頼ユーザーを行いwritedlm()

writedlm(FileName, convert(Array,df), '\t') 

含めるように、あなたはこのようなものを使用することができ、ヘッダデ:

open(FileName, "w") do f 
    writedlm(f, names(df)', '\t') 
    writedlm(f, convert(Array,df), '\t') 
end 

をも同様の答えとのこの関連する質問を参照してください。このためIs there a way to use strings as separators in writetable() - Julia

+0

感謝を - 引用符を削除するオプションはありません理由を説明すること、少なくとも。あなたの回避策は私のために働く。 –

+0

@IanMarshallええ、そういうパッケージを書くのは私の選択ではありませんでしたが、著者は非常に賢い人であり、彼らは非常に一般的な聴衆を目指していると思います。 –

3
私はちょうどこのようにやや急ごしらえを書くように誘惑されるだろう

julia> n, p = size(df) 
(3,2) 

julia> open("/tmp/df_file.txt", "w") do f 
      for i in 1:n 
       for j in 1:p 
        write(f, string(df[i, j])) 
        write(f, "\t") 
       end 
       write(f, "\n") 
      end 
     end 

または私はより多くの時間を持っていた場合、私はこのような何か(writetable機能のソースの修正版を)書き始めるかもしれません。ただStringにシャアからquotemarkを変更

julia> function myprinttable(io::IO, 
          df::AbstractDataFrame; 
          header::Bool = true, 
          separator::Char = ',', 
          quotemark::AbstractString = "\"", 
          nastring::AbstractString = "NA") 
      n, p = size(df) 
      etypes = eltypes(df) 
      if header 
       cnames = DataFrames._names(df) 
       for j in 1:p 
        print(io, quotemark) 
        print(io, cnames[j]) 
        print(io, quotemark) 
        if j < p 
         print(io, separator) 
        else 
         print(io, '\n') 
        end 
       end 
      end 
      quotestr = quotemark 
      for i in 1:n 
       for j in 1:p 
        if ! (isna(df[j],i)) 
         if ! (etypes[j] <: Real) 
          print(io, quotemark) 
          DataFrames.escapedprint(io, df[i, j], quotestr) 
          print(io, quotemark) 
         else 
          print(io, df[i, j]) 
         end 
        else 
         print(io, nastring) 
        end 
        if j < p 
         print(io, separator) 
        else 
         print(io, '\n') 
        end 
       end 
      end 
      return 
     end 
julia> open("/tmp/df_file.txt", "w") do f 
      myprinttable(f, df, header=true, separator='\t', quotemark="") 
     end 

(主にテストされていない。)

。 (私はまだ、特定の場所で1文字の文字列の代わりにJuliaのCharの使用に慣れています。

関連する問題