🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

562閲覧

ruby nilについて

tkrd

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/01/25 07:34

編集2021/01/25 08:01

ご覧いただきありがとうございます。
Windows環境下でvs codeを用いてコードを書き、linuxサーバ上でプログラムを実行しています。

改行とスペースを一括削除したいため、strip!を用いているのですが、

’tap’ : undefined method ‘strip!’ for nil:NilClass(NoMethodError)

と出てしまいました。

windowsのコマンドプロンプト上では問題なく実行できます。

改行コードが違うことが原因なのかと思い、linuxの改行コードのLFに変更しましたがうまくいきませんでした。

何かお分かりになる方がいましたら教えていただけますと幸いです。

以下ソースコードになります。実現したいことは、生物のDNAの塩基配列情報から4連続の文字列がどれだけ含まれているかという頻度データをcsvファイルに出力することです。

Ruby

1コード 2### File-name: split_sequence_4serial_inference2.rb ### 3 4require 'csv' 5 6j = 0 7sum = 12 / 2 8not_print = [] 9count = 0 10label_count = 0 11string_count = 0 12 13File.open('output.data', 'w'){|out_file_name| 14 15 text = File.read('test2.csv') 16 17 text_1 = text.gsub(">", "") 18 text_1 = text_1.gsub(" ", "") 19 text_1 = text_1.gsub(/@.{36}/, "") 20 21 out_file_name.print(text_1) 22} 23 24File.open('output.data'){|file| 25 26 file.each_line{|line| 27 28 if (count%2==0)#((2<line.length)&&(line.length<20)) then 29 print count 30 print "\n" 31 label[label_count] = line 32 #label[label_count].chomp! 33 count += 1 34 label_count += 1 35 string_count += (line.length) 36 #print string_count 37 #print "\n" 38 elsif (count%2==1)#(line.length>20) 39 split_length = line.length 40 #print split_length 41 t_t_t_t = 0 42 t_t_t_c = 0 43 t_t_t_a = 0 44 ... #10000文字までしかコードを載せられないため省略 45 g_g_g_t = 0 46 g_g_g_c = 0 47 g_g_g_a = 0 48 g_g_g_g = 0 49 others = 0 50 i = 0 51 52 while i < split_length do 53 file.seek(string_count+i, IO::SEEK_SET) 54 dna_w = file.read(1) 55 #print dna_w 56 file.seek(string_count+i+1, IO::SEEK_SET) 57 dna_w2 = file.read(1) 58 #print dna_w2 59 file.seek(string_count+i+2, IO::SEEK_SET) 60 dna_w3 = file.read(1) 61 #print dna_w3 62 file.seek(string_count+i+3, IO::SEEK_SET) 63 dna_w4 = file.read(1) 64 #print dna_w4 65 #print j 66 case dna_w 67 68 #4連続塩基の頻度を算出する 69 when 'T' 70 71 if(dna_w2 == 'T') then 72 if(dna_w3 == 'T') then 73 if(dna_w4 == 'T') then 74 t_t_t_t += 1 75 elsif(dna_w4 == 'C') then 76 t_t_t_c += 1 77 elsif(dna_w4 == 'A') then 78 t_t_t_a += 1 79 elsif(dna_w4 == 'G') then 80 t_t_t_g += 1 81 end 82 elsif(dna_w3 == 'C') then 83 if(dna_w4 == 'T') then 84 t_t_c_t += 1 85 elsif(dna_w4 == 'C') then 86 t_t_c_c += 1 87 elsif(dna_w4 == 'A') then 88 t_t_c_a += 1 89 elsif(dna_w4 == 'G') then 90 t_t_c_g += 1 91 end 92 elsif(dna_w3 == 'A') then 93 if(dna_w4 == 'T') then 94 t_t_a_t += 1 95 elsif(dna_w4 == 'C') then 96 t_t_a_c += 1 97 elsif(dna_w4 == 'A') then 98 t_t_a_a += 1 99 elsif(dna_w4 == 'G') then 100 t_t_a_g += 1 101 end 102 elsif(dna_w3 == 'G') then 103 if(dna_w4 == 'T') then 104 t_t_g_t += 1 105 elsif(dna_w4 == 'C') then 106 t_t_g_c += 1 107 elsif(dna_w4 == 'A') then 108 t_t_g_a += 1 109 elsif(dna_w4 == 'G') then 110 t_t_g_g += 1 111 end 112 end 113 elsif(dna_w2 == 'C') then 114 if(dna_w3 == 'T') then 115 if(dna_w4 == 'T') then 116 t_c_t_t += 1 117 elsif(dna_w4 == 'C') then 118 t_c_t_c += 1 119 elsif(dna_w4 == 'A') then 120 t_c_t_a += 1 121 elsif(dna_w4 == 'G') then 122 t_c_t_g += 1 123 end 124 elsif(dna_w3 == 'C') then 125 if(dna_w4 == 'T') then 126 t_c_c_t += 1 127 elsif(dna_w4 == 'C') then 128 t_c_c_c += 1 129 elsif(dna_w4 == 'A') then 130 t_c_c_a += 1 131 elsif(dna_w4 == 'G') then 132 t_c_c_g += 1 133 end 134 elsif(dna_w3 == 'A') then 135 if(dna_w4 == 'T') then 136 t_c_a_t += 1 137 elsif(dna_w4 == 'C') then 138 t_c_a_c += 1 139 elsif(dna_w4 == 'A') then 140 t_c_a_a += 1 141 elsif(dna_w4 == 'G') then 142 t_c_a_g += 1 143 end 144 elsif(dna_w3 == 'G') then 145 if(dna_w4 == 'T') then 146 t_c_g_t += 1 147 elsif(dna_w4 == 'C') then 148 t_c_g_c += 1 149 elsif(dna_w4 == 'A') then 150 t_c_g_a += 1 151 elsif(dna_w4 == 'G') then 152 t_c_g_g += 1 153 end 154 end 155 ... #10000文字までしかコードを載せられないため省略 156 end 157 end 158 end 159 160 when 'C' #10000文字までしかコードが載せられないため省略 161 when 'A' 162 when 'G' 163 else 164 others += 1 165 end 166 i += 1 167 end 168 169 string_count += (line.length) 170 if((others == 0) || (others < (split_length * 5))) then 171 tttt[j] = t_t_t_t 172 tttc[j] = t_t_t_c 173 ttta[j] = t_t_t_a 174 ... #10000文字までしかコードを載せられないため省略 175 gggt[j] = g_g_g_t 176 gggc[j] = g_g_g_c 177 ggga[j] = g_g_g_a 178 gggg[j] = g_g_g_g 179 180 #print string_count 181 #print "\n" 182 #print count 183 count += 1 184 j += 1 185 186 else 187 #print j 188 #print "\n" 189 not_print[j] = 2 190 j += 1 191 end 192 end 193 } 194} 195 196 197 #csvファイルへの出力 198file = File.open('output.csv', 'w') 199 200 c = "," 201 k = "\n" 202 203 file.print 'label' 204 file.print c 205 file.print 'tttt' 206 file.print c 207 file.print 'tttc' 208 file.print c 209 file.print 'ttta' 210 file.print c 211 ... #10000文字までしかコードを載せられないため省略 212 file.print 'gggt' 213 file.print c 214 file.print 'gggc' 215 file.print c 216 file.print 'ggga' 217 file.print c 218 file.print 'gggg' 219 file.print k 220 221 j = 0 222 while j < sum do 223 label[j].tap(&:strip!) #eroor箇所 224 file.print label[j] 225 file.print c 226 file.print tttt[j] 227 file.print c 228 file.print tttc[j] 229 file.print c 230 file.print ttta[j] 231 file.print c 232 ... #10000文字までしかコードを載せられないため省略 233 file.print ggga[j] 234 file.print c 235 file.print gggg[j] 236 file.print k 237 238 j = j + 1 239 end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/25 07:43

実際のコードをご提示ください
tkrd

2021/01/25 08:02

申し訳ありませんでした。追記いたしました。
otn

2021/01/25 10:11

> label[j].tap(&:strip!) は、何を意図したコードですか?
tkrd

2021/01/25 10:15

label[j]には読み込んだcsvファイルの都合上、タブと改行を含んだ文字列が代入されるため、strip!でそれを削除したかったこと、.tapについては、strip!を用いた時にnilが返されてしまうため、それを回避しようとしたためにこうなりました。
guest

回答1

0

ベストアンサー

空白 タブ 改行 を削除したいなら stripではなくgsub(/\s/m,"") ではだめですか?それとも頭とお尻だけとる?
で、nilがありえるなら
label[j] = label[j] ? label[j].gsub(/\s/m,"") : ""
gsub! だとnilが返る事があるので a = a.gsub()

で、ですね、すみません。回答とは関係ないのですが、こういうのを見ると読みにくくて本質の所を見逃しそうに、、、
when 'T' if(dna_w2 == 'T') then if(dna_w3 == 'T') then if(dna_w4 == 'T') thenここが耐え難いです。
na = %w[T C G A]しておいて
dnalist = na.product(na).map(&:join).product(na).map(&:join).product(na).map(&:join)すると
["TTTT", "TTTC", "TTTG", "TTTA", "TTCT", "TTCC", "TTCG",,,,]ができますから
dna_w = file.read(4) して
dna = dnalist.include?(dna_w) ? dna_w : "other" dna_count[dna] += 1
そして
file.print 'label' file.print c file.print 'tttt'
のところは
file.print 'label,' file.print dnalist.join(",") TTTT となるのがまずければ file.print dnalist.join(",").downcase

の様に全体一目で見えるようにして、それで問題出たらまた質問してください

投稿2021/01/26 00:46

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問