青空文庫のルビを取るテキスト処理を習得してみよう
cFQ2f7LRuLYP.iconによる実況
目標
https://gyazo.com/9dc27a3d07dcb4f083ebd7adb688e154
テキストの状態
code:テキストファイル(ルビあり) 一部抜粋
歌の話
折口信夫
-------------------------------------------------------
【テキスト中に現れる記号について】
《》:ルビ
(例)歌《うた》
[#]:入力者注 主に外字の説明や、傍点の位置の指定
(例)[#6字下げ]
/\:二倍の踊り字(「く」を縦に長くしたような形の繰り返し記号)
(例)もつと/\
*濁点付きの二倍の踊り字は「/″\」
-------------------------------------------------------
[#6字下げ]歌《うた》の話《はなし》について[#「歌の話について」は中見出し]
この度《たび》、高濱虚子《たかはまきよし》さん・柳田國男先生《やなぎだくにをせんせい》[#ルビの「やなぎだくにをせんせい」はママ]と御一《ごいつ》しょに、この一部《いちぶ》の書物《しよもつ》を作《つく》ることになりました。その高濱《たかはま》さんの御領分《ごりようぶん》の俳句《はいく》と同樣《どうよう》に、短歌《たんか》といふものは、ほんとうに、日本國民《につぽんこくみん》自身《じしん》が生《う》み出《だ》したもので、とりわけ、きはめて古《ふる》い時代《じだい》に、出來上《できあが》つてゐたものであります。さうして、それが偶然《ぐうぜん》、私《わたし》の先生《せんせい》でもあり、またあなた方《がた》のこの文庫《ぶんこ》におけるおなじみでもある、柳田國男先生《やなぎだくにをせんせい》[#ルビの「やなぎだくにをせんせい」はママ]がお書《か》きの諺《ことわざ》の成《な》り立《た》ちとも、原因《げんいん》が竝行《へいかう》してゐるのは、不思議《ふしぎ》な御縁《ごえん》だとおもひます。
下二つの「囲まれているもの」を探知?して""に置き換えることができればよさそう
1. ルビは《 》で囲まれている
2. 入力者の注は[# ]で囲まれている
+1 よさそうnishio.icon
正規表現使えば一瞬で終わりそうな気がするMijinko_SD.icon 答えを言っても良いのかアレだけど
答えが知りたい人は「習得してみよう」ってタイトルのページを作らないと思うnishio.icon
あなたが「答え」だと思ってるものは「顧客の求めているもの」ではないと思う
なので顧客価値の提供という視点から見ると「答えを与える」は「不正解」だと思う
対面していないとアドバイスのタイミングが難しいな、まぁ、聞かれたら答えるくらいの緩い感じで見守るinajob.icon
今回の場合は遠回りになりそうtakker.icon
正規表現は慣れていないと混乱する
学習コストがそれなりに高い
高いけれど、学ぶだけの価値は十分にあると思うMijinko_SD.icon
使う機会がかなり多い
もちろんtakker.icon
+1Mijinko_SD.icon
正規表現!?謎の存在が出てきたcFQ2f7LRuLYP.icon
前教本で読んでて???ってなったやつだ
規則的に書かれたテキストを置換する時に使い勝手の良いやつですMijinko_SD.icon 例えば
行頭に1つだけタブを入れたい時
検索文字:^
置換後の文字:\t
この場合はこれだけで済みます
メールアドレスから@以降を取り除きたい時
検索:@.+
@とそれ以降の文字全てを対象にしている
文字全てを指定したい時に.+か.*を使えばいいというのは覚えて損はないです
.:何かしらの1文字
+:直前に指定したやつを1回以上繰り返す
*:直前に指定したやつを0回以上繰り返す
置換:(何も入れない)
よくわからないがすごいらしいのはわかった(わかってない)cFQ2f7LRuLYP.icon
cFQ2f7LRuLYP.iconがすぐに使えるプログラミング言語
ruby 3.1.0
前~~~にプログラミングをやろうとしていたときにインストールしていた
Rubyでルビを取るって/vim-jp-emojis/ダジャレ.iconbsahd.icon
もうユーザーフラッグが集まってきていて高まりを感じるcFQ2f7LRuLYP.icon
技量
プログラミングを始めようとして何度か失敗している程度の能力
目的がないのに手段を学んではならない
方針
ホールインワンを目指すな
プログラミングに慣れた人は最適解を知っているから、そっちを押し付けがち…Mijinko_SD.icon
これプログラミングだと大事な気がするのだがどうなんだろwogikaze.icon
完璧主義にも通じるけどとりあえず動くまでは奇麗なコードは意識しない方が良さげ なんでもいいからとりあえず解を出しておけば、最適解は後から生えてくると思うtakker.icon
しばらくしてからコードを見直すと、修正点が見つかって直したくなる
一度書いた文章を時間をおいて見直すと書き直したくなる奴
とはいえ、コードが小規模という条件付きではある
すんません言葉足らずでしたcFQ2f7LRuLYP.icon
ここでいうホールインワンは「青空文庫のテキストをそのままなんの失敗もなく目的のルビ処理ができる」という意味
これを目的に据えるべきでないと思う。特に「なんの失敗もなく」というあたり
cFQ2f7LRuLYP.iconは動かし方ばかり考えて手を動かすのを後にしがちなので
それを戒めておこうと思って「ホールインワンを狙うのはやめろ」と表現した
「初打でホールインワンを目指すのはやめろ」が意図としてただしい
なるほど。エラーなしで一発ゴールするのは目指さないということですねtakker.icon
ですです。プログラミングをまるで知らないので特に意識しとく必要があるcFQ2f7LRuLYP.icon
実験のメタファーでとらえるといいかもですね~takker.icon
いろんな場所で形を変えて言われていることだけど、だからこそ大事takker.icon
プログラミング言語はTry&Errorが早くできるからこう言う考えは大事そうですねinajob.icon
一方電子回路の設計などは、お金も発生するし、時間もかかるのでちょっとバランスを変えたりします
ホールインワン、とまではいかないけどデザインを何度も見直したり、前段の実験を大量に実施するとかして、基板を作る回数を減らそうとします
料理でも似てますねcFQ2f7LRuLYP.icon
本番の材料を使って失敗すると費用がかかるため、代用品で安く作ってみる
本当は鴨南蛮作りたいけど鶏胸肉で代用するとか
違う食材のため鴨の調理の経験値は貯まらない
失敗も経験の内なので失敗できる時はした方がいいMijinko_SD.icon ただし、心が折れない程度に程々に
ルビが1個だけ入っている文字列だけ切り出して変換してみる?takker.icon
よさそうcFQ2f7LRuLYP.iconnishio.icon
その次は「実際の1行を入れて処理してみる」だなnishio.icon
行を跨いでるタグはないと思うので。
これほんといいスローガンだな
進捗
インターバル
テキストファイルを参照したいけどどうやるか?
code:Ruby
# coding: utf-8
Encoding.default_internal = __ENCODING__
buf ="歌《うた》の話《はなし》"
buf2 = buf.gsub(/《.*?》/, "")
print buf2.gsub(/[.*?]/, "")
↑ここのbufに「テキストファイルの中身」を参照させたらいい
今の自分だと必要なファイルはすべてデスクトップ配下
入出力(in/out)ってやつだな
scrapbox.ioの.ioってなんなのかそういえば気になっていたのであった
esa.ioとか書くのを知っている
イギリス領インド洋地域のドメインらしいinajob.icon
たまたまin/outの略称と同じなので重宝されている
.tvも同じような理由で重宝されている
たのしいRubyの序盤3章に「ファイルからテキストデータを読み込んで表示する」があった(p.66)
code:Ruby
file = File.open(filename)
text = file.read
print text
file.close
いやーでもこれ見てそのまま写してもおもしろくないな
(そのまま写しても動かないのではと思うwnishio.icon)
何が面白くないのか?探索がないし仮説が立てられないからか?
なぜそうなるのかの答えがないからか?
公式ドキュメントではどのあたりにあるんだろう?
きっとこれだな
https://gyazo.com/0a00961b6e9abd962b03227ef8247892
まーたいろいろある
この辺も見ておくか
open
new(path, mode = "r", perm = 0666) -> File[permalink][rdoc][edit]
open(path, mode = "r", perm = 0666) -> File
open(path, mode = "r", perm = 0666) {|file| ... } -> object
path で指定されるファイルをオープンし、File オブジェクトを生成して返します。
path が整数の場合はファイルディスクリプタとして扱い、それに対応する File オブジェクトを生成して返します。IO.open と同じです。ブロックを指定して呼び出した場合は、File オブジェクトを引数としてブロックを実行します。ブロックの実行が終了すると、ファイルは自動的にクローズされます。ブロックの実行結果を返します。
つまり…どういうことだってばよ?
code:ruby
f = File.new("testfile", "r")
f.class # => File
f.close
f = File.open("testfile", "r")
f.class # => File
f.close
File.open("testfile", "w", 0755) { |f| f.print "test" }
File.read("testfile") # => "test"
File.newというのとFile.openというのがある
両者はどう違うんだろう
Fileクラスのメソッドである、というのはわかる
.gsubと書き方が同じだから
自分も今見たのですが、同じもののように見えますねinajob.icon
説明も同じだし、引数、返り値の型も同じ
「同じ動きをするためのコードは、できるだけ1つの方法でしか書けないようにする」という設計思想
「正しいやり方がいくつ存在してもよい」という考え方で、Perlの柔軟性を表しています
ふむふむcFQ2f7LRuLYP.icon
オブジェクトやインスタンスの項で名前が出たような~
読み込みモードと書き込みモードというのがある
モード……さては何か複数の形態で能力がちがうみたいなやつだな?
大気圏戦闘モードとか宙域戦闘モードとかそういうの
rはreadだろうしwはwriteなのはわかる
読み込み専用、書き込みOKみたいな処理なんかな(未解決問題)
既存のファイルをwriteモードで開いたら中身消えるから気をつけてねwnishio.icon
1hop先に書いてあった
"w", WRONLY|CREAT|TRUNC
ファイルを書き込みモードでオープンします。オープン時にファイルがすでに存在していればその内容を空にします。
ひー怖いcFQ2f7LRuLYP.icon
7. File.openを使って自分のデスクトップファイルを開いてみよう
open(path, mode = "r", perm = 0666) -> File
ということは
$ File.open()#←ここの()の中にディレクトリのURL(URLでいいのか?パスかな?)を入れておけばいいんだろう
インターネット上のものに対して言うらしいので、パスが良さそうyosider.icon
code:Ruby
File.open(C:\Users\Desktop\utano_hanashi_test.txt)#usersの間にはいろいろあるけどPCのディレクトリ構造が見えるので省略
構文エラーが出た!
あー、そもそもの書き方がおかしい?
code:ruby
f = File.open("testfile", "r")
f.class # => File
f.close
f=を入れないといけないのかな
いやいや、まずエラーメッセージを読めって言われてた
script.arb:9: syntax error, unexpected backslash, expecting ')'
script.arb:の9行目、構文エラー、予想外のバックスラッシュ。予期されるのは)
script.arb:9: syntax error, unexpected backslash, expecting end-of-input
script.arb:の9行目、構文エラー、予想外のバックスラッシュ。予期されるのはend-of-input
なるほど、バックスラッシュが入ってたりするのはおかしいんだな?
じゃあ消すか
code:Ruby
f = File.open(utano_hanashi_test.txt)
https://gyazo.com/fc466fef29b0b2f319296dd3bbfaeb3b
code:error
script.arb:9:in <main>': undefined local variable or method 'utano_hanashi_test' for main:Object (NameError)f = File.open(utano_hanashi_test.txt)`
script.arb:の9行目の中〈main〉未定義のローカル変数またはメソッドutano_hanashi_testのために主な:オブジェクト(名前エラー)
エラー語むずかしいぜ(未解決問題)
あれ、そういえば""つけてないじゃん
つけた。ついでに内容をprintしてみよ
code:Ruby
f = File.open("utano_hanashi_test.txt")
エラーは出なくなった!が、でたのがなんだかよくわからない文章
これは一体…?
https://gyazo.com/6e416c32cf7d848f9a8ee6e840a4f622
path で指定されるファイルをオープンし、File オブジェクトを生成して返します。
とあるのでFileオブジェクトが生成されているはず
このファイルオブジェクトを次に渡すんだろうな
次とは?
(ところで)うーん、このプロセス面白いな
今までGUIさんにおまかせしていた「ファイルを開く」という処理がいったいなんなのかを教えられている
+1yosider.icon
これ、低レイヤーに降りるたびに毎回思う羽目になりますwinajob.icon
今まで自分が基本ブロックだと思ってたのは、レゴの組み合わせだったのか!!!みたいな
https://gyazo.com/2dd88cd74af43ccb42825219724b5faa
https://gyazo.com/7e577c9f40b13d524d4b86bb137e8090
https://gyazo.com/090c0ad08866894341627bb802490b22
終わったあとにprintされる内容が毎回違う。不思議だ
これ明かしたらヤバいやつだったりするのか?パスワード朗詠漏洩とか
パスワード朗読会
パスワード詠唱!占い師.icon
大丈夫そうinajob.iconwogikaze.icon
一時的に作られたファイルオブジェクトのidみたいなものかな?
メモリ番地だったりもするけど
メモリ番地(初心者特有の聞き返し)cFQ2f7LRuLYP.icon ポインタとかって調べると色々出てきますが、Rubyを書く上ではあまり関係なさそうMijinko_SD.icon 🙏cFQ2f7LRuLYP.icon
(実質的に)ランダムな値が出ているだけなのであまり気にする必要はなさそうMijinko_SD.icon
厳密には理論とロジックに基づいていてランダムじゃないのかもしれないけれど、プログラムを書くだけの人がそこまで知る必要はないので実質ランダムです
ちょっと整理
今やりたいのはテキストファイルの中にある文字列を読み込むこと
読み込むとは?
どこに読み込むんだろう?メモリ?キャッシュ?
開くのはできている、はず……
i/oクラスにreadメソッド見つけた
read(length = nil, outbuf = "") -> String | nil
length バイト読み込んで、その文字列を返します。
引数 length が指定された場合はバイナリ読み込みメソッド、そうでない場合はテキスト読み込みメソッドとして動作します。既に EOF に達していれば nil を返します。ただし、length に nil か 0 が指定されている場合は、空文字列 "" を返します。例えば、open(空ファイル) {|f| f.read } は "" となります。
https://gyazo.com/a655c65f80eb25bb2713ff1820215e73
https://gyazo.com/0ba26dacc36d5c4e40a39698ece929da
10バイト読み込んでいる状態っぽい
これは日本語表示の問題(既出)では?inajob.icon
今このutano_hanashi_test.txtを見たらSHIFT-JISでエンコーディングされている(?)ようだった
エディタでファイルを保存する時に文字コードが選べるはずですinajob.icon
なるほどcFQ2f7LRuLYP.icon
https://gyazo.com/e7c1e0c17e38e2f8aae16fa57627b87f
ちゃんと出ました!!ありがとうございます!!cFQ2f7LRuLYP.icon
仮に数字のみのファイルtest.txtを作成し指定して動かしてみた
https://gyazo.com/1b5f8283fb7d484e91ac3d3265262614
https://gyazo.com/ad592318872a2b4cdcaeb55e7aa13d66
いい動きをしているね
この路線は間違ってなさそう
再開
今日のお供は大江千里 - Rain.icon
数字のみのファイルが読み込めて、テキストがうまく読み込めないのはなんでだろう?
数字/テキストという切り分けは適当でなさそうな予感が
buf.read(10)の意味があんまりよくわかっていないのだ(アライさん)
書いてあることをちゃんと読むか
read(length = nil, outbuf = "") -> String | nil
length バイト読み込んで、その文字列を返します。
引数 length が指定された場合はバイナリ読み込みメソッド、そうでない場合はテキスト読み込みメソッドとして動作します。既に EOF に達していれば nil を返します。ただし、length に nil か 0 が指定されている場合は、空文字列 "" を返します。例えば、open(空ファイル) {|f| f.read } は "" となります。 code:Ruby
read(length = nil, outbuf = "") -> String | nil
readメソッドには引数が二つある
1. length
なるほど!テキストファイルじゃないファイルのことなんですね!
となると上で引数10してるのはダメじゃん
テキストファイルなのにバイナリの読み込みをお願いしちゃってる
…数字のテキストのみファイルはバイナリファイル?それともテキストファイルなのか?
数字はテキストとして読み込んでもバイナリとして読み込んでも数字?yosider.icon
何進数で表示するかにもよるのかな
多分どっちも数字のはず...wogikaze.icon
https://gyazo.com/1b5f8283fb7d484e91ac3d3265262614
この辺から文字コードの話に入っていくみたい。今はスルーだ!
今回だとこれだね
2. outbuf
外バッファとは一体(先入観)
出力用のバッファを文字列で指定します。IO#read は読み込んだデータをその文字列オブジェクトに上書きして返します。指定した文字列オブジェクトがあらかじめ length 長の領域であれば、余計なメモリの割当てが行われません。指定した文字列の長さが length と異なる場合、その文字列は一旦 length 長に拡張(あるいは縮小)されたあと、実際に読み込んだデータのサイズになります。
🤔cFQ2f7LRuLYP.icon
既に EOF に達していれば nil を返します。 EOFってなんだろ
終端を示すコードなのかcFQ2f7LRuLYP.icon
また、プログラミング言語のファイル入出力機能などで、ファイル終端に達したことを表現する定数やシンボル、または、ファイル終端かどうかを検知する関数やメソッドなどの名称(の一部)としてEOFという表記が用いられる場合がある。
こっちのほうです。現在のファイルで、EOF(0x1A)が入ることはほとんどありません suto3.icon
なるほど、ありがとうございます!cFQ2f7LRuLYP.icon
要約する必要もなく書かれてるとおりだな……
これは制御コードのEOFとは直接は無関係であり、例えばC言語のgetchar関数などが終端に達した場合に返すEOF定数の値は-1と定義されている。
EOF = end of file
txtファイルを保存するときのエンコード設定がshift jisで、UTF-8と噛み合ってなかった(?)ために生じていた問題だった。
これでちゃんと記述できてるかな
次いこう
ファイルは閉じなくていいのかな。開けっ放しになって永遠に開き続けていたりしない?
いつまでも閉じられるのを待ち続けるファイルさんがいると思うとつらい
閉じる方法調べてみようか
ふむふむ
https://gyazo.com/8a8f4c136164bdfaa4de272e9eaf4436
これでファイルオープンと読み込みができる状態になったので、今度は青空文庫のテキストファイルを読み込んでみよう
https://gyazo.com/c450aabaa2ac8180c007a0d22be539d4
ギャあcFQ2f7LRuLYP.iconyosider.icon
文字コードめ!!!cFQ2f7LRuLYP.icon
https://i.gyazo.com/060076db5219d9c2ebd532dd879a5ec0.mp4
おお……cFQ2f7LRuLYP.icon
Hello, Worldだ……
/emoji/tada.iconyosider.icon
ひょっとして終盤まで来てる?
+1nishio.icon
そしたら、これまでの処理を組み合わせてみよう
https://gyazo.com/09cecd0055712570b2f0e62e1653176d
1. エンコードするよ(原理不明)
2. utano_hanashi.txtを読み取りモードで開いて変数bufに格納するよ
ここでFile.openを使っているので、変数bufに代入されているのはファイルオブジェクトである
3. bufを読み込むよ
bufをreadするとString型になる
read(length = nil, outbuf = "") -> String | nil
これってこう読むのか
4. bufにgsubメソッドを実行するよ
3.1 《》を""に置換するよ
3.2 置換した文字列を変数buf2に入れるよ
5. buf2にgsubメソッドを実行するよ
[]を""に置換するよ
ここも↑と同じように変数に入れたほうがいいかも?yosider.icon
6. buf2を表示するよ
7. bufを閉じるよ
ここ微妙。buf2を閉じるべきかbufを閉じるべきか
最初開いてるのはbufなんだし閉じるのもbufだろう。やったれ!
やった
https://gyazo.com/ffc0681febd67b51020210a35a8dc03c
七行目のgsubが未定義のメソッドですよ
へ~??cFQ2f7LRuLYP.icon
アレだなあ、buf.readからbuf.gsubに行くのが何かおかしいみたい
複数のメソッドを経由した場合ってどういうふうに表記するんだろう?
gsub buf.readか?
buf.read.gsubyosider.icon
あるいは、buf.readを一旦なにか変数に代入してもいい
こうか?
https://gyazo.com/55d48a52d587e2ac8a89a9ab6bab4bfb
https://gyazo.com/9cd8b26118025567fc7763c0c50ac64c
ほーーーん
こんどはbuf2がおかしくなった
未定義のローカル変数かメソッドですよ、buf2は。bufのことを言いたいんですか?
書き方がおかしいのではないか
◯:buf = file.open
✕:buf2.gsub = buf.read
gsubメソッドを持っているのは、buf (ファイルオブジェクト)ではなく buf.read (String)?yosider.icon
質問にどう答えたらいいのか困ってしまいましたcFQ2f7LRuLYP.icon
gsubメソッドを持っているのは、buf (ファイルオブジェクト)ではなく buf.read (String)?
これの解読から始めないといけない
gsubメソッドを持つとは(哲学)
methodはオブジェクトが持っている関数みたいなもの(説明下手)yosider.icon
オブジェクト名.メソッド名でアクセスできる
例えばf.readって言うとfにreadメソッドを適用した状態になってる、ということですかねcFQ2f7LRuLYP.icon
そうです!yosider.icon
「fにreadメソッドを適用した」というと、新しいバージョンのf (ファイルオブジェクト)が出力されるように聞こえるけど、実際はメソッド適用結果の型が元と同じ型とは限らない
String型が帰ってくると思ったら、nilが返ってくることもあるということか(オウム返し戦法)cFQ2f7LRuLYP.icon
これが世に名高いオブジェクト指向ってやつなんですか???cFQ2f7LRuLYP.icon です(たぶん)yosider.icon
アホ(というか素朴な)な質問をされると回答者の理解のなさが露呈する…wyosider.icon
となると、今回はbuf.readにgsubを適用していきたいわけで……
buf.read.gsub←これは違いそう
あ、違ったのか…yosider.icon
gsub buf.read←これはよさそう
質問というか、自分もRubyは知らないですがこうじゃないですかね~くらいの気持ちyosider.icon
あーなるほど、すみませんですcFQ2f7LRuLYP.icon
こちらこそyosider.icon
ここで中断cFQ2f7LRuLYP.icon
多分メソッドの書き方が悪い。教本を見て複数のメソッドを経由した場合の書き方を思い出そう
今のscript.arbは動作してた形から書き換わっている。もとに戻すには過去のキャプチャをみてもう一度打ち直すしか無い。かUndo使おうね
次はgitを使おう(高いハードル)
Undoで戻せるかも?yosider.icon
戻せました!!!ありがとうございますcFQ2f7LRuLYP.icon
どこにコメントつけるか悩むnishio.icon
ここまでのプレイログを見てからのコメントだからここでいいかな、適当なところに移動してもいいです
さて、迷子になってウロウロすることは良い学びの機会なんだけど、道を間違えたポイントを一応指摘しておくと
金取れるコンテンツ感あるinajob.icon
享受してしまっていていいのかしらcFQ2f7LRuLYP.icon
井戸端内でgive&takeって感じ?inajob.icon
崩字が読めるようになったことで楽しみが増えたのでお返しですwwnishio.icon
あとまあ単純に面白い。僕が崩字を読めるようになってく過程を見てて思ったことと同じことを思ってますw
ありがてぇ……ありがてぇ……cFQ2f7LRuLYP.icon
確かにこの方式教える側にもエンタメ性がある気がするinajob.icon
bufを読み込むよ
buf.read
ここだなーと思いました
それをbufと呼んでるところから推測するとbufが文字列であるかのように思ってるかもしれないけど、openの返り値はファイルオブジェクト。
ファイルオブジェクトにgsubはないからこうなる
https://gyazo.com/ffc0681febd67b51020210a35a8dc03c
七行目のgsubが未定義のメソッドですよ
エラーメッセージは「Fileオブジェクトにgsubなんてないよ」と言っている
なるほどcFQ2f7LRuLYP.icon
クラスにメソッドがなかったのか
ファイルオブジェクトをstring型オブジェクトに変えることができるといいのかな
入り口まではもう来てるnishio.icon
もっかい見直すか~cFQ2f7LRuLYP.icon
https://gyazo.com/09cecd0055712570b2f0e62e1653176d
1. エンコードするよ(原理不明)
2. utano_hanashi.txtを読み取りモードで開いて変数bufに格納するよ
ここでFile.openを使っている
1. ここがnishio.iconさんから指摘あった通り、変数bufに代入されているのはファイルオブジェクトである
2. ファイルオブジェクトはStringオブジェクトではない
3. bufを読み込むよ
ここがnishio.iconさんから指摘あった箇所
道を間違えたポイントを一応指摘しておくと
bufを読み込むよ
buf.read
ここだなーと思いました
read(length = nil, outbuf = "") -> String | nil
readメソッドを実行すると、String型またはnilで返す
readメソッドはi/oクラス
ioクラスとファイルクラスってどんな関係なんだ???(脱線志向) 後述しますが、FileクラスはIOクラスを継承しています。
継承は見たことあるぞ
クラスの共通部分を別クラスにまとめる仕組みだった
ここ余り深入りしないほうがいいな
https://gyazo.com/0ee5e0f21b44c7151a7b342bd5888020https://gyazo.com/b3fcb30ac3fcf36277b3e2a3cacb0832
仮に上のようにしたらちゃんと文字列が出た
あー、このbuf.readの生成物(インスタンス?)を変数に格納したらいいのかな
やってみよ
https://gyazo.com/6592f8dd3035a7e68f62c5795d06dfdbhttps://gyazo.com/e72ae87e7fdcc9b1488833673afbce60
あ、できた(終了)
4. bufにgsubメソッドを実行するよ
3.1 《》を""に置換するよ
3.2 置換した文字列を変数buf2に入れるよ
5. buf2にgsubメソッドを実行するよ
[]を""に置換するよ
ここも↑と同じように変数に入れたほうがいいかも?yosider.icon
今そのままprintしてるし、一回変数に入れてみよう
6. buf2を表示するよ
7. bufを閉じるよ
code:ruby
# coding: utf-8
Encoding.default_internal = __ENCODING__
buf = File.open("utano_hanashi.txt","r")
text = buf.read
buf2 = text.gsub(/《.*?》/, "")
print buf2.gsub(/[.*?]/, "")
buf.close
できたはできた……
が、Scrapboxにコピーするときに行頭の全角スペース が気になるな
これも取るか
正規表現カモン!
行頭は^だった
ありがとう、過去ログ……
code:ruby
Encoding.default_internal = __ENCODING__
text = File.open("utano_hanashi.txt","r")
buf = text.read
buf2 = buf.gsub(/《.*?》/, "")
buf3 = buf2.gsub(/[.*?]/, "")
buf4 = buf3.gsub(/^ /, "")
print buf4
text.close
うおーできたーcFQ2f7LRuLYP.icon
本当は出力のテキストファイルを作るとかいろいろ拡張があるのだろうけど
目標を達成したのでとりあえずこれでよしか……
/emoji/tada.iconyosider.icon*2wogikaze.icon*2inajob.icon
謝辞
nishio.iconinajob.iconsuto3.iconyosider.icontakker.iconMijinko_SD.iconwogikaze.icon皆さん
アドバイスありがとうございましたー。ほんと助かりました!!!cFQ2f7LRuLYP.icon
終わった後の目標
このページとは何ら関係がないが……
ScrapboxでTRPGやるときに使えそうなのだ
もう解決されてしまったかもしれない
正規表現を使わず、同じ処理を行うスクリプトを作ってみよう
出力ファイルを作ってみよう
別のファイルを入力できるようにしよう
この約定を果たさねば
旧字を現行通用の字に変えたい
できるんかこれ?
強いcFQ2f7LRuLYP.icon
簡単に使えるようなコードは見つからなかったwogikaze.icon
開発ツールのデバッガ経由じゃないと見れない
このコードをpythonに変換すれば作れる
UserScriptならちょこちょこ手直しすればいい
丸パクリしていいのかと言われるとなんとも……
一覧が下に乗ってるので置換すればいける
感想欄
面白いnishio.icon
Outer Wild的にいえば謎解きの鍵になる場所にはたどり着いてるけど、それが謎解きの鍵だとはまだ気づいてない感じ
正規表現のネタバレがいい感じにオーパーツ扱いになってて面白いinajob.icon
長過ぎるページになってしまった、どうしよう
切り出しできるとこを切り出す?
2つほど本流ではないところを切り出したnishio.icon
本質的にはOuterWildsプレイ日記みたいなもの(=あっちこっち迷子になってる過程の時系列ログ)だから時間軸で分割するしかないのでは
整理された知識構造にはなってないから
気が向いたらメタ・ノート的に、面白いところだけ抜き出して整理したページを作ってもいいかも 面白そうyosider.icon
🙏cFQ2f7LRuLYP.icon
お、重いwyosider.icon
すみません!終わったら切ります!!cFQ2f7LRuLYP.icon
この重さがまた祭り感あるんだよなあ…(ドM)yosider.icon 大きめのパートを切り出したcFQ2f7LRuLYP.icon
https://gyazo.com/ad3a55c7a734737dd90504616c68ac3a
516行らしいMijinko_SD.icon
ソースコードが含まれるページはどうしても重くなりがち
バルス.iconの存在感cFQ2f7LRuLYP.icon