アプリ版:「スタンプのみでお礼する」機能のリリースについて

cgiログファイルを読み出して下記の様に任意に行数を指定して挿入する方法を教えていただければと思います。
何分、素人なので、その辺りを踏まえて教えていただければ助かります。また、サンプルの様なものがあればご参照お願い致しますm(__)m

[例]
行数・内容
1**************
2//////////////
3++++++++++++++
4--------------
5==============
6##############

上記の状態のログファイルがあるとし、任意の行数(例えば)行数[5]を行数[2]に挿入した場合

[例]
行数・内容
1**************
2==============
3//////////////
4++++++++++++++
5--------------
6##############

と保存しなおす様に出来ますでしょうか?

分かりにくい説明で申し訳ございません。よろしくお願い致します。

よろしくお願い致しますm(__)m

A 回答 (3件)

例えばこんな感じですか?



#!/usr/local/bin/ruby
require "cgi"
target_filename = "program_data.txt"

def insert_line_before(lines, from, to)
to_insert = lines.delete_at(from)
to -= 1 if from < to
lines.insert(to, to_insert)
end

def modify_file(filename, from, to)
f = File.open(filename, File::RDWR)
f.flock(File::LOCK_EX)
lines = f.readlines
insert_line_before(lines, from, to)
f.rewind
f.write(lines)
f.truncate(f.pos) # may not be needed.
f.close
return lines
end

print "Content-type: text/html\n\n"

cgi = CGI.new
from = cgi.params['from'][0]
to = cgi.params['to'][0]

if from.to_i >= 1 and to.to_i >= 1 then
modify_file(target_filename, from.to_i - 1, to.to_i - 1)
print "<html><body>done</body></html>"

else
print "<html><head><title>Insert test</title></head><body>"
print "<ol>"
f = open(target_filename, "r") {|file|
file.flock(File::LOCK_SH)
while line = file.gets
printf "<li>%s</li>", line
end
}
print "</ol>"

print <<EOS
<form method="POST">
Move the line [<input type="text" name="from">]
before the line [<input type="text" name="to">].
<input type="submit">
</form></body></html>"
EOS
end


insert_line_before(lines, from, to)で全ての行が入った配列を受け取って、from行番目の文字列をto番目の行の前に挿入します。fromの方がtoよりも小さい場合はfromの部分を抜いたことでtoのところの位置が変わっているので、そのぶん減算します。また、modify_file(filename, from, to)はこのinsert_line_beforeを使うことで、ファイルを開いて指示された変更を行います。

余談ですが、このコアな部分をPerlで書くとこんな感じです。
sub insert_line {
my ($lines, $insert_from, $insert_to) = @_;
my @to_insert = splice(@$lines, $insert_from, 1);
$insert_to -= 1 if $insert_from < $insert_to;
splice(@$lines, $insert_to, 0, @to_insert);
}
    • good
    • 0

各行の長さがばらばらなら、一旦メモリに読み込み→該当箇所の入れかえ→再書き込みが基本です。



CGIというのは仕組みの名前で、特定のプログラム言語や環境を表したものではありません。
例と言われても提示しようがありません
    • good
    • 0

my @lines = <DATA>;


my $line = splice @lines, 4, 1;
splice @lines, 1, 0, $line;

print $_ for @lines;
# **************
# ==============
# //////////////
# ++++++++++++++
# --------------
# ##############

__DATA__
**************
//////////////
++++++++++++++
--------------
==============
##############

この回答への補足

早速のお返事ありがとうございます。

data.cgi

というログファイルから読み込み、htmlで
<form method="post" action="data.cgi">
移動する行数<input type="text" name="a" value="" />
移動先の行数<input type="text" name="b" value="" />
<input type="submit" value="挿入" /></from>

という形で書き換え、data.cgiに上書きする方法はどうすれば良いですか?

分かりにくいご説明で申し訳ございません。

お手数とは存じますがよろしくお願い致します。

補足日時:2011/11/06 08:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!