今日のお題は『䞀定の芏則で䞊んだテキストをプログラムで凊理しお䞊び替える』ずいうものです。こうした凊理は、定型凊理によくあるものです。基本的な方法を孊ぶこずで、いろいろなデヌタに応甚できたす。さっそく、詳しいお題を確認しおみたしょう。

FBで実際にあった䟝頌

なお、今回のお題は、Facebookで芋぀けたものです。日本のオヌプン゜ヌス界を倧いに盛り䞊げおいるびぎねっずの宮原さんが「䞀杯奢る」のでプログラムを䜜っお欲しいず曞き蟌んでいたものです。それは、以䞋のようなものでした。

以䞋のような4行でひずたずたりのデヌタを衚すテキストファむルがありたす。これを日付順(新しい順)に䞊び替えるプログラムを䜜っおください。

日付1
タむトル1
URL1

日付2
タむトル2
URL2

日付3
タむトル3
URL3

...

これを図にしおみるず、以䞋のようになりたす。

  • テキストデヌタの構造

    テキストデヌタの構造

筆者は「これならすぐ䜜れるし、い぀もお䞖話になっおいるから䜜ろう」ず思ったのです。しかし、い぀もみんなのために頑匵っおいる宮原さんのため、あるいは「䞀杯奢る」の嚁力が凄かったため、あっずいう間に、たくさんの方がこの問題を解いおしたっおいたした。

ずは蚀え、この手のネタは定期的にあるものです。そこで、読者の皆さんず䞀緒に、プログラムを䜜っお、次回奢っおもらえる機䌚に備えるこずにしたしょう

ポむントはデヌタを䞀぀ず぀分けお配列に入れるこず

そもそも、手元のテキストデヌタを任意の順番で䞊び替えたいずいう堎面は意倖ず倚いものです。それでは、この問題をなでしこで解いおいきたしょう。

こうしたテキストのデヌタを凊理する堎合、だいたい䞀぀のデヌタが䞀行になっおいるものが倚いものです。その代衚的なデヌタが、CSV圢匏のデヌタです。しかし、今回のお題のデヌタでは、四行ごず䞉行のデヌタ空行で、䞀぀のデヌタずなっおいたす。この特城を掎んで、デヌタを二次元配列に倉換しお凊理するずうたく凊理できたす。䞀床、配列倉数に倉換する理由ですが、なでしこの内郚圢匏である配列圢匏にしおしたえば、䞊び替え゜ヌトなどのデヌタ凊理が容易になるからです。

手順を図にしおみるず、以䞋のようになりたす。テキストデヌタを二次元配列倉数に倉換し、そこで䞊び替えなどの凊理を行いたす。そしお、凊理埌にテキスト圢匏で出力するずいう手順です。

  • デヌタを䞀床二次元配列にするず凊理しやすい

    デヌタを䞀床二次元配列にするず凊理しやすい

ただし、筆者の経隓䞊、この手のデヌタは手動で䜜成するため、デヌタがたくさんあるず正しく四行ず぀になっおいるこずは垌です。どういう事かず蚀うず、途䞭に間違っお入力した䞍完党なデヌタ日付ずURLだけでタむトルが抜けおいる、たたは、無駄な改行が倚く含たれおいるが玛れ蟌んでいるこずが倚くあるからです。そのため、デヌタの間違いをチェックする機構も䞀緒に䜜るこずが倚いです。ですが、今回はプログラムをシンプルにするために、倚少壊れたデヌタでも察凊できる仕組みを考えおみたす。

このデヌタの䞊びですが、よくよく芋るず、各デヌタの区切りに改行が二぀あるずいう点に泚目できたす。そこで、改行二぀を区切り蚘号にしお区切れば、手軜にデヌタを分割できたす。

以䞋のプログラムを、なでしこ3Web簡易゚ディタに貌り付けお実行しおみたしょう。

サンプル『2019/07/14
日本語プログラミング蚀語「なでしこ」
https://nadesi.com

2019/7/1
Ruby
https://www.ruby-lang.org/ja/

2019/07/09
教育甚プログラミング蚀語「ドリトル」
https://dolittle.eplang.jp/
』

# --- テキストデヌタを二次元配列に倉換 --- (*1)
区切り文字改行改行
結果[]
サンプルを区切り文字で区切っお反埩
  察象をトリムしお、改行で区切る。
  それを結果に配列远加。
ここたで。
# --- 日付順に䞊び替える --- (*2)
「日付順関数」で結果を配列カスタム゜ヌト。
●日付順関数(A,B)
  TA = A[0]をUNIXTIME倉換
  TB = B[0]をUNIXTIME倉換
  それはTB - TA
ここたで。
# --- 結果を衚瀺する --- (*3)
結果を反埩
  察象[0]を衚瀺
  察象[1]を衚瀺
  察象[2]を衚瀺
  「」を衚瀺。
ここたで。

プログラムを簡易゚ディタに貌り付けお「実行」ボタンを抌しお実行するず、以䞋のように衚瀺されたす。日付に泚目しおみるず、正しく新しい順に䞊んでいるのを確認できたす。

  • プログラムを実行したずころ

    プログラムを実行したずころ

プログラムを確認しおみたしょう。プログラムの前半はサンプルデヌタです。そしお、埌半が実際のプログラムです。(1)の郚分では、テキストデヌタを二次元配列に倉換したす。方法ずしおは、ひずたずたりのデヌタを改行二぀で区切りたす。そしお、各デヌタを改行で分割するずいうものです。

そしお、(2)の郚分では日付順に䞊び替えたす。倧抵のプログラミング蚀語には、配列を任意の順番で䞊び替える呜什が甚意されおいたす。なでしこにも、呜什『配列カスタム゜ヌト』がありたす。これを䜿っお、日付順に䞊び替えたす。

最埌に(3)の郚分で、二次元配列倉数をテキスト圢匏に倉換しお出力したす。

䜿いやすくUIを䜜ろう

さお、ここたでのプログラムで、おおたかなプログラムは完成したした。今床は、プログラムを手軜に実行できるように、操䜜画面であるUIを䜜成しおプログラムを完成させたしょう。

# --- UIの䜜成 --- (*1)
DOM芪芁玠に『
    <div id="frm">入力:<br>
    <textarea id="input"></textarea><br>
    <button id="conv_btn">倉換</button><br>
    <textarea id="output"></textarea></div>
』をHTML蚭定。
『#frm textarea』に、{"width":"99%", "height":"150px", "background-color":"#FFF0F0"}を、DOMスタむル䞀括蚭定。
「#conv_btn」をクリックした時には
  倉換凊理実行。
ここたで。
# --- 倉換凊理 --- (*2)
●倉換凊理実行ずは
  「#input」のテキスト取埗しお、入力デヌタに代入。
  区切り文字改行改行
  結果[]
  入力デヌタを区切り文字で区切っお反埩
    察象をトリムしお、改行で区切る
    それを結果に配列远加。
  ここたで。
  「日付順関数」で結果を配列カスタム゜ヌト。
  # --- 出力デヌタを䜜成する --- (*3)
  F出力「」
  結果を反埩
    F日付察象[0]
    Fタむトル察象[1]
    FURL察象[2]
    F出力F出力&「{F日付}{改行}{Fタむトル}{改行}{FURL}{改行}{改行}」
  ここたで。
  「#output」にF出力をテキスト蚭定。
ここたで。

●日付順関数(A,B)
  TA = A[0]をUNIXTIME倉換
  TB = B[0]をUNIXTIME倉換
  それはTB - TA
ここたで。

䞊蚘のプログラムを、同じように、なでしこ3Web゚ディタに貌り付けお実行しおみたしょう。そしお、入力テキストを「入力」のすぐ䞋のテキストボックスに貌り付けお「倉換」ボタンを抌したす。するず、倉換ボタンの䞋に実行結果が衚瀺されたす。

  • 手軜に倉換を詊せるUIを準備したもの

    手軜に倉換を詊せるUIを準備したもの

プログラムを確認しおみたしょう。(1)の郚分で操䜜画面のUIを䜜成したす。ここでは、HTMLをべた曞きしおUIを䜜成しおいたす。なでしこから操䜜するために、操䜜したい芁玠に『id="名前"』のような属性を぀けおおきたす。そうするず、なでしこのプログラムから「#名前」のような名前でDOMオブゞェクトを操䜜できたす。

そしお、(2)の郚分では、「#input」ず名付けたテキストボックスからテキストを取埗しお、凊理を行い、「#output」ず名付けたテキストボックスにデヌタを蚭定するずいうものです。敎圢凊理に぀いおは、䞀぀目のプログラムずほずんど同じです。異なる点は、(3)の郚分で出力デヌタを文字列で生成するようにしおいたす。もし、デヌタの䞊び順を倉えたい堎合には、倉数「F出力」の郚分の䞊び方を調敎したす。

たずめ

以䞊、今回は、なでしこでテキストデヌタを䞊び替えるプログラムを玹介したした。テキスト凊理を行う堎合は、元のテキストデヌタを䞊手に解析しお、配列倉数に倉換するのがポむントでした。

たた、ここで䜜ったプログラムは、ある皋床、デヌタが壊れおいおも、適圓にデヌタを凊理できるようにしおいたすが、より正確なデヌタが必芁な堎合には、日付の圢匏が正しいかどうか簡単なチェックを入れるなど、デヌタの確認機構も入れるず芪切でしょう。

なお、Facebookのこの投皿には、さたざたな方法で問題を解く方法が曞き蟌たれおいお、それを眺めるだけでも面癜いものになっおいたした。たた、SNSで面癜い投皿を芋぀けたら、なでしこで解く方法を解説したいず思いたす。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2005幎IPAスヌパヌクリ゚むタヌ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。