4-1.処理 1.目次配列の格納 前編

解説範囲は以下の通り


 #見出しフラグが1なら

 if($sctnFlg -eq 1){

  #見出しと章タイトルを配列に格納していく

  #目次行検索

  $mkjnmbr= Get-Content $abtpth -Encoding utf8 | select-string $mkjRgx -Encoding utf8

  #ファイルの最大行数取得(配列扱いにせにゃならんので-1)

  $rowcnt=((Get-Content -Path $abtpth).Length - 1)


  #取得した行番号と配列末尾の行数-1で目次配列を抜き出し

  $sctnArr=(Get-Content -Encoding UTF8 $abtpth)[$mkjnmbr.LineNumber..$rowcnt]

 }


ようやく本格的な処理だぜ。


初っ端、if文、条件分岐ですね。

Powershellでの構文は以下の通り。


if(条件文){

 条件文が真=条件文に一致する時の処理

}else{

 条件文が偽=条件文に一致しない時の処理

}


一致しない時に何もしないなら、else以降は省略可。

というか省略した方が無駄な混乱は生まない(経験則からの戒め)ので、今回は省略済。

条件文の書き方がPowershellだと独特で


 $sctnFlg -eq 1


で、「変数sctnFlgが1と等しいか(-eq)」になる。

「-eq」が「=(イコールEqualから-eq)」。

「-ne」が「≠(ノットイコールNotEqualから-ne)」。

……わからんよなあ。

以上/以下、超過/未満も条件にできるんだけど、バッチやシェルの系統はもれなくこの「-とアルファベット2文字」方式なのである。

PHPやJavaScriptの算用記号流用が恋しい……興味ある方は「Powershell 条件文 書き方」とかで調べるとよいかも。


「変数sctnFlgが1と等しい」というのは、「見出し出力をする時」なので、真での処理は見出し出力のためにabout.txtから目次部分を引っこ抜く作業をしています。


 #目次行検索

 $mkjnmbr= Get-Content $abtpth -Encoding utf8 | select-string $mkjRgx -Encoding utf8


出たよ、コマンドとパイプと戻り値と……やりたいことやるためにいきなり合体技をかましてるようなもんです。


最初に、パイプ(|)について。

パイプを使うと「|の前にある処理の結果を元に、|の後ろの処理を実行した結果を返す」ようになります。

なので、上のだと、


「Get-Content $abtpth -Encoding utf8」の結果を元に、「select-string $mkjRgx -Encoding utf8」を実行した結果の内容を「変数mkjnmbr」に格納してる


となります。

真ん中、右、左の順に情報が移動しているわけです。


一番最初に実行されている


 Get-Content $abtpth -Encoding utf8


は、「文字コードUTF-8(-Encoding utf8)で変数abtpthが指すファイルの内容を取得(Get-Content)する」という処理です。

変数abtpthは「」の通り、about.txtのフルパスなので、about.txtの中身を取得しているわけです。

「文字コード」はPCとかで文字を表示する場合、実際には各文字に紐付いた特定の符号のかたまり(\05\4Dとか)になっているのですが、この符号の様式の種類が複数あるのです。これが文字コード。

Windows標準はSJIS(シフトJIS)だけど、カクヨムを始めとしたWeb系サービスは基本UTF-8です。そしてご多分に漏れず、カクヨムのバックアップファイルのテキストもUTF-8なのです。

これをSJISで読み込んじゃうと文字化けになるので、あえてUTF-8で読み込むわけです。なお、Windows標準の文字コードはSJISだけど、UTF-8のファイルを開くとUTF-8で開いてはくれます。


そのあとの


 select-string $mkjRgx -Encoding utf8


はGet-Contentした内容から「文字コードUTF-8(-Encoding utf8)で変数mkjRgxの内容がどこにあるか探す(select-string)」という処理です。

変数mkjRgxは「設定変数 変更可能範囲外正規表現編」での通り、about.txtから目次開始行を取得するための正規表現が入ってます。

そして今回検索対象のGet-Contentは改行を含む文字列なので、検索対象が存在する行情報を返します。

改行が含まれない場合は、何文字目が対象の文字列かを返してくれるけど、ここで欲しいのは行番号だから行情報(使用時にここから行番号抜き取る)。

鋭い人は「あれ、目次自体ってここで検索した正規表現文字列の次の行からだよね? 【目次】って文字のある行の情報取得でいいの?」と思うかもしれないけれど、これはn分(次のエピソードのメイン部分を読み終わるまでの任意の時間分)寝かせます。


  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る