エントリー名 :

PHP,Rubyでの入出力まわり(文字列、ファイル、ストリーム)

PHP,Rubyでの入出力まわり(文字列、ファイル、ストリーム)

最近、XML、HTMLファイルをあれこれする事が増えてきた気がする。ファイルに書き込んだり、読みこんだりするときの入出力に関するメモ。

PHP

参考。PHP: ファイルシステム関数 - Manual

まずは、fopenや、fsockopenで、ファイルポインタを取得する。

ファイルをすこしずつ読み込んでいく場合は、ファイルポインタから、 fgets(ファイルポインタから1行取得)、 fread(バイナリ・モードでファイルを読み込む)、 fgetcsv(CSV用)、 などを使う。書き込みは、fwriteで。

<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}
?>

ファイル全体を一度に処理したい場合は、filefile_get_contentsを利用すればいい。

文字列と配列の変換

データが、欲しいときに、欲しい形であるとは、限らない。 配列、文字列、ファイルなどにある情報を適当な形にしたい時。

  • explode文字列を文字列により分割する->配列
  • split正規表現により文字列を分割し、配列に格納する->配列
  • implode配列要素を文字列により連結する->文字列

これらの関数で、配列と文字列が変換できる。

ストリーム

大き目のデータをキャッシュとしてファイルに保存しておいて、あとでも利用するときなど、ファイルを使っていろいろするとき (ファイルからデータを読み込む場合と、すでに文字列などでデータをもっていてそのまま使いたい場合の両方があるときとか)。

1.ファイルから読み込んだデータを加工して、適当な形(文字列とか)にしてから、処理に回す。

2.文字列を、ポインタを使って、ファイルからデータを読み込む場合と同じ処理にまわす。参考、データ (RFC 2397)

<?php
$TEXT =<<<EOF
data1
data2
data3
EOF;
$handle = fopen("data://text/plain,$TEXT", 'r');
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}

?>

PHP 5.1.0 以降なら、 php://memory とか、 php://tempも使えるみたいです。 PHP 入出力ストリーム

Ruby

Fileや、IOクラスを使う。

openや、 File.openで返されるオブジェクトを操作する。

filename = "data.txt"
file = open(filename)
#file = File.open(filename)
text = file.read(file)
print text
file.close

ファイルを一度に読む場合、クラスメソッドを使って

data = File.read("foo.txt")

ともできる。

ファイルを一行ずつ読む場合は、

filename = "data.txt"
file = open(filename)
while text = file.gets do
	print text
end
file.close

のようにする。あるいは、

filename = "data.txt"
open(filename){|io|
	while line = io.gets
	print text
	end
}

のように、closeを省略することもできる。

Ruby メモ

  • HTTPやFTPからファイルを開きたいときは、open-uriを使う。
  • io.readlinesで、ファイルの各行を配列として取得できる。
  • io.eachとeachメソッドが使える
  • 出力は、io.write,io.print,io.printf,io << strなど。
  • io.rewindでファイルポインタを先頭にできる。

配列と文字列

配列->文字列は、joinで。

p ["a", "b", "c"].join(',') #=> "a,b,c"

文字列->配列は、splitscanで。

p "   a \t  b \n  c".split(/\s+/) # => ["", "a", "b", "c"]
p "foobarbazfoobarbaz".scan(/ba./)
# => ["bar", "baz", "bar", "baz"]

%wで、空白で分割して配列を作れる。

p %w(a b c) # => ["a", "b", "c"]

StringIO

StringIOオブジェクトを使うと、文字列のデータを、IOオブジェクトとして扱うことが簡単にできる。

require 'stringio'
str = << EOF
data1
data2
data3
EOF
io =StringIO.new(str)
#io.puts(str)
io.rewind
p io.read

PHP,Rubyでの入出力まわり(文字列、ファイル、ストリーム)の前後の記事

カテゴリー [ Ruby ] [ メモ・覚え書き ] [ PHP ]



アマゾン(Amazon.co.jp) Ruby

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

1. 本 「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

[2010-04-10)]作者:小森 裕介 。レーベル:技術評論社 。製造:技術評論社 。出版:技術評論社 。発売:技術評論社。関連:体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

WEB+DB PRESS 総集編 [Vol.1~60]

2. 本 WEB+DB PRESS 総集編 [Vol.1~60]

[2011-10-15)]作者:森田 創 。レーベル:技術評論社 。製造:技術評論社 。出版:技術評論社 。発売:技術評論社。関連:WEB+DB PRESS Vol.66

よくわかるPHPの教科書

3. 本 よくわかるPHPの教科書

[2010-09-14)]作者:たにぐち まこと 。レーベル:毎日コミュニケーションズ 。製造:毎日コミュニケーションズ 。出版:毎日コミュニケーションズ 。発売:毎日コミュニケーションズ。関連:PHP 逆引きレシピ (PROGRAMMER’S RECiPE)

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

4. 本 体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

[2011-03-03)]作者:徳丸 浩 。レーベル:ソフトバンククリエイティブ 。製造:ソフトバンククリエイティブ 。出版:ソフトバンククリエイティブ 。発売:ソフトバンククリエイティブ。関連:「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

アジャイルサムライ−達人開発者への道−

5. 本 アジャイルサムライ−達人開発者への道−

[2011-07-16)]作者:Jonathan Rasmusson 。レーベル:オーム社 。製造:オーム社 。出版:オーム社 。発売:オーム社。関連:アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~

JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで

6. 本 JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで

[2010-11-27)]作者:山田 祥寛 。レーベル:技術評論社 。製造:技術評論社 。出版:技術評論社 。発売:技術評論社。関連:Web制作の現場で使う jQueryデザイン入門 (WEB PROFESSIONAL)

Ruby on Rails 3 アプリケーションプログラミング

7. 本 Ruby on Rails 3 アプリケーションプログラミング

[2011-05-12)]作者:山田 祥寛 。レーベル:技術評論社 。製造:技術評論社 。出版:技術評論社 。発売:技術評論社。関連:たのしいRuby 第3版

2

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)



このエントリーのトラックバックURL:

アーカイブ

コメント

トラックバック

広告

あわせて読みたい

あわせて読みたい