- ベストアンサー
Perlで指定行への書き込みを行う方法
- Perlを使用して指定行への書き込みを行いたいですが、具体的にどのようにすればいいでしょうか。
- データをカンマ区切りで保存し、常に5行目を上書きする方法を教えてください。
- 指定した行にデータを書き込むPerlの方法を教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
ファイルというものは、原稿用紙のマス目にぎっちり文字を書くようなものだと思ってください。 途中を書き換える、というのは、消しゴムで消して書きなおすようなものです。 元と同じ文字数なら、消したところに書くだけですが、元より短かければその分が空いたままになるし、長ければマスが足りません。 ワープロやエディタのように空きを詰めたり、後へずらしたりしません。 自分で前や後へ書き写す必要があるのです。
その他の回答 (6)
- kmee
- ベストアンサー率55% (1857/3366)
まずは、問題を分割しましょう。 今ある問題というのは (1) フォームのチェックボックスに設定した内容を特定の文字列(カンマ区切り)にしたい (2) (1)の文字列を目的のファイルの特定の箇所に挿入したい:例えば5行目を差し替えたい (3)(1)→(2)というのがたくさんある。どうやって使いわけるのがいいか ..... となるのではないでしょうか? > チェックボックスが空欄な列は、記録されず、,2,4,6と、チェックの入った部分だけが記録されます。 というのは、(1)の問題では?
お礼
ありがとうございます。 if (column[0] eq 1 || column[1] eq 1 ・・・というかたちで、 カラムを全部設定して、1 があればcheckd という形にして、解決しました。 しかしビックリするほど長いプログラムになってしまいました。
- Tacosan
- ベストアンサー率23% (3656/15482)
そうですね, 記録しておくファイルが「テキスト」でなくてもいいならデータベースという方針もありましたね>#4. 「空欄の部分に任意の文字を入れたい」というなら, それは「そのまま」プログラムにすればいい. 現状どんなふうにしていてどう困っているのかは知らんが.
- kuroizell
- ベストアンサー率55% (95/170)
略さず書くと open my $fh, "<", "file.txt" or die $!; open my $out, ">", "output.txt"; while (<$fh>) { if ($. == 5) { print $out $what_do_you_wish_to_write_here; } else { print $out $_; } } close $fh; close $out; ということで、#1の全部書き変える方法の事です。 チェックボックス云々はごめんなさい、理解できませんでした。
- kmee
- ベストアンサー率55% (1857/3366)
このプログラムと「常に5行目」と「チェックボックスで更新」の関連がよくわからないんですが。 特定の顧客のデータを変更したい、5行目というのが「顧客番号5番(仮)」で常に5番とは限らない、というのなら、 全体を読み込み→該当行を変更→全部書き戻す(#1にあった方法)が常套手段だと思いますよ。 また、1人1ファイルというのも手段の一つです。 データベースを使うのも手ですし。
お礼
ありがとうございます。 全体を読み込み→該当行を変更→全部書き戻すを選択した時に、 チェックボックスにて読み込む作業をしたいのですが、 なかなかできません。 たとえば、50人の社員が各々30人の顧客を持っている場合、担当者分50枚のファイルを作成(中に30人の顧客データ)して読み書きをしたいのですが。 どのようにしたら良いでしょうか。ファイルをチェックボックスの形式で読み込んで、全部書き換える感じです。 よろしくお願いします。
補足
申し訳ありません。 チェックボックスでの読み込みは不完全ながらできました。 しかし、上記のプログラムですと、チェックボックスが空欄な列は、記録されず、 ,2,4,6と、チェックの入った部分だけが記録されます。 空欄の部分に任意の文字を入れたいのですが、どのようにしたら良いでしょうか。たとえば、空欄には0を、もしくは、空欄であれば""をといった感じです。 よろしくお願いします。
- kuroizell
- ベストアンサー率55% (95/170)
適当なファイルハンドル開いて、 print FH $str if $. == 5; それより、スクリプトが10年以上前にはもう止めになった書き方なので、 use CGI; my $q = CGI->new; my $name = $q->escapeHTML( $q->param('name') ); とかにした方が。。。 ファイル上書きじゃなくて、Text::Xslateとかのテンプレートエンジン使って 更新したい部分に値を投げてやるのがイマドキかと思います。
補足
open( WRITE, "+< $file" ); print WRITE $str if $. == 5; print WRITE $FORM{'name'},",",$FORM{'color1'}."\n"; close(WRITE); ということでしょうか・・? 何かうまくいきません。
- Tacosan
- ベストアンサー率23% (3656/15482)
行の長さが一定なら seek とか. そうでなければあきらめて全部読み込んで必要なところを書き換え全部出力.
補足
行の長さは一定ではないんです。 空欄での送信でも カンマカンマで保存されます。 逆に空欄の場合0とか、任意の文字を入れるのは可能でしょうか
補足
ありがとうございます。 そうですか。難しそうですね。 すると、例えば500人の顧客プロフィールの作成にあたり、 チェックボックスで毎回更新する為には、 500枚の書き込み用.txtファイルが必要ということでしょうか。 よろしくおねがいします。