最近、XML、HTMLファイルをあれこれする事が増えてきた気がする。ファイルに書き込んだり、読みこんだりするときの入出力に関するメモ。
まずは、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);
}
?>
ファイル全体を一度に処理したい場合は、fileやfile_get_contentsを利用すればいい。
データが、欲しいときに、欲しい形であるとは、限らない。 配列、文字列、ファイルなどにある情報を適当な形にしたい時。
これらの関数で、配列と文字列が変換できる。
大き目のデータをキャッシュとしてファイルに保存しておいて、あとでも利用するときなど、ファイルを使っていろいろするとき (ファイルからデータを読み込む場合と、すでに文字列などでデータをもっていてそのまま使いたい場合の両方があるときとか)。
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 入出力ストリーム。
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を省略することもできる。
配列->文字列は、joinで。
p ["a", "b", "c"].join(',') #=> "a,b,c"
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オブジェクトを使うと、文字列のデータを、IOオブジェクトとして扱うことが簡単にできる。
require 'stringio'
str = << EOF
data1
data2
data3
EOF
io =StringIO.new(str)
#io.puts(str)
io.rewind
p io.read
カテゴリー [ Ruby ] [ メモ・覚え書き ] [ PHP ]
|
|
1.
|
|
|
2.
|
|
|
3.
|
|
|
4.
|
|
|
5.
|
|
|
6.
|
|
|
7.
|
このエントリーのトラックバックURL: