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

で、次のエピソードいきまーす。


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

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


コメントはとりあえず置いておいて、


Get-Content -Path $abtpth


はさっきの通り、ここでは「about.txtの中身を取得する」です。今回は最後の行が何行目か取得したいだけなので、文字コードは指定してません。

これを()でくくることで、Get-Contentが返してくる処理結果オブジェクトをその場でいじくれます。

Get-Contentが返してくるオブジェクトは、ずばり「ファイルの中身」。

この中身、改行があると各行が配列に格納された形で入ってます。

つまり、


1行目

2行目だよん


と書かれたファイルをGet-Contentして、$hensuに格納したとすると


$hensu[0]←「1行目」が入ってる

$hensu[1]←「2行目だよん」が入ってる


となります。

さらっと書いたけど、Powershellでは「配列の変数[配列の部屋番号(0始まり)]」で配列の部屋を参照します。

0始まりの部屋番号だから1行目は1部屋目の0番の部屋に入っているのです。

上の例でまたさらっとやってるけど、一応Get-Contentした値を変数に格納することも可能なので、ここの部分は


$hensu=Get-Content -Path $abtpth

$rowcnt=($hensu.Length - 1)


と書いても動きます。

でもここでGet-Contentした内容をその後使わないので、変数に格納せずに、()でくくって直に「.Length」してます。

この「配列またはオブジェクト.Length」は実行すると、「配列またはオブジェクトの部屋数」を返します。

今回はGet-Contentしたabout.txtの行区切りの配列の長さを返すわけですが、変数rowcntに入れる前に、「- 1」してます。


さて、ここでn分寝かせた目次開始位置ズレてない?の件と、この「- 1」の解説をします。


まずは改行の含まれるファイルをGet-Contentした結果を変数に格納した場合、


ファイル-----------

1行目

2行目だよん


格納結果-----------

$hensu[0]←「1行目」が入ってる

$hensu[1]←「2行目だよん」が入ってる


と説明しました。

配列が0番から始まる部屋番号を持つので0番の部屋に、1行目の内容が入ります。

そして、この格納結果を「.Length」つまり、「$hensu.Length」とした場合、「部屋の数」が返ってくるので、0番目と1番目の部屋がある今回の場合、「2」が返ります。

しかし、この後実行する、「about.txtの目次部分取得」では、「about.txtをGet-Contentした時の何番目の部屋から最後の番号の部屋までの範囲」という風に指定する必要があります。

0番から始まる連番を部屋番号として振られている配列なので、Get-Contentした内容は、常に「行番号nは取得した変数のn-1の部屋に入っている」事になります。

なので、


「about.txtをGet-Contentした時の何番目の部屋から最後の番号の部屋までの範囲を目次として取得する」


のは


「about.txtの【目次】の行の次の行番号 - 1から、ファイルの最後の行番号 - 1を取得する」


と同じです。


「【目次】となってる次の行番号 - 1」は「【目次】の存在する行番号」と一致するので、検索結果の行情報をそのまま格納、一方、部屋数を返してくるLengthで取得した最後の行番号は-1することで、Get-Contentした時の最後の部屋番号として扱えるわけです。

……プログラミングはこういうことの積み重ねなんですよね(しみじみ)


そして、ここの解説最後の処理


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

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


ですが、目新しいのは「[$mkjnmbr.LineNumber..$rowcnt]」のところぐらいでそれ以外はこれまでの処理で出てきた部分。


Get-Content -Encoding UTF8 $abtpth


は、先述の通り、「about.txtを文字コードUTF8で改行区切りの配列で取得する」で、それが「()」内に書かれているので、Get-Contentを変数hensuに格納したとすると、


$hensu=Get-Content -Encoding UTF8 $abtpth

$sctnArr=$hensu[$mkjnmbr.LineNumber..$rowcnt]


と書いたのと同じです。

で、「配列[開始部屋番号n..終了部屋番号m]」と書くことで、配列の指定した部屋番号nから部屋番号mまでを抜き出すことができます。

「$mkjnmbr.LineNumber」は行情報から行番号を取得する処理。

……言葉だけだとわかりにくいよね。

about.txtの中身が次の状態だとすると、(わかりやすいように一部行抜いてます)


【タイトル】

小説タイトル

【作者名】

作者名

【ジャンル】

詩・童話・その他

【タグ】

- タグ1

- タグ2

【目次】

エピソード1

エピソード2

エピソード3


「【目次】」は10行目で、目次最後=about.txt末尾の「エピソード3」は13行目にあります。

さっきn分寝かせた「【目次】」行検索処理によって、変数mkjnmbrには10行目の情報が入ります。

そして、about.txtの最終行-1を取得する処理によって、「13 - 1」のつまるところ「12」を変数rowcntに格納します。

その上で、about.txtをGet-Contentして改行区切りの配列化した内容から、0から行を数えた時の指定で目次部分のみを抜き出すので、部屋番号10の部屋から部屋番号12の部屋を抜き出して、「変数sctnArr」に格納します。

すると「変数sctnArr」の内容は


$sctnArr[0]←格納内容は「エピソード1」

$sctnArr[1]←格納内容は「エピソード2」

$sctnArr[2]←格納内容は「エピソード3」


となるわけです。

はい、これで目次配列の格納が完了です。いえーい。

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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