LoginSignup
6
3

More than 5 years have passed since last update.

【D言語】std.file標準実装のslurp関数でデータを一気飲みする

Last updated at Posted at 2016-12-18

はじめに

D言語の機能をいろいろと試している初心者です.CからDに入った人なので「それ,C++でよくない?」といったこともDで書いて喜んだりしていることもありますが暖かく見守っていただけると幸いです.

slurp

ファイル入出力,データハンドリングに関してはD言語の標準ライブラリが大いに活躍します.
今回はstd.fileに含まれるslurp関数を試しました.これは指定したフォーマットに則ってファイルからデータをとりあえず全部吸い上げ変数に格納してしまうというものです.Cで書こうものならこれだけでかなりの分量になってしまいそうな機能を一行で実装可能な優れものだと思います.

簡単な例として,double型のデータが並んでいる

100.34
145.763
198.5
  .
  .
  .

のようなファイルを読み込む場合,コードは

auto input_data = slurp!(double)("test.txt", "%s");

となります.

1 50.43
2 12.145
3 19.76
   .
   .
   .

のようにデータ番号(int)とデータ(double)が並んでいるようなテキストを読み込む場合は,

auto input_data = slurp!(int, double)("test.txt", "%s %s");

このようになります.!(Types...)でデータを格納する際の型を指定,続く(string filename, string format)で読み込むファイルとフォーマットを指定します.データを格納する変数の型をautoで宣言できることや異なる型のデータをタプルとして束ねられることといったD言語の特徴が活きています.
input_data変数はデータ型が一つだけのときは与えられた型の配列に,複数あるときはタプルの配列(※タプルの配列,という表現が厳密に正しいのか不安.間違っていたらご教授願います)になります.

格納したデータへは添字でアクセスできます.

writeln(input_data[0]);
出力
100.34    //値の配列の場合

Tuple!(int, double)(1, 50.43)    //タプルの配列の場合

タプルなので,それぞれ要素に名前をつけることができます.データの各要素へのアクセスがしやすくなります.

auto input_data = slurp!(string, "name", int, "age")("test.txt", "%s %s");
for(int i=1; i < input_data.length; i++){
    writeln(input_data[i].name);
}

iCalendarへの出力へ第一歩

タスク管理ツールで作成したタスクをiCalendarに同期するツールを作っています.具体的な内容については自分のブログの方で記事にするつもりです.以前にもテキストファイルからデータを読み込み別のフォーマットに変換して出力するプログラムをDで書いたたことがありますが,非常にシンプルに書けるのでstd.fileライブラリはありがたいですね.

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3