今、data.csv(カンマ区切り)として、左から順位、名前、性別という3項目で、10人程度のリストデータがあります。
data.csv(カンマ区切り)を編集するようにしていますが、順位は重複してはならないので、重複していたらエラーを出したいのですが。。。
($rank,$name,$sex) = split(/\,/,$line);
です。
open(IN,"$logfile") || &error("ファイルが開けません");
@lines = <IN>;
close(IN);
# 情報の書換え
foreach $line (@lines) {
($rank,$name,$sex) = split(/\,/,$line);
$line = "$in{'rank'},$name,$sex\n";}
push(@new,$line);
}
# ファイルを更新
open(OUT,">$logfile") || &error("ファイルが開けません");
print OUT @new;
close(OUT);
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
in という名前のハッシュを使っているところからして、cgi-lib.pl を使ってますね?
であれば、
> use strict;
> use warnings;
と
>my %in;
は削除してください。
しかしなんでピンポイントで、条件判定のところだけ
書き換えるということを試さないのでしょうか?
cgi-lib.plは使っていません(^^;
だめみたいです。
「しかしなんでピンポイントで、条件判定のところだけ
書き換えるということを試さないのでしょうか?」
logfileのCSVへのパスをどこに書けばいいのか分からずエラーを聞いたくらいのでレベルでして。。。
試行錯誤しながら作成していますが、「条件判定の所だけ書き換える」という事すら出来ないので・・・
あきらめますありとうございました
No.3
- 回答日時:
まだよくわからんないところがあるんだけど、
4位以下のデータってファイルに出力する必要があるの?
1位から3位までのデータが取れればいいのでしょう?
とりあえず4位以上は重複してもスルーするというだけならこんな感じ?
#1の回答をベースにさせていただきましたが、
スタイルは自分好みのものに変えてますのであしからず。
use strict;
use warnings;
my %in;
my $logfile;
open my $fin, '<', $logfile or &error("ファイルが開けません ($!)");
my @lines = <$fin>;
close $fin;
# 情報の書換え
my %seen;
my @new;
foreach my $line (@lines) {
my ($rank, $name, $sex) = split q{,} ,$line;
$line = "$in{'rank'},$name,$sex\n";
if ($seen{$rank}++ && $rank < 4) {
&error("$rankは設定されています<br>現在の$rankをランク外にしてから再度設定してください。");
}
push @new, $line;
}
# ファイルを更新
open my $fout, '>', $logfile or &error("ファイルが開けません ($!)");
print $fout @new;
close $fout;
この回答への補足
当方、全くの素人でして。。。
とりあえず、regist.cgiで、$rank, $name, $sexを入力。
edit.cgiで$rankだけ編集。
search.cgiで1位、2位、3位だけ表示としています。
ですので、edit.cgiで編集する際は全員のデータを編集するしか方法が分かりませんでした。。。
今、ご教授頂いたソースで実行すると、ファイルが開けません (No such file or directory) となってまいました。。。(^^;
No.2
- 回答日時:
>順位は重複してはならないので、重複していたらエラーを出したい
というのに
>4位以下は"9"としています(^^;
という条件がついてるのがよくわかりません。
もう少し具体的なデータを例示したほうがよいように思います。
1~3位の中でだけ重複があるかどうかをチェックすればいい話なのか
順位のデータは'9' になっているけど別のフィールドを見てから
重複しているかどうかを判定しなければならないかとか。
この回答への補足
すみません。わかりにくくて・・・
合計20名~25名の名前と順位をCSVデータにして、
上位3位だけranking.cgiとしてCGIで表示するようにしています。
edit.cgiでCSVを編集する際には、上位3名だけ、1,2,3としていして、ランキング外のデータは全部4以上にして表示しないようにすれば完成なんですが。。。
1~3位まで重複チェックをして、ランク外は重複チェックしなくていいのです(^^;
No.1
- 回答日時:
「順位をキーとするハッシュ」を使うのが標準的かなぁ.
例えば %seen というハッシュに対して
$seen{$rank}++;
とすると, 既に $rank と同じ値を持つデータが出ていれば 0 以外の値が返りますし, そのようなデータがまだなければ 0 を返します.
だから
if ($seen{$rank}++) {
当該データは既出
}
という形で処理できます.
この回答への補足
ありがとうございます(^^;
下記のように明記しましたが、すみません。私の明記不足でした(^^;
上位1位、2位、3位だけデータに1,2,3と入っていて、4位以下は"9"としています(^^;
下記のように変更して実行すると、どの作業でも「設定されています」となってしまいます。
open(IN,"$logfile") || &error("ファイルが開けません");
@lines = <IN>;
close(IN);
# 情報の書換え
foreach $line (@lines) {
($rank,$name,$sex) = split(/\,/,$line);
$line = "$in{'rank'},$name,$sex\n";}
if ($seen{$rank}++) { &error("$rankは設定されています<br>現在の$rankをランク外にしてから再度設定してください。");}
push(@new,$line);
}
# ファイルを更新
open(OUT,">$logfile") || &error("ファイルが開けません");
print OUT @new;
close(OUT);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Java javaのCSVデータ読込についてです 6 2022/07/02 10:58
- Ruby パイソンエラーについて 1 2022/12/24 14:07
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Outlook(アウトルック) 【 Windows 10 】アドレス帳に正しくインポートを完了させたい。 3 2023/04/23 13:41
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
Perlの初心者です。2重ループ...
-
Argument "\\\\n" isn't numeri...
-
Perlで空白行を削除
-
pythonでの実績データの処理プ...
-
CSVファイルのデータの行数を取...
-
エクセルVBA コードが同じでも...
-
ExcelをCSV書き出す場合のシー...
-
空白文字 \\f と\\v の違いに...
-
python renameについて
-
batファイルでrenameができませ...
-
HTTP::Request::Common qw(POST...
-
close()で例外が投げられる理由
-
openした後、closeしないでプロ...
-
VBAでCSVファイルの特定行を書...
-
バッチファイルの作り方(CSV→...
-
Pythonでegrep機能をつかいたい
-
パスから最後のディレクトリだ...
-
複数ファイルの読み込みについて
-
csvで順番の入れ替え
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
Perlの初心者です。2重ループ...
-
ディレクトリ内のtxtファイル中...
-
Perlで空白行を削除
-
perlでcsvファイルを読む(ダブ...
-
Perlを利用してテキストフ...
-
ファイルの3行目までを出力したい
-
foreachの制御
-
Java CSVファイルをカンマごと...
-
Argument "\\\\n" isn't numeri...
-
エラーチェック、ファイルに特...
-
CSVデータの編集の際の重複チェ...
-
FTP接続時失敗時、接続先名をcs...
-
CSVファイルのデータの行数を取...
-
cgiのログの書き方
-
MATLAB std::exceptionエラー
-
VBAでCSVファイルを途中行まで...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
バッチファイルの作り方(CSV→...
おすすめ情報