generated at
青空文庫のルビを取るテキスト処理を習得してみよう


cFQ2f7LRuLYPによる実況
ほぼはじめてのおつかいをやっているようなもの


目標
https://www.aozora.gr.jp/cards/000933/card50194.html#downloadにあるテキストファイル(ルビあり)のルビを外して歌の話 (折口信夫)にペーストする
テキストの状態
テキストファイル(ルビあり) 一部抜粋
歌の話 折口信夫 ------------------------------------------------------- 【テキスト中に現れる記号について】 《》:ルビ (例)歌《うた》 [#]:入力者注 主に外字の説明や、傍点の位置の指定 (例)[#6字下げ] /\:二倍の踊り字(「く」を縦に長くしたような形の繰り返し記号) (例)もつと/\ *濁点付きの二倍の踊り字は「/″\」 ------------------------------------------------------- [#6字下げ]歌《うた》の話《はなし》について[#「歌の話について」は中見出し]  この度《たび》、高濱虚子《たかはまきよし》さん・柳田國男先生《やなぎだくにをせんせい》[#ルビの「やなぎだくにをせんせい」はママ]と御一《ごいつ》しょに、この一部《いちぶ》の書物《しよもつ》を作《つく》ることになりました。その高濱《たかはま》さんの御領分《ごりようぶん》の俳句《はいく》と同樣《どうよう》に、短歌《たんか》といふものは、ほんとうに、日本國民《につぽんこくみん》自身《じしん》が生《う》み出《だ》したもので、とりわけ、きはめて古《ふる》い時代《じだい》に、出來上《できあが》つてゐたものであります。さうして、それが偶然《ぐうぜん》、私《わたし》の先生《せんせい》でもあり、またあなた方《がた》のこの文庫《ぶんこ》におけるおなじみでもある、柳田國男先生《やなぎだくにをせんせい》[#ルビの「やなぎだくにをせんせい」はママ]がお書《か》きの諺《ことわざ》の成《な》り立《た》ちとも、原因《げんいん》が竝行《へいかう》してゐるのは、不思議《ふしぎ》な御縁《ごえん》だとおもひます。
下二つの「囲まれているもの」を探知?して "" に置き換えることができればよさそう
1. ルビは で囲まれている
2. 入力者の注は [# で囲まれている
+1 よさそうnishio
正規表現使えば一瞬で終わりそうな気がするMijinko_SD
答えを言っても良いのかアレだけど
答えが知りたい人は「習得してみよう」ってタイトルのページを作らないと思うnishio
あなたが「答え」だと思ってるものは「顧客の求めているもの」ではないと思う
なので顧客価値の提供という視点から見ると「答えを与える」は「不正解」だと思う
対面していないとアドバイスのタイミングが難しいな、まぁ、聞かれたら答えるくらいの緩い感じで見守るinajob
今回の場合は遠回りになりそうtakker
正規表現は慣れていないと混乱する
学習コストがそれなりに高い
高いけれど、学ぶだけの価値は十分にあると思うMijinko_SD
使う機会がかなり多い
もちろんtakker
なので青空文庫のルビを取るテキスト処理を習得してみよう#637837725e90c000003befb8が終わったあとに、正規表現による書き換えをやるといいかも(次の目標)
+1Mijinko_SD
正規表現!?謎の存在が出てきたcFQ2f7LRuLYP
前教本で読んでて???ってなったやつだ
規則的に書かれたテキストを置換する時に使い勝手の良いやつですMijinko_SD
例えば
行頭に1つだけタブを入れたい時
検索文字: ^
置換後の文字: \t
この場合はこれだけで済みます
メールアドレスから@以降を取り除きたい時
検索: @.+
@ とそれ以降の文字全てを対象にしている
文字全てを指定したい時に .+ .* を使えばいいというのは覚えて損はないです
. :何かしらの1文字
+ :直前に指定したやつを1回以上繰り返す
* :直前に指定したやつを0回以上繰り返す
置換: (何も入れない)
よくわからないがすごいらしいのはわかった(わかってない)cFQ2f7LRuLYP
/shokai/行頭に引用符を付けるUserScriptのスクリプトで見た /\n/ ってのは正規表現だったんだ!と気づいた
cFQ2f7LRuLYPがすぐに使えるプログラミング言語
ruby 3.1.0
前~~~にプログラミングをやろうとしていたときにインストールしていた
Rubyでルビを取るってダジャレbsahd
Pythonの本は持ってるがインストールしてない
もうユーザーフラッグが集まってきていて高まりを感じるcFQ2f7LRuLYP
技量
プログラミングを始めようとして何度か失敗している程度の能力
目的がないのに手段を学んではならない
方針
ホールインワンを目指すな
プログラミングに慣れた人は最適解を知っているから、そっちを押し付けがち…Mijinko_SD
これプログラミングだと大事な気がするのだがどうなんだろwogikaze
完璧主義にも通じるけどとりあえず動くまでは奇麗なコードは意識しない方が良さげ
なんでもいいからとりあえず解を出しておけば、最適解は後から生えてくると思うtakker
しばらくしてからコードを見直すと、修正点が見つかって直したくなる
一度書いた文章を時間をおいて見直すと書き直したくなる奴
推敲かな?
とはいえ、コードが小規模という条件付きではある
(大規模なコードでも、スクラップ&ビルドするのを躊躇わないのなら可)
すんません言葉足らずでしたcFQ2f7LRuLYP
ここでいうホールインワンは「青空文庫のテキストをそのままなんの失敗もなく目的のルビ処理ができる」という意味
これを目的に据えるべきでないと思う。特に「なんの失敗もなく」というあたり
cFQ2f7LRuLYPは動かし方ばかり考えて手を動かすのを後にしがちなので
それを戒めておこうと思って「ホールインワンを狙うのはやめろ」と表現した
他の人も手戻りを恐れるなという話をしていた
初打でホールインワンを目指すのはやめろ」が意図としてただしい
なるほど。エラーなしで一発ゴールするのは目指さないということですねtakker
ですです。プログラミングをまるで知らないので特に意識しとく必要があるcFQ2f7LRuLYP
実験のメタファーでとらえるといいかもですね~takker
いろんな場所で形を変えて言われていることだけど、だからこそ大事takker
プログラミング言語はTry&Errorが早くできるからこう言う考えは大事そうですねinajob
一方電子回路の設計などは、お金も発生するし、時間もかかるのでちょっとバランスを変えたりします
ホールインワン、とまではいかないけどデザインを何度も見直したり、前段の実験を大量に実施するとかして、基板を作る回数を減らそうとします
料理でも似てますねcFQ2f7LRuLYP
本番の材料を使って失敗すると費用がかかるため、代用品で安く作ってみる
本当は鴨南蛮作りたいけど鶏胸肉で代用するとか
違う食材のため鴨の調理の経験値は貯まらない
失敗も経験の内なので失敗できる時はした方がいいMijinko_SD
ただし、心が折れない程度に程々に
ルビが1個だけ入っている文字列だけ切り出して変換してみる?takker
よさそうcFQ2f7LRuLYPnishio
その次は「実際の1行を入れて処理してみる」だなnishio
行を跨いでるタグはないと思うので。
これほんといいスローガンだな

進捗

インターバル
テキストファイルを参照したいけどどうやるか?
Ruby
# coding: utf-8 Encoding.default_internal = __ENCODING__ buf ="歌《うた》の話《はなし》" #gsubを使う buf2 = buf.gsub(/《.*?》/, "") print buf2.gsub(/[.*?]/, "")
↑ここの buf に「テキストファイルの中身」を参照させたらいい
今の自分だと必要なファイルはすべてデスクトップ配下
入出力(in/out)ってやつだな
scrapbox.io .io ってなんなのかそういえば気になっていたのであった
esa.io とか書くのを知っている
イギリス領インド洋地域のドメインらしいinajob
たまたまin/outの略称と同じなので重宝されている
.tv も同じような理由で重宝されている
たのしいRubyの序盤3章に「ファイルからテキストデータを読み込んで表示する」があった(p.66)
Ruby
filename = ARG[0] file = File.open(filename) text = file.read print text file.close
いやーでもこれ見てそのまま写してもおもしろくないな
(そのまま写しても動かないのではと思うwnishio)
何が面白くないのか?探索がないし仮説が立てられないからか?
なぜそうなるのかの答えがないからか?
公式ドキュメントではどのあたりにあるんだろう?
きっとこれだな
まーたいろいろある
この辺も見ておくか
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 オブジェクトを引数としてブロックを実行します。ブロックの実行が終了すると、ファイルは自動的にクローズされます。ブロックの実行結果を返します。
つまり…どういうことだってばよ?
ruby
#File.new による読み込みモードでのファイルオープン f = File.new("testfile", "r") f.class # => File f.close #File.open による読み込みモードでのファイルオープン f = File.open("testfile", "r") f.class # => File f.close #File.open による書き込みモードでのファイルオープン File.open("testfile", "w", 0755) { |f| f.print "test" } File.read("testfile") # => "test"
File.new というのと File.open というのがある
両者はどう違うんだろう
File クラスのメソッドである、というのはわかる
.gsub と書き方が同じだから
自分も今見たのですが、同じもののように見えますねinajob
説明も同じだし、引数、返り値の型も同じ
同じことをする複数の表現がある、というのは結構よくある気がする
> 「同じ動きをするためのコードは、できるだけ1つの方法でしか書けないようにする」という設計思想
>「正しいやり方がいくつ存在してもよい」という考え方で、Perlの柔軟性を表しています
ふむふむcFQ2f7LRuLYP
オブジェクトやインスタンスの項で名前が出たような~
読み込みモードと書き込みモードというのがある
モード……さては何か複数の形態で能力がちがうみたいなやつだな?
大気圏戦闘モードとか宙域戦闘モードとかそういうの
r read だろうし w write なのはわかる
読み込み専用、書き込みOKみたいな処理なんかな(未解決問題)
既存のファイルをwriteモードで開いたら中身消えるから気をつけてねwnishio
1hop先に書いてあった
>"w", WRONLY|CREAT|TRUNC
> ファイルを書き込みモードでオープンします。オープン時にファイルがすでに存在していればその内容を空にします。
ひー怖いcFQ2f7LRuLYP.icon

7. File.open を使って自分のデスクトップファイルを開いてみよう
> open(path, mode = "r", perm = 0666) -> File
ということは
$ File.open()#←ここの()の中にディレクトリのURL(URLでいいのか?パスかな?)を入れておけばいいんだろう
インターネット上のものに対して言うらしいので、パスが良さそうyosider
Ruby
File.open(C:\Users\Desktop\utano_hanashi_test.txt)#usersの間にはいろいろあるけどPCのディレクトリ構造が見えるので省略
構文エラーが出た!
あー、そもそもの書き方がおかしい?
ruby
#File.open による読み込みモードでのファイルオープン 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
なるほど、バックスラッシュが入ってたりするのはおかしいんだな?
じゃあ消すか
Ruby
f = File.open(utano_hanashi_test.txt)
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 してみよ
Ruby
f = File.open("utano_hanashi_test.txt") #=> #<File:0x0000028edc7bb458>
エラーは出なくなった!が、でたのがなんだかよくわからない文章
これは一体…?
> path で指定されるファイルをオープンし、File オブジェクトを生成して返します。
とあるのでFileオブジェクトが生成されているはず
このファイルオブジェクトを次に渡すんだろうな
次とは?
(ところで)うーん、このプロセス面白いな
今までGUIさんにおまかせしていた「ファイルを開く」という処理がいったいなんなのかを教えられている
+1yosider
これ、低レイヤーに降りるたびに毎回思う羽目になりますwinajob
今まで自分が基本ブロックだと思ってたのは、レゴの組み合わせだったのか!!!みたいな
終わったあとに print される内容が毎回違う。不思議だ
これ明かしたらヤバいやつだったりするのか?パスワード朗詠漏洩とか
パスワード朗読会
パスワード詠唱!占い師
大丈夫そうinajobwogikaze
一時的に作られたファイルオブジェクトのidみたいなものかな?
メモリ番地だったりもするけど
メモリ番地(初心者特有の聞き返し)cFQ2f7LRuLYP
ポインタとかって調べると色々出てきますが、Rubyを書く上ではあまり関係なさそうMijinko_SD
🙏cFQ2f7LRuLYP
(実質的に)ランダムな値が出ているだけなのであまり気にする必要はなさそうMijinko_SD
厳密には理論とロジックに基づいていてランダムじゃないのかもしれないけれど、プログラムを書くだけの人がそこまで知る必要はないので実質ランダムです
ちょっと整理
今やりたいのはテキストファイルの中にある文字列を読み込むこと
読み込むとは?
どこに読み込むんだろう?メモリ?キャッシュ?
開くのはできている、はず……
i/oクラスに read メソッド見つけた
read(length = nil, outbuf = "") -> String | nil
> length バイト読み込んで、その文字列を返します。
>
> 引数 length が指定された場合はバイナリ読み込みメソッド、そうでない場合はテキスト読み込みメソッドとして動作します。既に EOF に達していれば nil を返します。ただし、length に nil か 0 が指定されている場合は、空文字列 "" を返します。例えば、 open(空ファイル) {|f| f.read } は "" となります。
10バイト読み込んでいる状態っぽい
これは日本語表示の問題(既出)では?inajob
TryRubyで日本語を出すの問題ですかねcFQ2f7LRuLYP
今この utano_hanashi_test.txt を見たらSHIFT-JISでエンコーディングされている(?)ようだった
エディタでファイルを保存する時に文字コードが選べるはずですinajob
なるほどcFQ2f7LRuLYP
ちゃんと出ました!!ありがとうございます!!cFQ2f7LRuLYP
これが文字コードか~
仮に数字のみのファイル test.txt を作成し指定して動かしてみた
いい動きをしているね
この路線は間違ってなさそう
再開
今日のお供は大江千里 - Rain
数字のみのファイルが読み込めて、テキストがうまく読み込めないのはなんでだろう?
数字/テキストという切り分けは適当でなさそうな予感が
buf.read(10) の意味があんまりよくわかっていないのだ(アライさん)
書いてあることをちゃんと読むか
read(length = nil, outbuf = "") -> String | nil
> length バイト読み込んで、その文字列を返します。
>
> 引数 length が指定された場合はバイナリ読み込みメソッド、そうでない場合はテキスト読み込みメソッドとして動作します。既に EOF に達していれば nil を返します。ただし、length に nil か 0 が指定されている場合は、空文字列 "" を返します。例えば、 open(空ファイル) {|f| f.read } は "" となります。
Ruby
read(length = nil, outbuf = "") -> String | nil
readメソッドには引数が二つある
1. length
バイナリ読み込みってなんだろう?
なるほど!テキストファイルじゃないファイルのことなんですね!
となると上で引数 10 してるのはダメじゃん
テキストファイルなのにバイナリの読み込みをお願いしちゃってる
…数字のテキストのみファイルはバイナリファイル?それともテキストファイルなのか?
数字はテキストとして読み込んでもバイナリとして読み込んでも数字?yosider
何進数で表示するかにもよるのかな
多分どっちも数字のはず...wogikaze
この辺から文字コードの話に入っていくみたい。今はスルーだ!
今回だとこれだね
2. outbuf
あれ?バッファ
外バッファとは一体(先入観)
>出力用のバッファを文字列で指定します。IO#read は読み込んだデータをその文字列オブジェクトに上書きして返します。指定した文字列オブジェクトがあらかじめ length 長の領域であれば、余計なメモリの割当てが行われません。指定した文字列の長さが length と異なる場合、その文字列は一旦 length 長に拡張(あるいは縮小)されたあと、実際に読み込んだデータのサイズになります。
🤔cFQ2f7LRuLYP
>既に EOF に達していれば nil を返します。
EOFってなんだろ
終端を示すコードなのかcFQ2f7LRuLYP
>また、プログラミング言語のファイル入出力機能などで、ファイル終端に達したことを表現する定数やシンボル、または、ファイル終端かどうかを検知する関数やメソッドなどの名称(の一部)としてEOFという表記が用いられる場合がある。
こっちのほうです。現在のファイルで、EOF(0x1A)が入ることはほとんどありません suto3
なるほど、ありがとうございます!cFQ2f7LRuLYP
要約する必要もなく書かれてるとおりだな……
>これは制御コードのEOFとは直接は無関係であり、例えばC言語のgetchar関数などが終端に達した場合に返すEOF定数の値は-1と定義されている。
EOF = end of file
txtファイルを保存するときのエンコード設定がshift jisで、UTF-8と噛み合ってなかった(?)ために生じていた問題だった。
これでちゃんと記述できてるかな
次いこう
ファイルは閉じなくていいのかな。開けっ放しになって永遠に開き続けていたりしない?
いつまでも閉じられるのを待ち続けるファイルさんがいると思うとつらい
閉じる方法調べてみようか
ふむふむ
これでファイルオープンと読み込みができる状態になったので、今度は青空文庫のテキストファイルを読み込んでみよう
ギャあcFQ2f7LRuLYPyosider
文字コードめ!!!cFQ2f7LRuLYP
おお……cFQ2f7LRuLYP
Hello, Worldだ……
tadayosider
ひょっとして終盤まで来てる?
+1nishio
そしたら、これまでの処理を組み合わせてみよう
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
6. buf2 を表示するよ
7. buf を閉じるよ
ここ微妙。 buf2 を閉じるべきか buf を閉じるべきか
最初開いてるのは buf なんだし閉じるのも buf だろう。やったれ!
やった
七行目の gsub が未定義のメソッドですよ
へ~??cFQ2f7LRuLYP
アレだなあ、 buf.read から buf.gsub に行くのが何かおかしいみたい
複数のメソッドを経由した場合ってどういうふうに表記するんだろう?
gsub buf.read か?
buf.read.gsub yosider
あるいは、buf.readを一旦なにか変数に代入してもいい
こうか?
ほーーーん
こんどは buf2 がおかしくなった
>未定義のローカル変数かメソッドですよ、 buf2 は。 buf のことを言いたいんですか?
書き方がおかしいのではないか
◯: buf = file.open
✕: buf2.gsub = buf.read
gsubメソッドを持っているのは、buf (ファイルオブジェクト)ではなく buf.read (String)?yosider
質問にどう答えたらいいのか困ってしまいましたcFQ2f7LRuLYP
>gsubメソッドを持っているのは、buf (ファイルオブジェクト)ではなく buf.read (String)?
これの解読から始めないといけない
gsubメソッドを持つとは(哲学)
methodはオブジェクトが持っている関数みたいなもの(説明下手)yosider
オブジェクト名.メソッド名 でアクセスできる
例えばf.readって言うとfにreadメソッドを適用した状態になってる、ということですかねcFQ2f7LRuLYP
そうです!yosider
「fにreadメソッドを適用した」というと、新しいバージョンのf (ファイルオブジェクト)が出力されるように聞こえるけど、実際はメソッド適用結果の型が元と同じ型とは限らない
今の場合は青空文庫のルビを取るテキスト処理を習得してみよう#6381c61d5e90c0000047b210にある通りString型の値またはnilが返ってくる
String型が帰ってくると思ったら、nilが返ってくることもあるということか(オウム返し戦法)cFQ2f7LRuLYP
これが世に名高いオブジェクト指向ってやつなんですか???cFQ2f7LRuLYP
です(たぶん)yosider
アホ(というか素朴な)な質問をされると回答者の理解のなさが露呈する…wyosider
となると、今回はbuf.readにgsubを適用していきたいわけで……
buf.read.gsub ←これは違いそう
あ、違ったのか…yosider
gsub buf.read ←これはよさそう
質問というか、自分もRubyは知らないですがこうじゃないですかね~くらいの気持ちyosider
あーなるほど、すみませんですcFQ2f7LRuLYP
こちらこそyosider
ここで中断cFQ2f7LRuLYP
多分メソッドの書き方が悪い。教本を見て複数のメソッドを経由した場合の書き方を思い出そう
今の script.arb は動作してた形から書き換わっている。もとに戻すには過去のキャプチャをみてもう一度打ち直すしか無い。かUndo使おうね
次はgitを使おう(高いハードル)
Undoで戻せるかも?yosider
戻せました!!!ありがとうございますcFQ2f7LRuLYP

どこにコメントつけるか悩むnishio
ここまでのプレイログを見てからのコメントだからここでいいかな、適当なところに移動してもいいです
さて、迷子になってウロウロすることは良い学びの機会なんだけど、道を間違えたポイントを一応指摘しておくと
金取れるコンテンツ感あるinajob
享受してしまっていていいのかしらcFQ2f7LRuLYP
井戸端内でgive&takeって感じ?inajob
崩字が読めるようになったことで楽しみが増えたのでお返しですwwnishio
あとまあ単純に面白い。僕が崩字を読めるようになってく過程を見てて思ったことと同じことを思ってますw
ありがてぇ……ありがてぇ……cFQ2f7LRuLYP
確かにこの方式教える側にもエンタメ性がある気がするinajob
> buf を読み込むよ
buf.read
ここだなーと思いました
それをbufと呼んでるところから推測するとbufが文字列であるかのように思ってるかもしれないけど、openの返り値はファイルオブジェクト。
ファイルオブジェクトにgsubはないからこうなる
>
> 七行目の gsub が未定義のメソッドですよ
エラーメッセージは「Fileオブジェクトにgsubなんてないよ」と言っている
なるほどcFQ2f7LRuLYP
クラスにメソッドがなかったのか
ファイルオブジェクトをstringオブジェクトに変えることができるといいのかな
入り口まではもう来てるnishio

もっかい見直すか~cFQ2f7LRuLYP
> 1. エンコードするよ(原理不明)
> 2. utano_hanashi.txt を読み取りモードで開いて変数 buf に格納するよ
ここでFile.openを使っている
1. ここがnishioさんから指摘あった通り、変数bufに代入されているのはファイルオブジェクトである
2. ファイルオブジェクトはStringオブジェクトではない
> 3. buf を読み込むよ
ここがnishioさんから指摘あった箇所
>道を間違えたポイントを一応指摘しておくと
> buf を読み込むよ
> buf.read
>ここだなーと思いました
read(length = nil, outbuf = "") -> String | nil
readメソッドを実行すると、String型またはnilで返す
readメソッドはi/oクラス
ioクラスとファイルクラスってどんな関係なんだ???(脱線志向)
>後述しますが、FileクラスはIOクラスを継承しています。
継承は見たことあるぞ
クラスの共通部分を別クラスにまとめる仕組みだった
ここ余り深入りしないほうがいいな
仮に上のようにしたらちゃんと文字列が出た
あー、このbuf.readの生成物(インスタンス?)を変数に格納したらいいのかな
やってみよ
あ、できた(終了)
> 4. buf gsub メソッドを実行するよ
3.1 《》 "" に置換するよ
3.2 置換した文字列を変数 buf2 に入れるよ
> 5. buf2 gsub メソッドを実行するよ
[] "" に置換するよ
> ここも↑と同じように変数に入れたほうがいいかも?yosider
今そのままprintしてるし、一回変数に入れてみよう
> 6. buf2 を表示するよ
> 7. buf を閉じるよ

ruby
# coding: utf-8 Encoding.default_internal = __ENCODING__ buf = File.open("utano_hanashi.txt","r") text = buf.read #gsubを使う buf2 = text.gsub(/《.*?》/, "") print buf2.gsub(/[.*?]/, "") buf.close
できたはできた……
が、Scrapboxにコピーするときに行頭の全角スペース   が気になるな
これも取るか
正規表現カモン!
行頭は ^ だった
ありがとう、過去ログ……
ruby
Encoding.default_internal = __ENCODING__ text = File.open("utano_hanashi.txt","r") buf = text.read #gsubを使う buf2 = buf.gsub(/《.*?》/, "") buf3 = buf2.gsub(/[.*?]/, "") #行頭にマッチして一行目に` `のを`""`にする buf4 = buf3.gsub(/^ /, "") print buf4 text.close

うおーできたーcFQ2f7LRuLYP
生成物を歌の話 (折口信夫)にコピーした
本当は出力のテキストファイルを作るとかいろいろ拡張があるのだろうけど
目標を達成したのでとりあえずこれでよしか……
tadayosideryosiderwogikazewogikazeinajob

謝辞
nishioinajobsuto3yosidertakkerMijinko_SDwogikaze皆さん
アドバイスありがとうございましたー。ほんと助かりました!!!cFQ2f7LRuLYP.icon


終わった後の目標
このページとは何ら関係がないが……
ScrapboxでTRPGやるときに使えそうなのだ
もう解決されてしまったかもしれない
正規表現を使わず、同じ処理を行うスクリプトを作ってみよう
出力ファイルを作ってみよう
別のファイルを入力できるようにしよう
>最終成果物のRubyスクリプトをコードブロック記法で残しておいていただけると助かります
この約定を果たさねば
旧字を現行通用の字に変えたい
できるんかこれ?
強いcFQ2f7LRuLYP
簡単に使えるようなコードは見つからなかったwogikaze
開発ツールのデバッガ経由じゃないと見れない
このコードをpythonに変換すれば作れる
UserScriptならちょこちょこ手直しすればいい
丸パクリしていいのかと言われるとなんとも……
一覧が下に乗ってるので置換すればいける

感想欄
面白いnishio
Outer Wild的にいえば謎解きの鍵になる場所にはたどり着いてるけど、それが謎解きの鍵だとはまだ気づいてない感じ
正規表現のネタバレがいい感じにオーパーツ扱いになってて面白いinajob

長過ぎるページになってしまった、どうしよう
切り出しできるとこを切り出す?
2つほど本流ではないところを切り出したnishio
本質的にはOuterWildsプレイ日記みたいなもの(=あっちこっち迷子になってる過程の時系列ログ)だから時間軸で分割するしかないのでは
整理された知識構造にはなってないから
気が向いたらメタ・ノート的に、面白いところだけ抜き出して整理したページを作ってもいいかも
面白そうyosider
🙏cFQ2f7LRuLYP
お、重いwyosider
すみません!終わったら切ります!!cFQ2f7LRuLYP
この重さがまた祭り感あるんだよなあ…(ドM)yosider
大きめのパートを切り出したcFQ2f7LRuLYP
516行らしいMijinko_SD
ソースコードが含まれるページはどうしても重くなりがち
バルスの存在感cFQ2f7LRuLYP