Skip to content

tulamili/App-Bin4TSV

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

57 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

App::Bin4TSV

抂芁

  • 衚圢匏のテキストデヌタファむル、特にTSV圢匏のファむルを扱うためのコマンド矀およびその為に発生する呚蟺的な操䜜を行うためのコマンド矀である。 TSVずはTab-Separated Valuesである。
  • 各コマンドは実䜓は1個のPerl蚀語で曞かれた、倧雑把に50行〜300行皋床のブログラムであり、珟圚、玄65個のコマンドが収録されおいる。
  • 利甚には、Unix、Linux、シェルの䜿い方の知識が必芁である。Perl蚀語プログラミングの知識は必芁ずしない。ただし、䜕か䞍具合があった堎合にPerlの知識があるこずは圹に立぀であろう。たた収録したプログラムの改良提案などはPerlの知識は必芁である。

むンストヌル

むンストヌル方法 は、次の2個のいずれかの方法である。

cpanm https://github.com/tulamili/App-Bin4TSV.git

もしくは

cpanm App::Bin4TSV  
## cpanm -v App::Bin4TSV たたは cpanm --verbose App::Bin4TSV でむンストヌル途䞭の詳现も分かる。

䞊蚘は、30秒皋床以内で完了するであろう。App::Bin4TSVはCPANモゞュヌルである。cpanmコマンドのcpanを䜿っおも良いが、それだず準備に時間がかかるであろう。

䞊蚘のむンストヌルした埌で、アンむンストヌルする堎合(この゜フトりェアの利甚を今埌しない堎合)には、䞋蚘を行う。

cpanm -U App::Bin4TSV

䞊蚘により、陀去するファむルの䞀芧が衚瀺される。その時にyキヌを抌䞋するず、アンむンストヌルが完了する。

各コマンドに぀いお

この節では各コマンドの簡朔な説明を䞎えるこずを目的ずする。ただし、そのために、この節の前半で泚意曞きを䞎え、その埌で具䜓的に各コマンドの説明を短くたずめる。(コマンドの実際の実行結果はこの節には買いおはいない。実際に実行するのが、理解しやすいであろう。)

各コマンドの説明における泚意事項

その説明はそのコマンドの代衚的な機胜の説明のみに留たる。䞋蚘のような関係するず思われる機胜は説明を省略しおいる。

䞋蚘の説明ずしお省略されおいるこず

  1. App::Bin4TSVは2021幎5月29日珟圚65個のコマンドが収録されおいるが、このペヌゞではその党おを説明しおいない。
  2. App::Bin4TSVは8個の別のCPANモゞュヌルが持぀コマンドを2021幎5月29日にコピヌをしお䜜成しおいる。それらのモゞュヌルは同じコマンドが重耇しおいる堎合がある。たたいく぀かのモゞュヌルのコマンドに぀いおは解説は省略しおいる堎合がある(デヌタファむルの、ディレクトリ配眮の様子を理解するためのコマンド矀は、本゜フトりェアに収録しおいるが、このペヌゞで解説しおいない)。
  3. デヌタはTSV圢匏を䞻に前提ずしおいるので、各列(各属性)はタブ文字で区切られおるこずが前提であるように瀺されおいるが、実際には、タブ文字以倖のコンマなどの他の文字も区切り文字ずしお䜿えるこず。(コマンドでは -i "\t" や -i , のように、マむナス文字で始たるコマンドスむッチで制埡が可胜である。)
  4. A→Bぞの倉換が䞻機胜のコマンドに察しお、そのコマンドが持぀B→Aぞの逆倉換の機胜。

各コマンドの機胜性、充実性、掗緎床に関しお

  1. 䞋蚘のコマンドは、実装が十分に掗緎されおいるずは限らない。いく぀かのコマンドは现やかに小機胜が実装されおいるが、あるコマンドは機胜䞍足な堎合がある(▌で䞋蚘で瀺す)し、蚭蚈が䞍十分な堎合もある(◆で瀺す)。

  2. 各コマンドは、汎甚性、再利甚性は高めた䜜りになっおいるが、それが十分に成されおいるずは限らない。

甚いた甚語の衚蚘に぀いお

  1. 衚ずテヌブルは同じ意味である。䞋蚘でTSV圢匏のファむルのデヌタは、暗黙に衚であるこずがよく仮定されおいる。

  2. 行はそれぞれが暪長の芁玠が、瞊方向に集たっお衚を構成する。各行はレコヌドずも呌ばれる。属性ずも呌ばれる。

  3. 列はそれぞれが瞊長の芁玠が、暪方向に集たっお衚を構成する。各列はカラムずも呌ばれる。

  4. 衚においお、行番号ず列番号の䞡方を指定する、぀たり「行ず列を指定する」ず、倀が定たる。出珟倀ずいう堎合がある。

  5. TSVファむルの先頭の行(぀たり1行目)はデヌタの倀の䞊びではなくお、列の名前(列名)の䞊びであるこずがある。

  6. オプションスむッチ のこずを単にオプションず呌ぶこずもありたす。Unixのシェルコマンドでマむナス(-)文字に続けお、英数字蚘号のオプションを指定しお、さらにパラメヌタヌを指定するこずもありたす。(Perlプログラム内のuse Getopt::Stdでこの機胜を䜿いたした。)

本゜フトりェアでは、「先頭行が列名の䞊びである堎合」に凊理がしやすいように、各コマンドは、共通するオプションスむッチ-=  (マむナスの盎埌にむコヌル蚘号)でその堎合に察凊できるように、しおある。

各コマンドの説明

ここから、本゜フトりェア(モゞュヌル)が提䟛するコマンドの具䜓的な説明になる。重芁なコマンドは倪字で衚した。䜿いやすさや掗緎床にはバラツキがあり、十分な氎準に無いものは▌や◆の蚘号を付けた。本゜フトりェアが提䟛するコマンドのうち、玄25個のコマンドのみが解説の察象ずなっおいる。

本゜フトりェアが提䟛するコマンド矀は倧たかに8個に分類できる。それらは、それぞれ察応するCPANモゞュヌルに収録されおいる。その分類に基づいお、小さな節に分けお、解説する。

TSVファむルの倉換に関係するもの

この節のコマンドはBin::TSV::Convにも収録されおいる。

  • csv2tsv : CSV圢匏(ダブルクォヌト囲みの堎合も察凊)をTSV圢匏に倉換。

  • xlsx2tsv (▌▌) : ExcelファむルをTSV圢匏に倉換

  • mtranspose : 「行列の転眮」(←数孊甚語)。TSV圢匏のテヌブルに察しお、行方向ず列方向を反転する。

  • csel : AWKよりも容易に列の操䜜ができるナヌティリティ(指定した列矀を、-pで衚瀺、-dで抑制、-hで先頭に移動、-tで末尟に移動; -=で列名でこれらの操䜜を指定)

  • join2 (â–Œ): 2個のテヌブル(TSVファむル)をjoinする。UnixのjoinおよびSQLのjoinず䌌た様な操䜜である。

TSVファむルの䟿利な機胜矀

この節のコマンドはBin::TSV::Utilにも収録されおいる。

  • colgrep (▌◆): grep (文字列怜玢)を指定した列に察しお行う。

  • colsummary : ひず぀のTSVファむルをテヌブル(è¡š)ず芋なしお、党列のそれぞれに察しお、(1)異なる出珟倀の数(2)平均倀(3)出珟倀の範囲(最小ず最倧など)(4)頻出する倀(䞊䜍数個)

  • colchop (â–Œ): lessでTSVファむルを閲芧しようにも、たずえば先頭行に出珟する倀が長すぎお、衚ずしお画面の衚瀺が芋にくい堎合がある。その堎合に、長すぎる倀を指定した長さで折りたたむようにするこずができる。

  • colpairs (▌◆) : ある衚の任意の2列の組合せに぀いおの、いろいろ有甚な統蚈情報を抜出する。察比しお、colsummaryは、各列単䜓ばらばらの情報しか出力しない。

  • collen : 各列の、長さに぀いおの情報を抜出する。ある甚途によっおは頻繁に利甚するかも知れない。

  • keyvalues : 2列以䞊のデヌタに察しお、先頭列(最も巊偎の列)をキヌず芋なし残りの列をバリュヌず芋なしお、党おの異なるキヌの出珟倀に察しお、䜕個の異なるバリュヌ倀が出珟したかを衚す。同じキヌ倀で異なるバリュヌが出珟しおいないか怜知するのに、䟿利。キヌずバリュヌをどの列で切るかに぀いおも、オプションで指定可胜。

  • kvcmp : 2個のTSVファむルに察しお、キヌずバリュヌの関係(keyvaluesを参照せよ)が、等しいか吊かを刀定する。TSVファむルに栌玍された衚は行の順番に意味が無いこずがあるので、その堎合に、2個のTSVファむルのそれぞれの衚が同じ意味を持぀か吊かを刀定するために甚いる。

  • joinn : 2個たたは3個以䞊のTSVファむルに察しお、同じキヌの倀が異なるファむルにおいおどんなバリュヌの倀になっおいるかを、行列状に出力する。

各行をそれぞれの文字列デヌタず芋なすコマンド矀

この節のコマンドはBin::Data::1Dにも収録されおいる。

  • freq : 各行の倀の頻床衚を出力。シェル芞のsort | uniq -cず䌌た機胜であるが、出力衚の各行の出力順序の指定、环積和の衚瀺など、きめ现やかな小機胜を搭茉しおいお、オプションスむッチで自由自圚に指定が可胜。

  • expskip : 1, 10, 100, 1000行目を衚瀺。ただし、最初の2行ず最埌の2行も衚瀺。指数関数的に行を読み飛ばすが、どのようにするかは、オプションで指定がいろいろ出来る。

  • alluniq (◆) : 各行の出珟倀が党お異なるか、そうで無い堎合は耇数回出珟した倀はどのようなものがあったかを分かり安く衚瀺する。(colsummaryより高速。)

  • digitdemog (â–Œ) : 䜕桁目にどんな文字が出珟したかを衚瀺。(たた党然別の機胜ずしお、各行の文字列長ごずに、文字列の最小ず最倧の倀を敎理しお出力。) 倀の曞匏を芳察するのに有甚。

  • chars2code : 各行ごずに、各文字の文字笊号を、行ごずに敎理しお出力する。いろいろなオプションあり。Unicodeの笊号䜍眮を出力する(「あ」→u+3042など)。(Unixのダンプリストを出力するようなod -tax1よりは遥かに䟿利であろう。党角マむナス(−)なのか、長音蚘号(ヌ)なのかなどの区別がしやすい。)

  • lminusl : 2個のファむルA,Bに察しお lminusl A Bにより、Aに存圚しおBに存圚しない行を出力する。(差分)

  • venn : N個ファむルに察しお、各行がどのファむルに珟れたか(最倧2^N-1通り、぀たり、最倧2Ꮊ-1通り)のパタヌンをベン図のような抂念で分かり安く衚瀺する。

タヌミナルの文字に着色するコマンド

この節のコマンドはBin::Text::Color::Plusにも収録されおいる。

  • colorplus : 数倀に3桁ごずに色を付けたり、衚圢匏のデヌタを5列ごずに背景を青ず黒で亀代させお衚瀺させるこずで、デヌタの意味を読み取りやすくする。colorplus -0で着色を解陀する(普通のテキストになる)。

  • reisistorcc : 電気抵抗噚のカラヌコヌドを参考にした着色を数倀に察しお行う。

  • backcolor (â–Œ) : 倚数の数倀のみの情報に察しお、背景に6段階で違う濃さの青色で着色しお、意味が分かりやすくする。

(䞊蚘3個のコマンドは、党お1個のコマンドcolorplusに機胜を統合するこずは怜蚎䞭。)

乱数を出力するコマンド

この節のコマンドはBin::Gen::Randにも収録されおいる。

䞋蚘のコマンドにより、実隓甚のデヌタも生成が可胜ずなる。

  • saikoro : 1から6たでの敎数の乱数を出力。-g オプションでTSV圢匏の行列でも出力。たずえばsaikoro -g3,2で3行2列の乱数行列になる。 -s でシヌドの固定も可胜。

  • boxmuller : ボックスミュラヌ法でガりス乱数を生成。

泚意点・バグなど

  1. 「コマンド名の衝突」に由来する䞍具合は想定されうる(App::Bin4TSVのむンストヌルにより他のコマンドが䜿えなくなる、およびApp::Bin4TSVのアンむンストヌルにより他のモゞュヌルがむンストヌルしたはずの実行ファむルが消されおしたうなど)。

  2. 本゜フトりェアが提䟛するcsv2tsvに぀いお、本文曞の䜜成者が、ある10䞇行くらいの倧きなCSVデヌタ(途䞭に改行文字の倀など含む)の倉換に぀いお、倉換が途䞭でうたくいかなくお、結局、そのデヌタを2個に分けおTSVに倉換するこずをしたこずがある。Text::CSV_XSに由来するバグの可胜性を考えおいるが、ただよくは調べおいない。

デヌタ分析の実務等で䜿う堎合の倧きな流れ

  • 本゜フトは、既存のUnixコマンドずそのシェル芞ず組みあわせお䜿うこずが想定されおいる。ただし、単䜓でもある皋床䜿うこずはできるであろう。
  • 本゜フトは、OECD非加盟囜の政府や、叀いシステムを曎新しおいない倧䌁業のデヌタセキュリティルヌム内でも䜿える様にするこずを想定しおいる。 (したがっお5幎ないし10幎皋床皋床叀いシステムで䜿えるように use 5.014の宣蚀が各プログラムでされおいる。) - (ここで蚘したような、倧きな流れだけでなくお、掟生的に発生するであろう小さな枝分かれ的な䜜業でも䜿える様に、既存のUnixコマンドにない コマンドも本゜フトりェアの収録するようにしおある。)

(したがっお5幎ないし10幎皋床皋床叀いシステムで䜿えるように use 5.014の宣蚀が各プログラムでされおいる。)

## 想定されおいる流れ

衚圢匏のデヌタが甚意された堎合に、䞋蚘の様なこずを迅速に枈たすこずで、さらに本栌的なデヌタ分析や機械孊習などの高床な凊理を容易にしたり、 最初にデヌタに䞍備がある堎合にそれを迅速に把握するこずができるであろう。

  1. デヌタを受け取る
  2. ファむル矀がどのようにディレクトリに配眮されおいるか理解する
  3. 各デヌタファむルの抂芁を把握する。
    • expskipで各ファむルの最初から最埌たで把握する。
    • alluniqで各レコヌドに重耇がないか把握する。
    • colsummaryで各列の様子を詳しく把握しお、衚ずしおの意味をよく理解する。異垞倀や特別倀もよく把握出来るであろう。(最初に重芁なステップずなるであろう。)
    • digitdemogで各列の具䜓的な曞匏などをもっず把握出来るであろう。
    • colpairsで列間の関係を把握する。
    • 各デヌタに䞍具合が無いか把握する。crosstableで重芁な2列の組合せでクロス衚を䜜成しお、穎が無いか、などで把握出来る。
  4. デヌタファむル間の関係を把握する。
    • 耇数のファむルの関係をjoin2やjoinn、および、cselずvennを組みあわせお把握する。
  5. 耇数のログファむルに察しお、特定のナヌザヌがどういう履歎を残したかを把握する。
    • ※ ただしこの目論芋を実行するコマンドは未蚭蚈・未実装である。

珟状、䞀般にデヌタ分析は、それぞれの凊理が耇雑になりがちで、どこで䞍具合かを発生させたのか再珟性を確保するのも、非垞に困難だず 思われるが、䞊蚘のコマンド、もしくは、そのようなコマンドの開発の延長䞊に、その困難さが解決できるず期埅できる。 たずえば、珟状、ひず぀のテヌブル(è¡š)に察する機械孊習の様々な手法は開発され䜿われおいるもの、そのテヌブルが2個になった途端急に 難しくなる。実際には、そのようなテヌブルが䜕十も䞎えられたりしおいる。さらに蚀うず、倚くの組織が保管するデヌタは、1぀のテヌブルでも 数十の列が含たれおいるこずで、䞀䜓どれが重芁で、どれがそうでないのか、把握しおいろいろな刀断をするのが困難であるず考えられる。

䞊蚘の様な流れ(1〜5)を手際よく実珟する手段をうたく確立するこずで、䞖の䞭のいろいろなデヌタ凊理やデヌタ分析の問題が解決するであろう。

デヌタ分析の流れに぀いおの曎なる資料

このような流れに぀いお、参考ずなる資料ずしおは、次の2点が䞊げられる。 これらは、本゜フトりェアのUnixコマンド方匏ではなくお、SQLのデヌタベヌスにおけるデヌタプロファむリングの考え方ずしお、䞊蚘の考え方を衚そうず、本文曞の䜜成者が過去に詊みたものである。

今埌の開発蚈画に぀いおのメモ

分析䞊の課題

  1. コマンド矀の提䟛する機胜はただ十分ではない。
  2. 耇数のログファむルで同䞀ナヌザヌがどういう履歎を残したか把握しやすい仕組みがない。

技術䞊の課題

  1. テストが䜜られたこずが無い。
  2. コマンド間で統䞀すべきこずがただ残っおいる。
  3. いく぀かのコマンドは䞀぀に統合すべきである。
  4. いく぀かのコマンドは機胜をバラすべきかも知れない。
  5. 芪切䟿利ずいう芳点で、提䟛したコマンドで差がある。
  6. 蚈算䞭に䜿ったメモリの量を2次情報ずしお出力しおいない。
  7. 着色しお暙準゚ラヌ出力に出す2次的な情報が䞍十分な堎合がある。
  8. perl -T のようなtaint察策が可胜なのに䞍十分なコマンドがある。
  9. ヘルプの文章は日本語が䞻であり、䞖界で䜿われるためには英文の甚意も必芁。
  10. --help で衚瀺されるヘルプの文章ず同じようには、manずperldocで動䜜しない。
  11. Ctrl+Cで割り蟌みシグナルを送るず意味䞍明に芋える動䜜をしうる(Ctrl+Zを䜿っお察凊)。
  12. CPANおよびUnix/Linuxコマンドでコマンド名の衝突を防ぐ仕組みがない。CPANではモゞュヌル名の衝突は起きない仕組みになっおいるが、コマンド名の衝突の起きにくいうたい仕組みを提案したい。

今埌倉曎されうる珟状の仕様

  1. サブコマンド方匏はただ採甚しおいないこず。
  2. 各コマンドの実䜓は独立単䜓で動くPerlプログラムであるこず。
  3. 䞊列化は積極的にしおいないこず。fork関数の䜿甚は怜蚎枈み。
  4. 共通化可胜な郚分はあるが、独自モゞュヌルを䜿っおuseしおいないこず。
  5. 暙準モゞュヌルのみuseしおいるこず。List::MoreUtilsも䜿っおいない。
  6. XSむンタヌフェヌスの未䜿甚。chomp; @F=split/\t/o,$_,-1; の郚分は高速化したい。
  7. Term::ReadKeyを䜿っおいないこず。凊理䞭にシグナル以倖の方法でもキヌ抌䞋の凊理を付けたい。
  8. use 5.014であるこず。srand関数から乱数シヌドを埗るため。もっず叀いシステムでも動䜜させたい。
  9. 環境倉数は䜿っおいないこず。珟状オプションスむッチ("-"で始たる)で各コマンドの動䜜(区切り文字の指定など)。
  10. use Getopt::Stdでのみオプションスむッチ凊理を行っおいるこず。--helpもこれに䟝存。ギリシア文字Ξも-Ξのように䜿いたい。-eを耇数䜿えるgrepのようにしたい。

関連資料

関連するCPANモゞュヌル

珟状(2021幎5月珟圚)、https://metacpan.org/author/TULAMILI にある、モゞュヌル名 Bin::で始たるモゞュヌル8個が関連するCPANモゞュヌルである。

関連蚘事および講挔

このモゞュヌル(もしくはGitHubのこのレポゞトリ)が提䟛するコマンド矀、すなわち、本゜フトりェアは、䞋蚘で解説が講挔や雑誌投皿の圢で過去に行われた。

  1. Web+Press DB 第124å·»(翔泳瀟) 2021幎8月号のPerl Hackers Hub の連茉 第68回目
  2. 映像情報メディア孊䌚の孊䌚誌の2018幎7月号《私の研究開発ツヌル》第100回Table::Hack 衚圢匏デヌタの前分析゜フトりェア
  3. IEEE Big Data 2016 (2016幎12月ワシントンDC)のWorkshop(2nd International workshop on Methodologies to Improve Big Data Projects)での発衚
  4. キダノングロヌバル戊略研究所での経枈物理孊の研究集䌚(2016幎8月29日)での発衚

LICENSE

Same as Perl.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages