テキストファイルの分割と操作

Excelのような表形式のものばかりに見慣れていると、画面の左側に行数が出ているので、次のようなことも単独のCSVファイル(*.csv)やテキストファイル(*.txt,*.logなど)に対しても簡単にできるものだと思い込んでしまう。
LOG
203.106.214.248 [12/Sep/2016:08:46:52] CSVファイルの最終行から一定行を読み込むには
126.122.86.150 [03/Sep/2016:22:46:41] マクロ 最終行から3行選択
こういうことはテキストファイルでは一度でストレートに実行することはできない。テキストファイルでは原則としてシーケンシャルなファイル処理になる。※※行目を直接指定して、ピンポイントでその行のデータだけを取り出したり書き換えたり削除したりすることはできない。バイナリファイルのように何バイト目を指定して直接ピンポイントで操作できるのとは異なる。

他に何の付随的なデータ1)もないフラットなテキストファイルで、上のようなことをするには次のような手順になる。
  1. まずファイルを初めから終わりまで全部読み込んで、それが全部で何行あるかをまず確定する。
  2. そこで、読み込む開始位置が先頭から何行目になるかを調べる。
  3. その後に、ファイルの先頭に戻って同じような読み込みをする。その行位置までデータを「カラ読み」して、指定位置にきたら読み込みを始める。
  4. ただし、これでできるのは指定行の読み込みだけである。書き換えたりすることはできない。
何の特徴もない不定型なテキストファイル2)を処理するのは文字通り二重手間になる。要するに煩雑になって面倒なのである。
NOTES
1) 1行目の行頭のバイト位置、2行目の行頭のバイト位置、3行目の行頭のバイト位置、4行目の行頭のバイト位置、・・・など全行にわたるデータを事前に記録したインデックスファイルを別に作成しておいて、234行目の行頭は※※バイト目だから、そこに直接シークする(飛んでいく)ことは可能である。
2) Excelなどのシート上のテキストではない。

こういうことは常識だが、エクセルバカにはそんな常識はもともとない(無知)。


ファイルを処理する能力も知識もないエクセルバカがなぜ「CSV」という語のあるトピックにハエのように飛んでくるのか。その理由が最近やっとわかってきた。エクセルバカの言う「CSV」はCSVファイル(*.csv)のことではない。Excelのシート(上のデータ)のことだったのである。要するに、シード上のデータを何かしたいというだけのことである。しかし、この「習性」を逆にとれば、「CSV」という語を入れておくだけで半永久的にエクセルバカを呼び込むことができることになる。もっとも、こんなバカが飛んできても意味はないが、枯れ木も山のにぎわい程度の利用価値はあるかもしれない。


テキストファイルの分割

こういう場合、ファイルを分割しておけば、特定の行のデータを取り出すことが「やや簡単」になる。ただし、分割が必要になるようなテキストファイルはほとんどないと思われる。そんなに長いテキストファイルは普通は作らないからである。

これは指定したテキストファイルを指定した行数ごとに分割するツールである(textcut.exe)。巨大なテキストファイルの代表はログファイルである。これは分割するのに適当かもしれない。


分割対象がバイナリファイルの場合は元々その中身を見ることは無意味なので拡張子を連番にするのが普通である。
access.000 , access.001 , access.002, など。

テキストファイルの場合は分割しても普通に見ることができるので連番の付け方をこのようにした。

使い方
textcut [分割するファイル名] [分割する行数]

分割後のファイル名は、元がテキストファイルであることを尊重して、次のようにした。
元のファイル名のファイルボディと拡張子はそのまま使う。ファイルボディの後に0起算の「_連番」を入れる。
access.log → access_000.log , access_001.log , access_002.log , ... になる。
sample.csv → sample_000.csv , sample_001.csv , sample_002.csv , ... になる。

ここでは連番の最初を000にしたが、001にすることも可能である。

また、この場合は単純に分割しただけだが、分割したファイルの先頭などに「★これはaccess.logの分割ファイルのNo.004です。」などというテキストを埋め込むこともできる。
下記のソース(ccp_0263)の中にある「★行頭に文字列を付加する場合」のところのコメント記号を削除すればよい。ただし、これを挿入した場合、ファイルの行数は「分割指定行数+1」行になる(当然)。


- 2016/09/14 -





ログファイルの分割(tpc_0304)
ネットダニ対策/ログファイルの日付別切り分け(tpc_0466)


テキストファイルの行単位での分割(ccp_0263)


タコの殿堂
CSVって語があるとすぐにエクセルバカの野良犬が嗅ぎつけてくるわね。
CSVに寄ってくる 人目のオバカ(since 2018/06/17)。